miniflare 0.0.0-0435d8ef5 → 0.0.0-05973bba4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.d.ts +1 -15
- package/dist/src/index.js +14 -472
- package/dist/src/index.js.map +3 -3
- package/package.json +3 -4
package/dist/src/index.js
CHANGED
|
@@ -628,7 +628,7 @@ __export(src_exports, {
|
|
|
628
628
|
deserialiseRegExps: () => deserialiseRegExps,
|
|
629
629
|
deserialiseSiteRegExps: () => deserialiseSiteRegExps,
|
|
630
630
|
encodeSitesKey: () => encodeSitesKey,
|
|
631
|
-
fetch: () =>
|
|
631
|
+
fetch: () => fetch3,
|
|
632
632
|
formatZodError: () => formatZodError,
|
|
633
633
|
getAccessibleHosts: () => getAccessibleHosts,
|
|
634
634
|
getAssetsBindingsNames: () => getAssetsBindingsNames,
|
|
@@ -770,7 +770,7 @@ function zod_worker_default() {
|
|
|
770
770
|
}
|
|
771
771
|
|
|
772
772
|
// src/index.ts
|
|
773
|
-
var
|
|
773
|
+
var import_ws3 = require("ws");
|
|
774
774
|
var import_zod23 = require("zod");
|
|
775
775
|
|
|
776
776
|
// src/cf.ts
|
|
@@ -2359,7 +2359,7 @@ function headersFromIncomingRequest(req) {
|
|
|
2359
2359
|
);
|
|
2360
2360
|
return new undici.Headers(Object.fromEntries(entries));
|
|
2361
2361
|
}
|
|
2362
|
-
async function
|
|
2362
|
+
async function fetch3(input, init2) {
|
|
2363
2363
|
const requestInit = init2;
|
|
2364
2364
|
const request = new Request(input, requestInit);
|
|
2365
2365
|
if (request.method === "GET" && request.headers.get("upgrade") === "websocket") {
|
|
@@ -2558,8 +2558,8 @@ function valueOrFile(value, filePath) {
|
|
|
2558
2558
|
var import_os = require("os");
|
|
2559
2559
|
function getAccessibleHosts(ipv4Only = false) {
|
|
2560
2560
|
const hosts = [];
|
|
2561
|
-
Object.values((0, import_os.networkInterfaces)()).forEach((
|
|
2562
|
-
|
|
2561
|
+
Object.values((0, import_os.networkInterfaces)()).forEach((net2) => {
|
|
2562
|
+
net2?.forEach(({ family, address }) => {
|
|
2563
2563
|
if (family === "IPv4" || family === 4) {
|
|
2564
2564
|
hosts.push(address);
|
|
2565
2565
|
} else if (!ipv4Only) {
|
|
@@ -11884,7 +11884,6 @@ var CoreOptionsSchemaInput = import_zod12.z.intersection(
|
|
|
11884
11884
|
rootPath: UnusableStringSchema.optional(),
|
|
11885
11885
|
compatibilityDate: import_zod12.z.string().optional(),
|
|
11886
11886
|
compatibilityFlags: import_zod12.z.string().array().optional(),
|
|
11887
|
-
unsafeInspectorProxy: import_zod12.z.boolean().optional(),
|
|
11888
11887
|
routes: import_zod12.z.string().array().optional(),
|
|
11889
11888
|
bindings: import_zod12.z.record(JsonSchema).optional(),
|
|
11890
11889
|
wasmBindings: import_zod12.z.record(import_zod12.z.union([PathSchema, import_zod12.z.instanceof(Uint8Array)])).optional(),
|
|
@@ -11917,7 +11916,7 @@ var CoreOptionsSchema = CoreOptionsSchemaInput.transform((value) => {
|
|
|
11917
11916
|
);
|
|
11918
11917
|
}
|
|
11919
11918
|
value.fetchMock = void 0;
|
|
11920
|
-
value.outboundService = (req) =>
|
|
11919
|
+
value.outboundService = (req) => fetch3(req, { dispatcher: fetchMock });
|
|
11921
11920
|
}
|
|
11922
11921
|
return value;
|
|
11923
11922
|
});
|
|
@@ -13851,415 +13850,6 @@ var PLUGINS = {
|
|
|
13851
13850
|
};
|
|
13852
13851
|
var PLUGIN_ENTRIES = Object.entries(PLUGINS);
|
|
13853
13852
|
|
|
13854
|
-
// src/plugins/core/inspector-proxy/inspector-proxy-controller.ts
|
|
13855
|
-
var import_node_crypto2 = __toESM(require("node:crypto"));
|
|
13856
|
-
var import_node_http = require("node:http");
|
|
13857
|
-
|
|
13858
|
-
// ../../node_modules/.pnpm/get-port@7.1.0/node_modules/get-port/index.js
|
|
13859
|
-
var import_node_net = __toESM(require("node:net"), 1);
|
|
13860
|
-
var import_node_os = __toESM(require("node:os"), 1);
|
|
13861
|
-
var Locked = class extends Error {
|
|
13862
|
-
constructor(port) {
|
|
13863
|
-
super(`${port} is locked`);
|
|
13864
|
-
}
|
|
13865
|
-
};
|
|
13866
|
-
var lockedPorts = {
|
|
13867
|
-
old: /* @__PURE__ */ new Set(),
|
|
13868
|
-
young: /* @__PURE__ */ new Set()
|
|
13869
|
-
};
|
|
13870
|
-
var releaseOldLockedPortsIntervalMs = 1e3 * 15;
|
|
13871
|
-
var timeout;
|
|
13872
|
-
var getLocalHosts = () => {
|
|
13873
|
-
const interfaces = import_node_os.default.networkInterfaces();
|
|
13874
|
-
const results = /* @__PURE__ */ new Set([void 0, "0.0.0.0"]);
|
|
13875
|
-
for (const _interface of Object.values(interfaces)) {
|
|
13876
|
-
for (const config of _interface) {
|
|
13877
|
-
results.add(config.address);
|
|
13878
|
-
}
|
|
13879
|
-
}
|
|
13880
|
-
return results;
|
|
13881
|
-
};
|
|
13882
|
-
var checkAvailablePort = (options) => new Promise((resolve2, reject) => {
|
|
13883
|
-
const server = import_node_net.default.createServer();
|
|
13884
|
-
server.unref();
|
|
13885
|
-
server.on("error", reject);
|
|
13886
|
-
server.listen(options, () => {
|
|
13887
|
-
const { port } = server.address();
|
|
13888
|
-
server.close(() => {
|
|
13889
|
-
resolve2(port);
|
|
13890
|
-
});
|
|
13891
|
-
});
|
|
13892
|
-
});
|
|
13893
|
-
var getAvailablePort = async (options, hosts) => {
|
|
13894
|
-
if (options.host || options.port === 0) {
|
|
13895
|
-
return checkAvailablePort(options);
|
|
13896
|
-
}
|
|
13897
|
-
for (const host of hosts) {
|
|
13898
|
-
try {
|
|
13899
|
-
await checkAvailablePort({ port: options.port, host });
|
|
13900
|
-
} catch (error) {
|
|
13901
|
-
if (!["EADDRNOTAVAIL", "EINVAL"].includes(error.code)) {
|
|
13902
|
-
throw error;
|
|
13903
|
-
}
|
|
13904
|
-
}
|
|
13905
|
-
}
|
|
13906
|
-
return options.port;
|
|
13907
|
-
};
|
|
13908
|
-
var portCheckSequence = function* (ports) {
|
|
13909
|
-
if (ports) {
|
|
13910
|
-
yield* ports;
|
|
13911
|
-
}
|
|
13912
|
-
yield 0;
|
|
13913
|
-
};
|
|
13914
|
-
async function getPorts(options) {
|
|
13915
|
-
let ports;
|
|
13916
|
-
let exclude = /* @__PURE__ */ new Set();
|
|
13917
|
-
if (options) {
|
|
13918
|
-
if (options.port) {
|
|
13919
|
-
ports = typeof options.port === "number" ? [options.port] : options.port;
|
|
13920
|
-
}
|
|
13921
|
-
if (options.exclude) {
|
|
13922
|
-
const excludeIterable = options.exclude;
|
|
13923
|
-
if (typeof excludeIterable[Symbol.iterator] !== "function") {
|
|
13924
|
-
throw new TypeError("The `exclude` option must be an iterable.");
|
|
13925
|
-
}
|
|
13926
|
-
for (const element of excludeIterable) {
|
|
13927
|
-
if (typeof element !== "number") {
|
|
13928
|
-
throw new TypeError("Each item in the `exclude` option must be a number corresponding to the port you want excluded.");
|
|
13929
|
-
}
|
|
13930
|
-
if (!Number.isSafeInteger(element)) {
|
|
13931
|
-
throw new TypeError(`Number ${element} in the exclude option is not a safe integer and can't be used`);
|
|
13932
|
-
}
|
|
13933
|
-
}
|
|
13934
|
-
exclude = new Set(excludeIterable);
|
|
13935
|
-
}
|
|
13936
|
-
}
|
|
13937
|
-
if (timeout === void 0) {
|
|
13938
|
-
timeout = setTimeout(() => {
|
|
13939
|
-
timeout = void 0;
|
|
13940
|
-
lockedPorts.old = lockedPorts.young;
|
|
13941
|
-
lockedPorts.young = /* @__PURE__ */ new Set();
|
|
13942
|
-
}, releaseOldLockedPortsIntervalMs);
|
|
13943
|
-
if (timeout.unref) {
|
|
13944
|
-
timeout.unref();
|
|
13945
|
-
}
|
|
13946
|
-
}
|
|
13947
|
-
const hosts = getLocalHosts();
|
|
13948
|
-
for (const port of portCheckSequence(ports)) {
|
|
13949
|
-
try {
|
|
13950
|
-
if (exclude.has(port)) {
|
|
13951
|
-
continue;
|
|
13952
|
-
}
|
|
13953
|
-
let availablePort = await getAvailablePort({ ...options, port }, hosts);
|
|
13954
|
-
while (lockedPorts.old.has(availablePort) || lockedPorts.young.has(availablePort)) {
|
|
13955
|
-
if (port !== 0) {
|
|
13956
|
-
throw new Locked(port);
|
|
13957
|
-
}
|
|
13958
|
-
availablePort = await getAvailablePort({ ...options, port }, hosts);
|
|
13959
|
-
}
|
|
13960
|
-
lockedPorts.young.add(availablePort);
|
|
13961
|
-
return availablePort;
|
|
13962
|
-
} catch (error) {
|
|
13963
|
-
if (!["EADDRINUSE", "EACCES"].includes(error.code) && !(error instanceof Locked)) {
|
|
13964
|
-
throw error;
|
|
13965
|
-
}
|
|
13966
|
-
}
|
|
13967
|
-
}
|
|
13968
|
-
throw new Error("No available ports found");
|
|
13969
|
-
}
|
|
13970
|
-
|
|
13971
|
-
// src/plugins/core/inspector-proxy/inspector-proxy-controller.ts
|
|
13972
|
-
var import_ws4 = __toESM(require("ws"));
|
|
13973
|
-
|
|
13974
|
-
// package.json
|
|
13975
|
-
var version = "0.0.0-0435d8ef5";
|
|
13976
|
-
|
|
13977
|
-
// src/plugins/core/inspector-proxy/inspector-proxy.ts
|
|
13978
|
-
var import_node_assert4 = __toESM(require("node:assert"));
|
|
13979
|
-
var import_ws3 = __toESM(require("ws"));
|
|
13980
|
-
|
|
13981
|
-
// src/plugins/core/inspector-proxy/devtools.ts
|
|
13982
|
-
function isDevToolsEvent(event, name) {
|
|
13983
|
-
return typeof event === "object" && event !== null && "method" in event && event.method === name;
|
|
13984
|
-
}
|
|
13985
|
-
|
|
13986
|
-
// src/plugins/core/inspector-proxy/inspector-proxy.ts
|
|
13987
|
-
var InspectorProxy = class {
|
|
13988
|
-
#workerName;
|
|
13989
|
-
#runtimeWs;
|
|
13990
|
-
#devtoolsWs;
|
|
13991
|
-
#devtoolsHaveFileSystemAccess = false;
|
|
13992
|
-
constructor(workerName, runtimeWs) {
|
|
13993
|
-
this.#workerName = workerName;
|
|
13994
|
-
this.#runtimeWs = runtimeWs;
|
|
13995
|
-
this.#runtimeWs.once("open", () => this.#handleRuntimeWebSocketOpen());
|
|
13996
|
-
}
|
|
13997
|
-
get workerName() {
|
|
13998
|
-
return this.#workerName;
|
|
13999
|
-
}
|
|
14000
|
-
get path() {
|
|
14001
|
-
return `/${this.#workerName}`;
|
|
14002
|
-
}
|
|
14003
|
-
onDevtoolsConnected(devtoolsWs, devtoolsHaveFileSystemAccess) {
|
|
14004
|
-
if (this.#devtoolsWs) {
|
|
14005
|
-
devtoolsWs.close(
|
|
14006
|
-
1013,
|
|
14007
|
-
"Too many clients; only one can be connected at a time"
|
|
14008
|
-
);
|
|
14009
|
-
return;
|
|
14010
|
-
}
|
|
14011
|
-
this.#devtoolsWs = devtoolsWs;
|
|
14012
|
-
this.#devtoolsHaveFileSystemAccess = devtoolsHaveFileSystemAccess;
|
|
14013
|
-
(0, import_node_assert4.default)(this.#devtoolsWs?.readyState === import_ws3.default.OPEN);
|
|
14014
|
-
this.#devtoolsWs.on("error", console.error);
|
|
14015
|
-
this.#devtoolsWs.once("close", () => {
|
|
14016
|
-
if (this.#runtimeWs?.OPEN) {
|
|
14017
|
-
this.#sendMessageToRuntime({
|
|
14018
|
-
method: "Debugger.disable",
|
|
14019
|
-
id: this.#nextCounter()
|
|
14020
|
-
});
|
|
14021
|
-
}
|
|
14022
|
-
this.#devtoolsWs = void 0;
|
|
14023
|
-
});
|
|
14024
|
-
this.#devtoolsWs.on("message", (data) => {
|
|
14025
|
-
const message = JSON.parse(data.toString());
|
|
14026
|
-
(0, import_node_assert4.default)(this.#runtimeWs?.OPEN);
|
|
14027
|
-
this.#sendMessageToRuntime(message);
|
|
14028
|
-
});
|
|
14029
|
-
}
|
|
14030
|
-
#runtimeMessageCounter = 1e8;
|
|
14031
|
-
#nextCounter() {
|
|
14032
|
-
return ++this.#runtimeMessageCounter;
|
|
14033
|
-
}
|
|
14034
|
-
#runtimeKeepAliveInterval;
|
|
14035
|
-
#handleRuntimeWebSocketOpen() {
|
|
14036
|
-
(0, import_node_assert4.default)(this.#runtimeWs?.OPEN);
|
|
14037
|
-
this.#runtimeWs.on("message", (data) => {
|
|
14038
|
-
const message = JSON.parse(data.toString());
|
|
14039
|
-
if (!this.#devtoolsWs) {
|
|
14040
|
-
return;
|
|
14041
|
-
}
|
|
14042
|
-
if (isDevToolsEvent(message, "Debugger.scriptParsed")) {
|
|
14043
|
-
return this.#handleRuntimeScriptParsed(message);
|
|
14044
|
-
}
|
|
14045
|
-
return this.#sendMessageToDevtools(message);
|
|
14046
|
-
});
|
|
14047
|
-
clearInterval(this.#runtimeKeepAliveInterval);
|
|
14048
|
-
this.#runtimeKeepAliveInterval = setInterval(() => {
|
|
14049
|
-
if (this.#runtimeWs?.OPEN) {
|
|
14050
|
-
this.#sendMessageToRuntime({
|
|
14051
|
-
method: "Runtime.getIsolateId",
|
|
14052
|
-
id: this.#nextCounter()
|
|
14053
|
-
});
|
|
14054
|
-
}
|
|
14055
|
-
}, 1e4);
|
|
14056
|
-
}
|
|
14057
|
-
#handleRuntimeScriptParsed(message) {
|
|
14058
|
-
if (!this.#devtoolsHaveFileSystemAccess && message.params.sourceMapURL !== void 0 && // Don't try to find a sourcemap for e.g. node-internal: scripts
|
|
14059
|
-
message.params.url.startsWith("file:")) {
|
|
14060
|
-
const url20 = new URL(message.params.sourceMapURL, message.params.url);
|
|
14061
|
-
if (url20.protocol === "file:") {
|
|
14062
|
-
message.params.sourceMapURL = url20.href.replace(
|
|
14063
|
-
"file:",
|
|
14064
|
-
"wrangler-file:"
|
|
14065
|
-
);
|
|
14066
|
-
}
|
|
14067
|
-
}
|
|
14068
|
-
return this.#sendMessageToDevtools(message);
|
|
14069
|
-
}
|
|
14070
|
-
#sendMessageToDevtools(message) {
|
|
14071
|
-
(0, import_node_assert4.default)(this.#devtoolsWs);
|
|
14072
|
-
if (!this.#devtoolsWs.OPEN) {
|
|
14073
|
-
this.#devtoolsWs.once(
|
|
14074
|
-
"open",
|
|
14075
|
-
() => this.#devtoolsWs?.send(JSON.stringify(message))
|
|
14076
|
-
);
|
|
14077
|
-
return;
|
|
14078
|
-
}
|
|
14079
|
-
this.#devtoolsWs.send(JSON.stringify(message));
|
|
14080
|
-
}
|
|
14081
|
-
#sendMessageToRuntime(message) {
|
|
14082
|
-
(0, import_node_assert4.default)(this.#runtimeWs?.OPEN);
|
|
14083
|
-
this.#runtimeWs.send(JSON.stringify(message));
|
|
14084
|
-
}
|
|
14085
|
-
async dispose() {
|
|
14086
|
-
clearInterval(this.#runtimeKeepAliveInterval);
|
|
14087
|
-
this.#devtoolsWs?.close();
|
|
14088
|
-
}
|
|
14089
|
-
};
|
|
14090
|
-
|
|
14091
|
-
// src/plugins/core/inspector-proxy/inspector-proxy-controller.ts
|
|
14092
|
-
var InspectorProxyController = class {
|
|
14093
|
-
constructor(userInspectorPort, log, workerNamesToProxy) {
|
|
14094
|
-
this.log = log;
|
|
14095
|
-
this.workerNamesToProxy = workerNamesToProxy;
|
|
14096
|
-
this.#inspectorPort = userInspectorPort !== 0 ? userInspectorPort : getPorts();
|
|
14097
|
-
this.#server = this.#initializeServer();
|
|
14098
|
-
this.#runtimeConnectionEstablished = new DeferredPromise();
|
|
14099
|
-
}
|
|
14100
|
-
#runtimeConnectionEstablished;
|
|
14101
|
-
#proxies = [];
|
|
14102
|
-
#server;
|
|
14103
|
-
#inspectorPort;
|
|
14104
|
-
async #initializeServer() {
|
|
14105
|
-
const server = (0, import_node_http.createServer)(async (req, res) => {
|
|
14106
|
-
const maybeJson = await this.#handleDevToolsJsonRequest(
|
|
14107
|
-
req.headers.host ?? "localhost",
|
|
14108
|
-
req.url ?? "/"
|
|
14109
|
-
);
|
|
14110
|
-
if (maybeJson !== null) {
|
|
14111
|
-
res.setHeader("Content-Type", "application/json");
|
|
14112
|
-
res.end(JSON.stringify(maybeJson));
|
|
14113
|
-
return;
|
|
14114
|
-
}
|
|
14115
|
-
res.statusCode = 404;
|
|
14116
|
-
res.end(null);
|
|
14117
|
-
});
|
|
14118
|
-
this.#initializeWebSocketServer(server);
|
|
14119
|
-
server.listen(await this.#inspectorPort);
|
|
14120
|
-
return server;
|
|
14121
|
-
}
|
|
14122
|
-
#initializeWebSocketServer(server) {
|
|
14123
|
-
const devtoolsWebSocketServer = new import_ws4.WebSocketServer({ server });
|
|
14124
|
-
devtoolsWebSocketServer.on("connection", (devtoolsWs, upgradeRequest) => {
|
|
14125
|
-
const validationError = this.#validateDevToolsWebSocketUpgradeRequest(upgradeRequest);
|
|
14126
|
-
if (validationError !== null) {
|
|
14127
|
-
devtoolsWs.close();
|
|
14128
|
-
return;
|
|
14129
|
-
}
|
|
14130
|
-
const proxy = this.#proxies.find(
|
|
14131
|
-
({ path: path30 }) => upgradeRequest.url === path30
|
|
14132
|
-
);
|
|
14133
|
-
if (!proxy) {
|
|
14134
|
-
this.log.warn(
|
|
14135
|
-
`Warning: An inspector connection was requested for the ${upgradeRequest.url} path but no such inspector exists`
|
|
14136
|
-
);
|
|
14137
|
-
devtoolsWs.close();
|
|
14138
|
-
return;
|
|
14139
|
-
}
|
|
14140
|
-
proxy.onDevtoolsConnected(
|
|
14141
|
-
devtoolsWs,
|
|
14142
|
-
this.#checkIfDevtoolsHaveFileSystemAccess(upgradeRequest)
|
|
14143
|
-
);
|
|
14144
|
-
});
|
|
14145
|
-
}
|
|
14146
|
-
#validateDevToolsWebSocketUpgradeRequest(req) {
|
|
14147
|
-
const hostHeader = req.headers.host;
|
|
14148
|
-
if (hostHeader == null) return { statusText: null, status: 400 };
|
|
14149
|
-
try {
|
|
14150
|
-
const host = new URL(`http://${hostHeader}`);
|
|
14151
|
-
if (!ALLOWED_HOST_HOSTNAMES.includes(host.hostname)) {
|
|
14152
|
-
return { statusText: "Disallowed `Host` header", status: 401 };
|
|
14153
|
-
}
|
|
14154
|
-
} catch {
|
|
14155
|
-
return { statusText: "Expected `Host` header", status: 400 };
|
|
14156
|
-
}
|
|
14157
|
-
let originHeader = req.headers.origin;
|
|
14158
|
-
if (!originHeader && !req.headers["user-agent"]) {
|
|
14159
|
-
originHeader = "http://localhost";
|
|
14160
|
-
}
|
|
14161
|
-
if (!originHeader) {
|
|
14162
|
-
return { statusText: "Expected `Origin` header", status: 400 };
|
|
14163
|
-
}
|
|
14164
|
-
try {
|
|
14165
|
-
const origin = new URL(originHeader);
|
|
14166
|
-
const allowed = ALLOWED_ORIGIN_HOSTNAMES.some((rule) => {
|
|
14167
|
-
if (typeof rule === "string") return origin.hostname === rule;
|
|
14168
|
-
else return rule.test(origin.hostname);
|
|
14169
|
-
});
|
|
14170
|
-
if (!allowed) {
|
|
14171
|
-
return { statusText: "Disallowed `Origin` header", status: 401 };
|
|
14172
|
-
}
|
|
14173
|
-
} catch {
|
|
14174
|
-
return { statusText: "Expected `Origin` header", status: 400 };
|
|
14175
|
-
}
|
|
14176
|
-
return null;
|
|
14177
|
-
}
|
|
14178
|
-
#checkIfDevtoolsHaveFileSystemAccess(req) {
|
|
14179
|
-
const userAgent = req.headers["user-agent"] ?? "";
|
|
14180
|
-
const hasFileSystemAccess = !/mozilla/i.test(userAgent);
|
|
14181
|
-
return hasFileSystemAccess;
|
|
14182
|
-
}
|
|
14183
|
-
#inspectorId = import_node_crypto2.default.randomUUID();
|
|
14184
|
-
async #handleDevToolsJsonRequest(host, path30) {
|
|
14185
|
-
if (path30 === "/json/version") {
|
|
14186
|
-
return {
|
|
14187
|
-
Browser: `miniflare/v${version}`,
|
|
14188
|
-
// TODO: (someday): The DevTools protocol should match that of workerd.
|
|
14189
|
-
// This could be exposed by the preview API.
|
|
14190
|
-
"Protocol-Version": "1.3"
|
|
14191
|
-
};
|
|
14192
|
-
}
|
|
14193
|
-
if (path30 === "/json" || path30 === "/json/list") {
|
|
14194
|
-
return this.#proxies.map(({ workerName }) => {
|
|
14195
|
-
const localHost = `${host}/${workerName}`;
|
|
14196
|
-
const devtoolsFrontendUrl = `https://devtools.devprod.cloudflare.dev/js_app?theme=systemPreferred&debugger=true&ws=${localHost}`;
|
|
14197
|
-
return {
|
|
14198
|
-
id: `${this.#inspectorId}-${workerName}`,
|
|
14199
|
-
type: "node",
|
|
14200
|
-
// TODO: can we specify different type?
|
|
14201
|
-
description: "workers",
|
|
14202
|
-
webSocketDebuggerUrl: `ws://${localHost}`,
|
|
14203
|
-
devtoolsFrontendUrl,
|
|
14204
|
-
devtoolsFrontendUrlCompat: devtoolsFrontendUrl,
|
|
14205
|
-
// Below are fields that are visible in the DevTools UI.
|
|
14206
|
-
title: workerName.length === 0 || this.#proxies.length === 1 ? `Cloudflare Worker` : `Cloudflare Worker: ${workerName}`,
|
|
14207
|
-
faviconUrl: "https://workers.cloudflare.com/favicon.ico"
|
|
14208
|
-
// url: "http://" + localHost, // looks unnecessary
|
|
14209
|
-
};
|
|
14210
|
-
});
|
|
14211
|
-
}
|
|
14212
|
-
return null;
|
|
14213
|
-
}
|
|
14214
|
-
async getInspectorURL() {
|
|
14215
|
-
return getWebsocketURL(await this.#inspectorPort);
|
|
14216
|
-
}
|
|
14217
|
-
async updateConnection(runtimeInspectorPort) {
|
|
14218
|
-
const workerdInspectorJson = await fetch(
|
|
14219
|
-
`http://127.0.0.1:${runtimeInspectorPort}/json`
|
|
14220
|
-
).then((resp) => resp.json());
|
|
14221
|
-
this.#proxies = workerdInspectorJson.map(({ id }) => {
|
|
14222
|
-
if (!id.startsWith("core:user:")) {
|
|
14223
|
-
return;
|
|
14224
|
-
}
|
|
14225
|
-
const workerName = id.replace(/^core:user:/, "");
|
|
14226
|
-
if (!this.workerNamesToProxy.has(workerName)) {
|
|
14227
|
-
return;
|
|
14228
|
-
}
|
|
14229
|
-
return new InspectorProxy(
|
|
14230
|
-
workerName,
|
|
14231
|
-
new import_ws4.default(`ws://127.0.0.1:${runtimeInspectorPort}/${id}`)
|
|
14232
|
-
);
|
|
14233
|
-
}).filter(Boolean);
|
|
14234
|
-
this.#runtimeConnectionEstablished.resolve();
|
|
14235
|
-
}
|
|
14236
|
-
async #waitForReady() {
|
|
14237
|
-
await this.#runtimeConnectionEstablished;
|
|
14238
|
-
}
|
|
14239
|
-
get ready() {
|
|
14240
|
-
return this.#waitForReady();
|
|
14241
|
-
}
|
|
14242
|
-
async dispose() {
|
|
14243
|
-
await Promise.all(this.#proxies.map((proxy) => proxy.dispose()));
|
|
14244
|
-
const server = await this.#server;
|
|
14245
|
-
return new Promise((resolve2, reject) => {
|
|
14246
|
-
server.close((err) => err ? reject(err) : resolve2());
|
|
14247
|
-
});
|
|
14248
|
-
}
|
|
14249
|
-
};
|
|
14250
|
-
function getWebsocketURL(port) {
|
|
14251
|
-
return new URL(`ws://127.0.0.1:${port}`);
|
|
14252
|
-
}
|
|
14253
|
-
var ALLOWED_HOST_HOSTNAMES = ["127.0.0.1", "[::1]", "localhost"];
|
|
14254
|
-
var ALLOWED_ORIGIN_HOSTNAMES = [
|
|
14255
|
-
"devtools.devprod.cloudflare.dev",
|
|
14256
|
-
"cloudflare-devtools.pages.dev",
|
|
14257
|
-
/^[a-z0-9]+\.cloudflare-devtools\.pages\.dev$/,
|
|
14258
|
-
"127.0.0.1",
|
|
14259
|
-
"[::1]",
|
|
14260
|
-
"localhost"
|
|
14261
|
-
];
|
|
14262
|
-
|
|
14263
13853
|
// src/shared/mime-types.ts
|
|
14264
13854
|
var compressedByCloudflareFL = /* @__PURE__ */ new Set([
|
|
14265
13855
|
// list copied from https://developers.cloudflare.com/speed/optimization/content/brotli/content-compression/#:~:text=If%20supported%20by%20visitors%E2%80%99%20web%20browsers%2C%20Cloudflare%20will%20return%20Gzip%20or%20Brotli%2Dencoded%20responses%20for%20the%20following%20content%20types%3A
|
|
@@ -14999,45 +14589,18 @@ var Miniflare2 = class _Miniflare {
|
|
|
14999
14589
|
#liveReloadServer;
|
|
15000
14590
|
#webSocketServer;
|
|
15001
14591
|
#webSocketExtraHeaders;
|
|
15002
|
-
#maybeInspectorProxyController;
|
|
15003
|
-
#previousRuntimeInspectorPort;
|
|
15004
14592
|
constructor(opts) {
|
|
15005
14593
|
const [sharedOpts, workerOpts] = validateOptions(opts);
|
|
15006
14594
|
this.#sharedOpts = sharedOpts;
|
|
15007
14595
|
this.#workerOpts = workerOpts;
|
|
15008
|
-
const workerNamesToProxy = new Set(
|
|
15009
|
-
this.#workerOpts.filter(({ core: { unsafeInspectorProxy } }) => !!unsafeInspectorProxy).map((w) => w.core.name ?? "")
|
|
15010
|
-
);
|
|
15011
|
-
const enableInspectorProxy = workerNamesToProxy.size > 0;
|
|
15012
|
-
if (enableInspectorProxy) {
|
|
15013
|
-
if (this.#sharedOpts.core.inspectorPort === void 0) {
|
|
15014
|
-
throw new MiniflareCoreError(
|
|
15015
|
-
"ERR_MISSING_INSPECTOR_PROXY_PORT",
|
|
15016
|
-
"inspector proxy requested but without an inspectorPort specified"
|
|
15017
|
-
);
|
|
15018
|
-
}
|
|
15019
|
-
}
|
|
15020
14596
|
if (maybeInstanceRegistry !== void 0) {
|
|
15021
14597
|
const object = { name: "Miniflare", stack: "" };
|
|
15022
14598
|
Error.captureStackTrace(object, _Miniflare);
|
|
15023
14599
|
maybeInstanceRegistry.set(this, object.stack);
|
|
15024
14600
|
}
|
|
15025
14601
|
this.#log = this.#sharedOpts.core.log ?? new NoOpLog();
|
|
15026
|
-
|
|
15027
|
-
|
|
15028
|
-
throw new MiniflareCoreError(
|
|
15029
|
-
"ERR_MISSING_INSPECTOR_PROXY_PORT",
|
|
15030
|
-
"inspector proxy requested but without an inspectorPort specified"
|
|
15031
|
-
);
|
|
15032
|
-
}
|
|
15033
|
-
this.#maybeInspectorProxyController = new InspectorProxyController(
|
|
15034
|
-
this.#sharedOpts.core.inspectorPort,
|
|
15035
|
-
this.#log,
|
|
15036
|
-
workerNamesToProxy
|
|
15037
|
-
);
|
|
15038
|
-
}
|
|
15039
|
-
this.#liveReloadServer = new import_ws5.WebSocketServer({ noServer: true });
|
|
15040
|
-
this.#webSocketServer = new import_ws5.WebSocketServer({
|
|
14602
|
+
this.#liveReloadServer = new import_ws3.WebSocketServer({ noServer: true });
|
|
14603
|
+
this.#webSocketServer = new import_ws3.WebSocketServer({
|
|
15041
14604
|
noServer: true,
|
|
15042
14605
|
// Disable automatic handling of `Sec-WebSocket-Protocol` header,
|
|
15043
14606
|
// Cloudflare Workers require users to include this header themselves in
|
|
@@ -15497,19 +15060,14 @@ var Miniflare2 = class _Miniflare {
|
|
|
15497
15060
|
configuredHost,
|
|
15498
15061
|
this.#sharedOpts.core.port
|
|
15499
15062
|
);
|
|
15500
|
-
let
|
|
15063
|
+
let inspectorAddress;
|
|
15501
15064
|
if (this.#sharedOpts.core.inspectorPort !== void 0) {
|
|
15502
|
-
|
|
15503
|
-
if (this.#maybeInspectorProxyController !== void 0) {
|
|
15504
|
-
runtimeInspectorPort = 0;
|
|
15505
|
-
}
|
|
15506
|
-
runtimeInspectorAddress = this.#getSocketAddress(
|
|
15065
|
+
inspectorAddress = this.#getSocketAddress(
|
|
15507
15066
|
kInspectorSocket,
|
|
15508
|
-
this.#
|
|
15067
|
+
this.#previousSharedOpts?.core.inspectorPort,
|
|
15509
15068
|
"localhost",
|
|
15510
|
-
|
|
15069
|
+
this.#sharedOpts.core.inspectorPort
|
|
15511
15070
|
);
|
|
15512
|
-
this.#previousRuntimeInspectorPort = runtimeInspectorPort;
|
|
15513
15071
|
}
|
|
15514
15072
|
const loopbackAddress = `${maybeGetLocallyAccessibleHost(configuredHost) ?? getURLSafeHost(configuredHost)}:${loopbackPort}`;
|
|
15515
15073
|
const runtimeOpts = {
|
|
@@ -15517,7 +15075,7 @@ var Miniflare2 = class _Miniflare {
|
|
|
15517
15075
|
entryAddress,
|
|
15518
15076
|
loopbackAddress,
|
|
15519
15077
|
requiredSockets,
|
|
15520
|
-
inspectorAddress
|
|
15078
|
+
inspectorAddress,
|
|
15521
15079
|
verbose: this.#sharedOpts.core.verbose,
|
|
15522
15080
|
handleRuntimeStdio: this.#sharedOpts.core.handleRuntimeStdio
|
|
15523
15081
|
};
|
|
@@ -15533,17 +15091,6 @@ var Miniflare2 = class _Miniflare {
|
|
|
15533
15091
|
);
|
|
15534
15092
|
}
|
|
15535
15093
|
this.#socketPorts = maybeSocketPorts;
|
|
15536
|
-
if (this.#maybeInspectorProxyController !== void 0) {
|
|
15537
|
-
const maybePort = this.#socketPorts.get(kInspectorSocket);
|
|
15538
|
-
if (maybePort === void 0) {
|
|
15539
|
-
throw new MiniflareCoreError(
|
|
15540
|
-
"ERR_RUNTIME_FAILURE",
|
|
15541
|
-
"Unable to access the runtime inspector socket."
|
|
15542
|
-
);
|
|
15543
|
-
} else {
|
|
15544
|
-
this.#maybeInspectorProxyController.updateConnection(maybePort);
|
|
15545
|
-
}
|
|
15546
|
-
}
|
|
15547
15094
|
const entrySocket = config.sockets?.[0];
|
|
15548
15095
|
const secure = entrySocket !== void 0 && "https" in entrySocket;
|
|
15549
15096
|
const previousEntryURL = this.#runtimeEntryURL;
|
|
@@ -15598,7 +15145,6 @@ var Miniflare2 = class _Miniflare {
|
|
|
15598
15145
|
await this.#initPromise;
|
|
15599
15146
|
await this.#runtimeMutex.drained();
|
|
15600
15147
|
if (disposing) return new URL("http://[100::]/");
|
|
15601
|
-
await this.#maybeInspectorProxyController?.ready;
|
|
15602
15148
|
this.#checkDisposed();
|
|
15603
15149
|
(0, import_assert12.default)(this.#runtimeEntryURL !== void 0);
|
|
15604
15150
|
return new URL(this.#runtimeEntryURL.toString());
|
|
@@ -15614,9 +15160,6 @@ var Miniflare2 = class _Miniflare {
|
|
|
15614
15160
|
async getInspectorURL() {
|
|
15615
15161
|
this.#checkDisposed();
|
|
15616
15162
|
await this.ready;
|
|
15617
|
-
if (this.#maybeInspectorProxyController !== void 0) {
|
|
15618
|
-
return this.#maybeInspectorProxyController.getInspectorURL();
|
|
15619
|
-
}
|
|
15620
15163
|
(0, import_assert12.default)(this.#socketPorts !== void 0);
|
|
15621
15164
|
const maybePort = this.#socketPorts.get(kInspectorSocket);
|
|
15622
15165
|
if (maybePort === void 0) {
|
|
@@ -15695,7 +15238,7 @@ var Miniflare2 = class _Miniflare {
|
|
|
15695
15238
|
);
|
|
15696
15239
|
const forwardInit = forward;
|
|
15697
15240
|
forwardInit.dispatcher = dispatcher;
|
|
15698
|
-
const response = await
|
|
15241
|
+
const response = await fetch3(url20, forwardInit);
|
|
15699
15242
|
const stack = response.headers.get(CoreHeaders.ERROR_STACK);
|
|
15700
15243
|
if (response.status === 500 && stack !== null) {
|
|
15701
15244
|
const caught = JsonErrorSchema.parse(await response.json());
|
|
@@ -15844,7 +15387,6 @@ var Miniflare2 = class _Miniflare {
|
|
|
15844
15387
|
await this.#runtime?.dispose();
|
|
15845
15388
|
await this.#stopLoopbackServer();
|
|
15846
15389
|
await import_fs24.default.promises.rm(this.#tmpPath, { force: true, recursive: true });
|
|
15847
|
-
await this.#maybeInspectorProxyController?.dispose();
|
|
15848
15390
|
maybeInstanceRegistry?.delete(this);
|
|
15849
15391
|
}
|
|
15850
15392
|
}
|