diff options
Diffstat (limited to 'devtools/client/shared/source-map-loader/utils/sourceMapRequests.js')
-rw-r--r-- | devtools/client/shared/source-map-loader/utils/sourceMapRequests.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/devtools/client/shared/source-map-loader/utils/sourceMapRequests.js b/devtools/client/shared/source-map-loader/utils/sourceMapRequests.js new file mode 100644 index 0000000000..49ceecd71a --- /dev/null +++ b/devtools/client/shared/source-map-loader/utils/sourceMapRequests.js @@ -0,0 +1,106 @@ +/* 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 <http://mozilla.org/MPL/2.0/>. */ + +"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<SourceMapConsumer | WasmRemap> + */ +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<SourceMapConsumer or WasmRemap>} 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, +}; |