/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at . */ "use strict"; const { generatedToOriginalId, } = require("resource://devtools/client/shared/source-map-loader/utils/index.js"); const sourceMapRequests = new Map(); function clearSourceMaps() { for (const [, metadataPromise] of sourceMapRequests) { // The source-map module leaks memory unless `.destroy` is called on // the consumer instances when they are no longer being used. metadataPromise.then( metadata => { if (metadata) { metadata.map.destroy(); } }, // We don't want this to cause any unhandled rejection errors. () => {} ); } sourceMapRequests.clear(); } /** * For a given generated source, retrieve an object with many attributes: * @param {String} generatedSourceId * The id of the generated source * * @return {Object} Meta data object with many attributes * - map: The SourceMapConsumer or WasmRemap instance * - urlsById Map of Original Source ID (string) to Source URL (string) * - sources: Array of object with the two following attributes: * - id: Original Source ID (string) * - url: Original Source URL (string) */ function getSourceMapWithMetadata(generatedSourceId) { return sourceMapRequests.get(generatedSourceId); } /** * Retrieve the SourceMapConsumer or WasmRemap instance for a given generated source. * * @param {String} generatedSourceId * The id of the generated source * * @return null | Promise */ function getSourceMap(generatedSourceId) { const request = getSourceMapWithMetadata(generatedSourceId); if (!request) { return null; } return request.then(result => result?.map); } /** * Record the SourceMapConsumer or WasmRemap instance for a given generated source. * * @param {String} generatedId * The generated source ID. * @param {Promise} request * A promise which should resolve to either a SourceMapConsume or WasmRemap instance. */ function setSourceMap(generatedId, request) { sourceMapRequests.set( generatedId, request.then(map => { if (!map || !map.sources) { return null; } const urlsById = new Map(); const sources = []; let ignoreListUrls = []; if (map.x_google_ignoreList?.length) { ignoreListUrls = map.x_google_ignoreList.map( sourceIndex => map.sources[sourceIndex] ); } for (const url of map.sources) { const id = generatedToOriginalId(generatedId, url); urlsById.set(id, url); sources.push({ id, url }); } return { map, urlsById, sources, ignoreListUrls }; }) ); } module.exports = { clearSourceMaps, getSourceMapWithMetadata, getSourceMap, setSourceMap, };