@ricsam/isolate-daemon 0.1.16 → 0.1.18
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/cjs/callback-fs-handler.cjs +19 -9
- package/dist/cjs/callback-fs-handler.cjs.map +2 -2
- package/dist/cjs/connection.cjs +135 -45
- package/dist/cjs/connection.cjs.map +3 -3
- package/dist/cjs/daemon.cjs +1 -5
- package/dist/cjs/daemon.cjs.map +3 -3
- package/dist/cjs/index.cjs +19 -9
- package/dist/cjs/index.cjs.map +2 -2
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/types.cjs +14 -8
- package/dist/cjs/types.cjs.map +1 -1
- package/dist/mjs/connection.mjs +117 -37
- package/dist/mjs/connection.mjs.map +3 -3
- package/dist/mjs/daemon.mjs +1 -5
- package/dist/mjs/daemon.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/types.d.ts +5 -0
- package/package.json +1 -1
package/dist/cjs/daemon.cjs
CHANGED
|
@@ -89,14 +89,10 @@ Shutting down...`);
|
|
|
89
89
|
};
|
|
90
90
|
process.on("SIGINT", shutdown);
|
|
91
91
|
process.on("SIGTERM", shutdown);
|
|
92
|
-
setInterval(() => {
|
|
93
|
-
const stats = daemon.getStats();
|
|
94
|
-
console.log(`[stats] connections: ${stats.activeConnections}, isolates: ${stats.activeIsolates}, total requests: ${stats.totalRequestsProcessed}`);
|
|
95
|
-
}, 60000);
|
|
96
92
|
}
|
|
97
93
|
main().catch((err) => {
|
|
98
94
|
console.error("Failed to start daemon:", err);
|
|
99
95
|
process.exit(1);
|
|
100
96
|
});
|
|
101
97
|
|
|
102
|
-
//# debugId=
|
|
98
|
+
//# debugId=D96ECFE02F2246F464756E2164756E21
|
package/dist/cjs/daemon.cjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/daemon.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"#!/usr/bin/env node\n\n// Suppress the ExperimentalWarning for stripTypeScriptTypes\nprocess.removeAllListeners(\"warning\");\nprocess.on(\"warning\", (warning) => {\n if (\n warning.name === \"ExperimentalWarning\" &&\n warning.message.includes(\"stripTypeScriptTypes\")\n ) {\n return; // Suppress this specific warning\n }\n console.warn(warning);\n});\n\n/**\n * CLI entry point for the isolate daemon.\n *\n * Usage:\n * isolate-daemon [options]\n *\n * Options:\n * --socket <path> Unix socket path (default: /tmp/isolate-daemon.sock)\n * --host <host> TCP host (default: 127.0.0.1)\n * --port <port> TCP port (default: 47891)\n * --max-isolates <n> Maximum isolates (default: 100)\n * --memory-limit <mb> Default memory limit (default: 128)\n */\n\nimport { startDaemon, type DaemonOptions } from \"./index.cjs\";\n\nfunction parseArgs(args: string[]): Partial<DaemonOptions> {\n const options: Partial<DaemonOptions> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--socket\":\n i++;\n if (args[i]) {\n options.socketPath = args[i];\n }\n break;\n case \"--host\":\n i++;\n if (args[i]) {\n options.host = args[i];\n options.socketPath = undefined; // Use TCP instead\n }\n break;\n case \"--port\": {\n i++;\n const value = args[i];\n if (value !== undefined) {\n options.port = parseInt(value, 10);\n options.socketPath = undefined; // Use TCP instead\n }\n break;\n }\n case \"--max-isolates\": {\n i++;\n const value = args[i];\n if (value !== undefined) {\n options.maxIsolates = parseInt(value, 10);\n }\n break;\n }\n case \"--memory-limit\": {\n i++;\n const value = args[i];\n if (value !== undefined) {\n options.defaultMemoryLimitMB = parseInt(value, 10);\n }\n break;\n }\n case \"--help\":\n case \"-h\":\n console.log(`\nIsolate Daemon - Run isolated-vm runtimes accessible via IPC\n\nUsage:\n isolate-daemon [options]\n\nOptions:\n --socket <path> Unix socket path (default: /tmp/isolate-daemon.sock)\n --host <host> TCP host (default: 127.0.0.1, disables Unix socket)\n --port <port> TCP port (default: 47891, disables Unix socket)\n --max-isolates <n> Maximum isolates (default: 100)\n --memory-limit <mb> Default memory limit in MB (default: 128)\n --help, -h Show this help message\n`);\n process.exit(0);\n default:\n if (arg !== undefined && arg.startsWith(\"-\")) {\n console.error(`Unknown option: ${arg}`);\n process.exit(1);\n }\n }\n }\n\n return options;\n}\n\nasync function main() {\n const options = parseArgs(process.argv.slice(2));\n\n const daemon = await startDaemon(options);\n\n // Handle shutdown signals\n const shutdown = async () => {\n console.log(\"\\nShutting down...\");\n await daemon.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n
|
|
5
|
+
"#!/usr/bin/env node\n\n// Suppress the ExperimentalWarning for stripTypeScriptTypes\nprocess.removeAllListeners(\"warning\");\nprocess.on(\"warning\", (warning) => {\n if (\n warning.name === \"ExperimentalWarning\" &&\n warning.message.includes(\"stripTypeScriptTypes\")\n ) {\n return; // Suppress this specific warning\n }\n console.warn(warning);\n});\n\n/**\n * CLI entry point for the isolate daemon.\n *\n * Usage:\n * isolate-daemon [options]\n *\n * Options:\n * --socket <path> Unix socket path (default: /tmp/isolate-daemon.sock)\n * --host <host> TCP host (default: 127.0.0.1)\n * --port <port> TCP port (default: 47891)\n * --max-isolates <n> Maximum isolates (default: 100)\n * --memory-limit <mb> Default memory limit (default: 128)\n */\n\nimport { startDaemon, type DaemonOptions } from \"./index.cjs\";\n\nfunction parseArgs(args: string[]): Partial<DaemonOptions> {\n const options: Partial<DaemonOptions> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--socket\":\n i++;\n if (args[i]) {\n options.socketPath = args[i];\n }\n break;\n case \"--host\":\n i++;\n if (args[i]) {\n options.host = args[i];\n options.socketPath = undefined; // Use TCP instead\n }\n break;\n case \"--port\": {\n i++;\n const value = args[i];\n if (value !== undefined) {\n options.port = parseInt(value, 10);\n options.socketPath = undefined; // Use TCP instead\n }\n break;\n }\n case \"--max-isolates\": {\n i++;\n const value = args[i];\n if (value !== undefined) {\n options.maxIsolates = parseInt(value, 10);\n }\n break;\n }\n case \"--memory-limit\": {\n i++;\n const value = args[i];\n if (value !== undefined) {\n options.defaultMemoryLimitMB = parseInt(value, 10);\n }\n break;\n }\n case \"--help\":\n case \"-h\":\n console.log(`\nIsolate Daemon - Run isolated-vm runtimes accessible via IPC\n\nUsage:\n isolate-daemon [options]\n\nOptions:\n --socket <path> Unix socket path (default: /tmp/isolate-daemon.sock)\n --host <host> TCP host (default: 127.0.0.1, disables Unix socket)\n --port <port> TCP port (default: 47891, disables Unix socket)\n --max-isolates <n> Maximum isolates (default: 100)\n --memory-limit <mb> Default memory limit in MB (default: 128)\n --help, -h Show this help message\n`);\n process.exit(0);\n default:\n if (arg !== undefined && arg.startsWith(\"-\")) {\n console.error(`Unknown option: ${arg}`);\n process.exit(1);\n }\n }\n }\n\n return options;\n}\n\nasync function main() {\n const options = parseArgs(process.argv.slice(2));\n\n const daemon = await startDaemon(options);\n\n // Handle shutdown signals\n const shutdown = async () => {\n console.log(\"\\nShutting down...\");\n await daemon.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((err) => {\n console.error(\"Failed to start daemon:\", err);\n process.exit(1);\n});\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;AA4BgD,IAAhD;AAzBA,QAAQ,mBAAmB,SAAS;AACpC,QAAQ,GAAG,WAAW,CAAC,YAAY;AAAA,EACjC,IACE,QAAQ,SAAS,yBACjB,QAAQ,QAAQ,SAAS,sBAAsB,GAC/C;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ,KAAK,OAAO;AAAA,CACrB;AAkBD,SAAS,SAAS,CAAC,MAAwC;AAAA,EACzD,MAAM,UAAkC,CAAC;AAAA,EAEzC,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ,KAAK;AAAA,IACpC,MAAM,MAAM,KAAK;AAAA,IAEjB,QAAQ;AAAA,WACD;AAAA,QACH;AAAA,QACA,IAAI,KAAK,IAAI;AAAA,UACX,QAAQ,aAAa,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,WACG;AAAA,QACH;AAAA,QACA,IAAI,KAAK,IAAI;AAAA,UACX,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ,aAAa;AAAA,QACvB;AAAA,QACA;AAAA,WACG,UAAU;AAAA,QACb;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI,UAAU,WAAW;AAAA,UACvB,QAAQ,OAAO,SAAS,OAAO,EAAE;AAAA,UACjC,QAAQ,aAAa;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAAA,WACK,kBAAkB;AAAA,QACrB;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI,UAAU,WAAW;AAAA,UACvB,QAAQ,cAAc,SAAS,OAAO,EAAE;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,WACK,kBAAkB;AAAA,QACrB;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI,UAAU,WAAW;AAAA,UACvB,QAAQ,uBAAuB,SAAS,OAAO,EAAE;AAAA,QACnD;AAAA,QACA;AAAA,MACF;AAAA,WACK;AAAA,WACA;AAAA,QACH,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAanB;AAAA,QACO,QAAQ,KAAK,CAAC;AAAA;AAAA,QAEd,IAAI,QAAQ,aAAa,IAAI,WAAW,GAAG,GAAG;AAAA,UAC5C,QAAQ,MAAM,mBAAmB,KAAK;AAAA,UACtC,QAAQ,KAAK,CAAC;AAAA,QAChB;AAAA;AAAA,EAEN;AAAA,EAEA,OAAO;AAAA;AAGT,eAAe,IAAI,GAAG;AAAA,EACpB,MAAM,UAAU,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EAE/C,MAAM,SAAS,MAAM,qBAAY,OAAO;AAAA,EAGxC,MAAM,WAAW,YAAY;AAAA,IAC3B,QAAQ,IAAI;AAAA,iBAAoB;AAAA,IAChC,MAAM,OAAO,MAAM;AAAA,IACnB,QAAQ,KAAK,CAAC;AAAA;AAAA,EAGhB,QAAQ,GAAG,UAAU,QAAQ;AAAA,EAC7B,QAAQ,GAAG,WAAW,QAAQ;AAAA
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;AA4BgD,IAAhD;AAzBA,QAAQ,mBAAmB,SAAS;AACpC,QAAQ,GAAG,WAAW,CAAC,YAAY;AAAA,EACjC,IACE,QAAQ,SAAS,yBACjB,QAAQ,QAAQ,SAAS,sBAAsB,GAC/C;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ,KAAK,OAAO;AAAA,CACrB;AAkBD,SAAS,SAAS,CAAC,MAAwC;AAAA,EACzD,MAAM,UAAkC,CAAC;AAAA,EAEzC,SAAS,IAAI,EAAG,IAAI,KAAK,QAAQ,KAAK;AAAA,IACpC,MAAM,MAAM,KAAK;AAAA,IAEjB,QAAQ;AAAA,WACD;AAAA,QACH;AAAA,QACA,IAAI,KAAK,IAAI;AAAA,UACX,QAAQ,aAAa,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,WACG;AAAA,QACH;AAAA,QACA,IAAI,KAAK,IAAI;AAAA,UACX,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ,aAAa;AAAA,QACvB;AAAA,QACA;AAAA,WACG,UAAU;AAAA,QACb;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI,UAAU,WAAW;AAAA,UACvB,QAAQ,OAAO,SAAS,OAAO,EAAE;AAAA,UACjC,QAAQ,aAAa;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAAA,WACK,kBAAkB;AAAA,QACrB;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI,UAAU,WAAW;AAAA,UACvB,QAAQ,cAAc,SAAS,OAAO,EAAE;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,WACK,kBAAkB;AAAA,QACrB;AAAA,QACA,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI,UAAU,WAAW;AAAA,UACvB,QAAQ,uBAAuB,SAAS,OAAO,EAAE;AAAA,QACnD;AAAA,QACA;AAAA,MACF;AAAA,WACK;AAAA,WACA;AAAA,QACH,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAanB;AAAA,QACO,QAAQ,KAAK,CAAC;AAAA;AAAA,QAEd,IAAI,QAAQ,aAAa,IAAI,WAAW,GAAG,GAAG;AAAA,UAC5C,QAAQ,MAAM,mBAAmB,KAAK;AAAA,UACtC,QAAQ,KAAK,CAAC;AAAA,QAChB;AAAA;AAAA,EAEN;AAAA,EAEA,OAAO;AAAA;AAGT,eAAe,IAAI,GAAG;AAAA,EACpB,MAAM,UAAU,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EAE/C,MAAM,SAAS,MAAM,qBAAY,OAAO;AAAA,EAGxC,MAAM,WAAW,YAAY;AAAA,IAC3B,QAAQ,IAAI;AAAA,iBAAoB;AAAA,IAChC,MAAM,OAAO,MAAM;AAAA,IACnB,QAAQ,KAAK,CAAC;AAAA;AAAA,EAGhB,QAAQ,GAAG,UAAU,QAAQ;AAAA,EAC7B,QAAQ,GAAG,WAAW,QAAQ;AAAA;AAGhC,KAAK,EAAE,MAAM,CAAC,QAAQ;AAAA,EACpB,QAAQ,MAAM,2BAA2B,GAAG;AAAA,EAC5C,QAAQ,KAAK,CAAC;AAAA,CACf;",
|
|
8
|
+
"debugId": "D96ECFE02F2246F464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
6
8
|
var __toCommonJS = (from) => {
|
|
7
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
8
10
|
if (entry)
|
|
9
11
|
return entry;
|
|
10
12
|
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
16
21
|
__moduleCache.set(from, entry);
|
|
17
22
|
return entry;
|
|
18
23
|
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
19
29
|
var __export = (target, all) => {
|
|
20
30
|
for (var name in all)
|
|
21
31
|
__defProp(target, name, {
|
|
22
32
|
get: all[name],
|
|
23
33
|
enumerable: true,
|
|
24
34
|
configurable: true,
|
|
25
|
-
set: (
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
26
36
|
});
|
|
27
37
|
};
|
|
28
38
|
|
|
@@ -130,4 +140,4 @@ function updateStats(state) {
|
|
|
130
140
|
state.stats.activeConnections = state.connections.size;
|
|
131
141
|
}
|
|
132
142
|
|
|
133
|
-
//# debugId=
|
|
143
|
+
//# debugId=08DBEA612F7F726864756E2164756E21
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @ricsam/isolate-daemon\n *\n * Node.js daemon for running isolated-vm runtimes accessible via IPC.\n */\n\nimport { createServer, type Server } from \"node:net\";\nimport { unlink } from \"node:fs/promises\";\nimport { handleConnection } from \"./connection.cjs\";\nimport type {\n DaemonOptions,\n DaemonHandle,\n DaemonState,\n DaemonStats,\n} from \"./types.cjs\";\n\nexport type { DaemonOptions, DaemonHandle, DaemonStats };\n\nconst DEFAULT_OPTIONS: Required<DaemonOptions> = {\n socketPath: \"/tmp/isolate-daemon.sock\",\n host: \"127.0.0.1\",\n port: 47891,\n maxIsolates: 100,\n defaultMemoryLimitMB: 128,\n};\n\n/**\n * Start the isolate daemon.\n *\n * @param options - Daemon configuration options\n * @returns Handle to control the daemon\n */\nexport async function startDaemon(\n options: DaemonOptions = {}\n): Promise<DaemonHandle> {\n const resolvedOptions: Required<DaemonOptions> = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n\n const state: DaemonState = {\n isolates: new Map(),\n connections: new Map(),\n stats: {\n activeIsolates: 0,\n activeConnections: 0,\n totalIsolatesCreated: 0,\n totalRequestsProcessed: 0,\n },\n options: resolvedOptions,\n namespacedRuntimes: new Map(),\n namespacedCreatesInFlight: new Set(),\n };\n\n const server = createServer((socket) => {\n handleConnection(socket, state);\n updateStats(state);\n });\n\n // Try to remove existing socket file\n if (resolvedOptions.socketPath) {\n try {\n await unlink(resolvedOptions.socketPath);\n } catch {\n // Ignore if doesn't exist\n }\n }\n\n // Start listening\n await new Promise<void>((resolve, reject) => {\n server.on(\"error\", reject);\n\n if (resolvedOptions.socketPath) {\n server.listen(resolvedOptions.socketPath, () => {\n server.removeListener(\"error\", reject);\n resolve();\n });\n } else {\n server.listen(resolvedOptions.port, resolvedOptions.host, () => {\n server.removeListener(\"error\", reject);\n resolve();\n });\n }\n });\n\n const address = resolvedOptions.socketPath\n ? resolvedOptions.socketPath\n : `${resolvedOptions.host}:${resolvedOptions.port}`;\n\n console.log(`Isolate daemon listening on ${address}`);\n\n return {\n address,\n getStats: () => ({\n ...state.stats,\n activeIsolates: state.isolates.size,\n activeConnections: state.connections.size,\n }),\n close: async () => {\n // Close all connections\n for (const [socket] of state.connections) {\n socket.destroy();\n }\n\n // Dispose all isolates\n for (const [, instance] of state.isolates) {\n try {\n instance.runtime.dispose();\n } catch {\n // Ignore\n }\n }\n\n state.isolates.clear();\n state.connections.clear();\n state.namespacedRuntimes.clear();\n\n // Close server\n await closeServer(server);\n\n // Remove socket file\n if (resolvedOptions.socketPath) {\n try {\n await unlink(resolvedOptions.socketPath);\n } catch {\n // Ignore\n }\n }\n\n console.log(\"Isolate daemon stopped\");\n },\n };\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close((err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n}\n\nfunction updateStats(state: DaemonState): void {\n state.stats.activeIsolates = state.isolates.size;\n state.stats.activeConnections = state.connections.size;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "08DBEA612F7F726864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
package/dist/cjs/types.cjs
CHANGED
|
@@ -2,23 +2,29 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
6
8
|
var __toCommonJS = (from) => {
|
|
7
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
8
10
|
if (entry)
|
|
9
11
|
return entry;
|
|
10
12
|
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
16
21
|
__moduleCache.set(from, entry);
|
|
17
22
|
return entry;
|
|
18
23
|
};
|
|
24
|
+
var __moduleCache;
|
|
19
25
|
|
|
20
26
|
// packages/isolate-daemon/src/types.ts
|
|
21
27
|
var exports_types = {};
|
|
22
28
|
module.exports = __toCommonJS(exports_types);
|
|
23
29
|
|
|
24
|
-
//# debugId=
|
|
30
|
+
//# debugId=5C509FE4BE77B71164756E2164756E21
|
package/dist/cjs/types.cjs.map
CHANGED
package/dist/mjs/connection.mjs
CHANGED
|
@@ -51,7 +51,9 @@ function handleConnection(socket, state) {
|
|
|
51
51
|
nextStreamId: 1,
|
|
52
52
|
activeStreams: new Map,
|
|
53
53
|
streamReceivers: new Map,
|
|
54
|
-
callbackStreamReceivers: new Map
|
|
54
|
+
callbackStreamReceivers: new Map,
|
|
55
|
+
dispatchAbortControllers: new Map,
|
|
56
|
+
earlyAbortedDispatches: new Set
|
|
55
57
|
};
|
|
56
58
|
state.connections.set(socket, connection);
|
|
57
59
|
const parser = createFrameParser();
|
|
@@ -68,6 +70,14 @@ function handleConnection(socket, state) {
|
|
|
68
70
|
}
|
|
69
71
|
});
|
|
70
72
|
socket.on("close", () => {
|
|
73
|
+
for (const streamId of Array.from(connection.activeStreams.keys())) {
|
|
74
|
+
closeActiveDownloadSession(connection, streamId);
|
|
75
|
+
}
|
|
76
|
+
for (const [, controller] of connection.dispatchAbortControllers) {
|
|
77
|
+
controller.abort();
|
|
78
|
+
}
|
|
79
|
+
connection.dispatchAbortControllers.clear();
|
|
80
|
+
connection.earlyAbortedDispatches.clear();
|
|
71
81
|
for (const isolateId of connection.isolates) {
|
|
72
82
|
const instance = state.isolates.get(isolateId);
|
|
73
83
|
if (instance) {
|
|
@@ -96,6 +106,22 @@ function sendMessage(socket, message) {
|
|
|
96
106
|
const frame = buildFrame(message);
|
|
97
107
|
socket.write(frame);
|
|
98
108
|
}
|
|
109
|
+
function closeActiveDownloadSession(connection, streamId) {
|
|
110
|
+
const session = connection.activeStreams.get(streamId);
|
|
111
|
+
if (!session) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
session.state = "closed";
|
|
115
|
+
if (session.creditResolver) {
|
|
116
|
+
session.creditResolver();
|
|
117
|
+
session.creditResolver = undefined;
|
|
118
|
+
}
|
|
119
|
+
if (session.cancelReader) {
|
|
120
|
+
session.cancelReader();
|
|
121
|
+
session.cancelReader = undefined;
|
|
122
|
+
}
|
|
123
|
+
connection.activeStreams.delete(streamId);
|
|
124
|
+
}
|
|
99
125
|
function sendError(socket, requestId, code, message, details) {
|
|
100
126
|
const response = {
|
|
101
127
|
type: MessageType.RESPONSE_ERROR,
|
|
@@ -129,6 +155,9 @@ async function handleMessage(message, connection, state) {
|
|
|
129
155
|
case MessageType.DISPATCH_REQUEST:
|
|
130
156
|
await handleDispatchRequest(message, connection, state);
|
|
131
157
|
break;
|
|
158
|
+
case MessageType.DISPATCH_REQUEST_ABORT:
|
|
159
|
+
handleDispatchRequestAbort(message, connection);
|
|
160
|
+
break;
|
|
132
161
|
case MessageType.CALLBACK_RESPONSE:
|
|
133
162
|
handleCallbackResponse(message, connection);
|
|
134
163
|
break;
|
|
@@ -738,7 +767,8 @@ async function handleCreateRuntime(message, connection, state) {
|
|
|
738
767
|
url,
|
|
739
768
|
method: init.method,
|
|
740
769
|
headers: init.headers,
|
|
741
|
-
body: init.rawBody
|
|
770
|
+
body: init.rawBody,
|
|
771
|
+
signalAborted: init.signal.aborted
|
|
742
772
|
};
|
|
743
773
|
const result = await invokeCallbackWithReconnect(callbackContext, () => callbackContext.fetch, [serialized], "Fetch", invokeClientCallback);
|
|
744
774
|
if (result && typeof result === "object" && result.__streamingResponse) {
|
|
@@ -978,6 +1008,12 @@ async function handleDispatchRequest(message, connection, state) {
|
|
|
978
1008
|
return;
|
|
979
1009
|
}
|
|
980
1010
|
instance.lastActivity = Date.now();
|
|
1011
|
+
const dispatchAbortController = new AbortController;
|
|
1012
|
+
connection.dispatchAbortControllers.set(message.requestId, dispatchAbortController);
|
|
1013
|
+
if (connection.earlyAbortedDispatches.has(message.requestId) || message.request.signalAborted) {
|
|
1014
|
+
dispatchAbortController.abort();
|
|
1015
|
+
connection.earlyAbortedDispatches.delete(message.requestId);
|
|
1016
|
+
}
|
|
981
1017
|
try {
|
|
982
1018
|
let requestBody = null;
|
|
983
1019
|
if (message.request.bodyStreamId !== undefined) {
|
|
@@ -988,9 +1024,12 @@ async function handleDispatchRequest(message, connection, state) {
|
|
|
988
1024
|
const request = new Request(message.request.url, {
|
|
989
1025
|
method: message.request.method,
|
|
990
1026
|
headers: message.request.headers,
|
|
991
|
-
body: requestBody
|
|
1027
|
+
body: requestBody,
|
|
1028
|
+
signal: dispatchAbortController.signal
|
|
1029
|
+
});
|
|
1030
|
+
const response = await instance.runtime.fetch.dispatchRequest(request, {
|
|
1031
|
+
signal: dispatchAbortController.signal
|
|
992
1032
|
});
|
|
993
|
-
const response = await instance.runtime.fetch.dispatchRequest(request);
|
|
994
1033
|
if (response.body) {
|
|
995
1034
|
await sendStreamedResponse(connection, message.requestId, response);
|
|
996
1035
|
} else {
|
|
@@ -1010,7 +1049,18 @@ async function handleDispatchRequest(message, connection, state) {
|
|
|
1010
1049
|
} catch (err) {
|
|
1011
1050
|
const error = err;
|
|
1012
1051
|
sendError(connection.socket, message.requestId, ErrorCode.SCRIPT_ERROR, error.message, { name: error.name, stack: error.stack });
|
|
1052
|
+
} finally {
|
|
1053
|
+
connection.dispatchAbortControllers.delete(message.requestId);
|
|
1054
|
+
connection.earlyAbortedDispatches.delete(message.requestId);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
function handleDispatchRequestAbort(message, connection) {
|
|
1058
|
+
const controller = connection.dispatchAbortControllers.get(message.targetRequestId);
|
|
1059
|
+
if (controller) {
|
|
1060
|
+
controller.abort();
|
|
1061
|
+
return;
|
|
1013
1062
|
}
|
|
1063
|
+
connection.earlyAbortedDispatches.add(message.targetRequestId);
|
|
1014
1064
|
}
|
|
1015
1065
|
function receiveStreamedBody(connection, streamId) {
|
|
1016
1066
|
return new Promise((resolve, reject) => {
|
|
@@ -1331,8 +1381,7 @@ function handleStreamError(message, connection) {
|
|
|
1331
1381
|
}
|
|
1332
1382
|
const session = connection.activeStreams.get(message.streamId);
|
|
1333
1383
|
if (session) {
|
|
1334
|
-
|
|
1335
|
-
connection.activeStreams.delete(message.streamId);
|
|
1384
|
+
closeActiveDownloadSession(connection, message.streamId);
|
|
1336
1385
|
}
|
|
1337
1386
|
const callbackReceiver = connection.callbackStreamReceivers.get(message.streamId);
|
|
1338
1387
|
if (callbackReceiver && callbackReceiver.state === "active") {
|
|
@@ -1451,6 +1500,7 @@ function waitForCredit(session) {
|
|
|
1451
1500
|
});
|
|
1452
1501
|
}
|
|
1453
1502
|
async function sendStreamedResponse(connection, requestId, response) {
|
|
1503
|
+
const SEND_LOOP_YIELD_BYTES = 64 * 1024;
|
|
1454
1504
|
const streamId = connection.nextStreamId++;
|
|
1455
1505
|
const headers = [];
|
|
1456
1506
|
response.headers.forEach((value, key) => {
|
|
@@ -1486,38 +1536,61 @@ async function sendStreamedResponse(connection, requestId, response) {
|
|
|
1486
1536
|
};
|
|
1487
1537
|
connection.activeStreams.set(streamId, session);
|
|
1488
1538
|
const reader = response.body.getReader();
|
|
1539
|
+
session.cancelReader = () => {
|
|
1540
|
+
reader.cancel("Stream cancelled by client").catch(() => {});
|
|
1541
|
+
};
|
|
1542
|
+
let cancelledByClient = false;
|
|
1543
|
+
let bytesSinceYield = 0;
|
|
1544
|
+
let chunksSinceYield = 0;
|
|
1489
1545
|
try {
|
|
1490
|
-
|
|
1491
|
-
while (
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
const
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1546
|
+
streamLoop:
|
|
1547
|
+
while (true) {
|
|
1548
|
+
while (session.credit < STREAM_CHUNK_SIZE && session.state === "active") {
|
|
1549
|
+
await waitForCredit(session);
|
|
1550
|
+
}
|
|
1551
|
+
if (session.state !== "active") {
|
|
1552
|
+
cancelledByClient = true;
|
|
1553
|
+
break;
|
|
1554
|
+
}
|
|
1555
|
+
const { done, value } = await reader.read();
|
|
1556
|
+
if (done) {
|
|
1557
|
+
const endMsg = {
|
|
1558
|
+
type: MessageType.RESPONSE_STREAM_END,
|
|
1559
|
+
requestId,
|
|
1560
|
+
streamId
|
|
1561
|
+
};
|
|
1562
|
+
sendMessage(connection.socket, endMsg);
|
|
1563
|
+
break;
|
|
1564
|
+
}
|
|
1565
|
+
for (let offset = 0;offset < value.length; offset += STREAM_CHUNK_SIZE) {
|
|
1566
|
+
const chunk = value.slice(offset, offset + STREAM_CHUNK_SIZE);
|
|
1567
|
+
const chunkMsg = {
|
|
1568
|
+
type: MessageType.RESPONSE_STREAM_CHUNK,
|
|
1569
|
+
requestId,
|
|
1570
|
+
streamId,
|
|
1571
|
+
chunk
|
|
1572
|
+
};
|
|
1573
|
+
sendMessage(connection.socket, chunkMsg);
|
|
1574
|
+
const creditCost = Math.max(chunk.length, STREAM_CHUNK_SIZE);
|
|
1575
|
+
session.credit -= creditCost;
|
|
1576
|
+
session.bytesTransferred += chunk.length;
|
|
1577
|
+
bytesSinceYield += chunk.length;
|
|
1578
|
+
chunksSinceYield += 1;
|
|
1579
|
+
if (chunk.length < 1024 || bytesSinceYield >= SEND_LOOP_YIELD_BYTES || chunksSinceYield >= 256) {
|
|
1580
|
+
bytesSinceYield = 0;
|
|
1581
|
+
chunksSinceYield = 0;
|
|
1582
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
1583
|
+
if (session.state !== "active") {
|
|
1584
|
+
cancelledByClient = true;
|
|
1585
|
+
break streamLoop;
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1518
1589
|
}
|
|
1519
|
-
}
|
|
1520
1590
|
} catch (err) {
|
|
1591
|
+
if (cancelledByClient || session.state !== "active") {
|
|
1592
|
+
return;
|
|
1593
|
+
}
|
|
1521
1594
|
const errorMsg = {
|
|
1522
1595
|
type: MessageType.STREAM_ERROR,
|
|
1523
1596
|
streamId,
|
|
@@ -1525,8 +1598,15 @@ async function sendStreamedResponse(connection, requestId, response) {
|
|
|
1525
1598
|
};
|
|
1526
1599
|
sendMessage(connection.socket, errorMsg);
|
|
1527
1600
|
} finally {
|
|
1601
|
+
if (cancelledByClient) {
|
|
1602
|
+
await Promise.race([
|
|
1603
|
+
reader.cancel("Stream cancelled by client").catch(() => {}),
|
|
1604
|
+
new Promise((resolve) => setTimeout(resolve, 50))
|
|
1605
|
+
]);
|
|
1606
|
+
}
|
|
1607
|
+
session.cancelReader = undefined;
|
|
1528
1608
|
reader.releaseLock();
|
|
1529
|
-
connection
|
|
1609
|
+
closeActiveDownloadSession(connection, streamId);
|
|
1530
1610
|
}
|
|
1531
1611
|
}
|
|
1532
1612
|
async function handleRunTests(message, connection, state) {
|
|
@@ -1646,4 +1726,4 @@ export {
|
|
|
1646
1726
|
handleConnection
|
|
1647
1727
|
};
|
|
1648
1728
|
|
|
1649
|
-
//# debugId=
|
|
1729
|
+
//# debugId=1FC256F121C44C4364756E2164756E21
|