forked from firefox-devtools/debugger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfetchSourceMap.js
More file actions
102 lines (80 loc) · 3.13 KB
/
Copy pathfetchSourceMap.js
File metadata and controls
102 lines (80 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* 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/>. */
// @flow
const { networkRequest } = require("devtools-utils");
const { getSourceMap, setSourceMap } = require("./sourceMapRequests");
const { WasmRemap } = require("./wasmRemap");
const { SourceMapConsumer } = require("source-map");
const { convertToJSON } = require("./convertToJSON");
const { createConsumer } = require("./createConsumer");
import type { Source } from "debugger-html";
// URLs which have been seen in a completed source map request.
const originalURLs = new Set();
function clearOriginalURLs() {
originalURLs.clear();
}
function hasOriginalURL(url: string): boolean {
return originalURLs.has(url);
}
function _resolveSourceMapURL(source: Source) {
const { url = "", sourceMapURL = "" } = source;
if (!url) {
// If the source doesn't have a URL, don't resolve anything.
return { sourceMapURL, baseURL: sourceMapURL };
}
const resolvedURL = new URL(sourceMapURL, url);
const resolvedString = resolvedURL.toString();
let baseURL = resolvedString;
// When the sourceMap is a data: URL, fall back to using the
// source's URL, if possible.
if (resolvedURL.protocol == "data:") {
baseURL = url;
}
return { sourceMapURL: resolvedString, baseURL };
}
async function _resolveAndFetch(generatedSource: Source): SourceMapConsumer {
// Fetch the sourcemap over the network and create it.
const { sourceMapURL, baseURL } = _resolveSourceMapURL(generatedSource);
let fetched = await networkRequest(sourceMapURL, { loadFromCache: false });
if (fetched.isDwarf) {
fetched = { content: await convertToJSON(fetched.content) };
}
// Create the source map and fix it up.
let map = await createConsumer(fetched.content, baseURL);
if (generatedSource.isWasm) {
map = new WasmRemap(map);
// Check if experimental scope info exists.
if (fetched.content.includes("x-scopes")) {
const parsedJSON = JSON.parse(fetched.content);
map.xScopes = parsedJSON["x-scopes"];
}
}
if (map && map.sources) {
map.sources.forEach(url => originalURLs.add(url));
}
return map;
}
function fetchSourceMap(generatedSource: Source): SourceMapConsumer {
const existingRequest = getSourceMap(generatedSource.id);
// If it has already been requested, return the request. Make sure
// to do this even if sourcemapping is turned off, because
// pretty-printing uses sourcemaps.
//
// An important behavior here is that if it's in the middle of
// requesting it, all subsequent calls will block on the initial
// request.
if (existingRequest) {
return existingRequest;
}
if (!generatedSource.sourceMapURL) {
return null;
}
// Fire off the request, set it in the cache, and return it.
const req = _resolveAndFetch(generatedSource);
// Make sure the cached promise does not reject, because we only
// want to report the error once.
setSourceMap(generatedSource.id, req.catch(() => null));
return req;
}
module.exports = { fetchSourceMap, hasOriginalURL, clearOriginalURLs };