Files
sousa-gecko/devtools/client/shared/source-map-loader/utils/sourceMapRequests.js
T
Alexandre Poirot 9677d792ee Bug 1971817 - [devtools] Clear the source map loader when removing sources. r=devtools-reviewers,bomsy
If a worker thread was using source maps, we weren't clearing the source map worker.
This will also be important when removing pretty printed source in order to stop
having the minimized source to be mapped when we disable pretty print.

Differential Revision: https://phabricator.services.mozilla.com/D255805
2025-07-28 15:29:35 +00:00

110 lines
3.0 KiB
JavaScript

/* 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();
for (const url of map.sources) {
const id = generatedToOriginalId(generatedId, url);
urlsById.set(id, url);
}
return { map, urlsById };
})
);
}
/**
* Clear any existing SourceMapConsumer or WasmRemap instance for a given list of generated source.
*
* @param {Array<String>} generatedIds
* The generated source ID's.
*/
function clearSourceMapForSources(generatedIds) {
for (const generatedId of generatedIds) {
sourceMapRequests.delete(generatedId);
}
}
module.exports = {
clearSourceMaps,
getSourceMapWithMetadata,
getSourceMap,
setSourceMap,
clearSourceMapForSources,
};