@ricsam/isolate-daemon 0.0.1 → 0.1.0
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/README.md +36 -31
- package/bin/daemon.js +98 -0
- package/dist/cjs/callback-fs-handler.cjs +314 -0
- package/dist/cjs/callback-fs-handler.cjs.map +10 -0
- package/dist/cjs/connection.cjs +580 -0
- package/dist/cjs/connection.cjs.map +10 -0
- package/dist/cjs/index.cjs +132 -0
- package/dist/cjs/index.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/types.cjs +26 -0
- package/dist/cjs/types.cjs.map +9 -0
- package/dist/mjs/callback-fs-handler.mjs +283 -0
- package/dist/mjs/callback-fs-handler.mjs.map +10 -0
- package/dist/mjs/connection.mjs +561 -0
- package/dist/mjs/connection.mjs.map +10 -0
- package/dist/mjs/index.mjs +101 -0
- package/dist/mjs/index.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/types.mjs +3 -0
- package/dist/mjs/types.mjs.map +9 -0
- package/dist/types/callback-fs-handler.d.ts +25 -0
- package/dist/types/connection.d.ts +9 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/types.d.ts +91 -0
- package/package.json +55 -6
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/isolate-daemon/src/index.ts
|
|
3
|
+
import { createServer } from "net";
|
|
4
|
+
import { unlink } from "fs/promises";
|
|
5
|
+
import { handleConnection } from "./connection.mjs";
|
|
6
|
+
var DEFAULT_OPTIONS = {
|
|
7
|
+
socketPath: "/tmp/isolate-daemon.sock",
|
|
8
|
+
host: "127.0.0.1",
|
|
9
|
+
port: 47891,
|
|
10
|
+
maxIsolates: 100,
|
|
11
|
+
defaultMemoryLimit: 128
|
|
12
|
+
};
|
|
13
|
+
async function startDaemon(options = {}) {
|
|
14
|
+
const resolvedOptions = {
|
|
15
|
+
...DEFAULT_OPTIONS,
|
|
16
|
+
...options
|
|
17
|
+
};
|
|
18
|
+
const state = {
|
|
19
|
+
isolates: new Map,
|
|
20
|
+
connections: new Map,
|
|
21
|
+
stats: {
|
|
22
|
+
activeIsolates: 0,
|
|
23
|
+
activeConnections: 0,
|
|
24
|
+
totalIsolatesCreated: 0,
|
|
25
|
+
totalRequestsProcessed: 0
|
|
26
|
+
},
|
|
27
|
+
options: resolvedOptions
|
|
28
|
+
};
|
|
29
|
+
const server = createServer((socket) => {
|
|
30
|
+
handleConnection(socket, state);
|
|
31
|
+
updateStats(state);
|
|
32
|
+
});
|
|
33
|
+
if (resolvedOptions.socketPath) {
|
|
34
|
+
try {
|
|
35
|
+
await unlink(resolvedOptions.socketPath);
|
|
36
|
+
} catch {}
|
|
37
|
+
}
|
|
38
|
+
await new Promise((resolve, reject) => {
|
|
39
|
+
server.on("error", reject);
|
|
40
|
+
if (resolvedOptions.socketPath) {
|
|
41
|
+
server.listen(resolvedOptions.socketPath, () => {
|
|
42
|
+
server.removeListener("error", reject);
|
|
43
|
+
resolve();
|
|
44
|
+
});
|
|
45
|
+
} else {
|
|
46
|
+
server.listen(resolvedOptions.port, resolvedOptions.host, () => {
|
|
47
|
+
server.removeListener("error", reject);
|
|
48
|
+
resolve();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const address = resolvedOptions.socketPath ? resolvedOptions.socketPath : `${resolvedOptions.host}:${resolvedOptions.port}`;
|
|
53
|
+
console.log(`Isolate daemon listening on ${address}`);
|
|
54
|
+
return {
|
|
55
|
+
address,
|
|
56
|
+
getStats: () => ({
|
|
57
|
+
...state.stats,
|
|
58
|
+
activeIsolates: state.isolates.size,
|
|
59
|
+
activeConnections: state.connections.size
|
|
60
|
+
}),
|
|
61
|
+
close: async () => {
|
|
62
|
+
for (const [socket] of state.connections) {
|
|
63
|
+
socket.destroy();
|
|
64
|
+
}
|
|
65
|
+
for (const [, instance] of state.isolates) {
|
|
66
|
+
try {
|
|
67
|
+
instance.runtime.dispose();
|
|
68
|
+
} catch {}
|
|
69
|
+
}
|
|
70
|
+
state.isolates.clear();
|
|
71
|
+
state.connections.clear();
|
|
72
|
+
await closeServer(server);
|
|
73
|
+
if (resolvedOptions.socketPath) {
|
|
74
|
+
try {
|
|
75
|
+
await unlink(resolvedOptions.socketPath);
|
|
76
|
+
} catch {}
|
|
77
|
+
}
|
|
78
|
+
console.log("Isolate daemon stopped");
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function closeServer(server) {
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
server.close((err) => {
|
|
85
|
+
if (err) {
|
|
86
|
+
reject(err);
|
|
87
|
+
} else {
|
|
88
|
+
resolve();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function updateStats(state) {
|
|
94
|
+
state.stats.activeIsolates = state.isolates.size;
|
|
95
|
+
state.stats.activeConnections = state.connections.size;
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
startDaemon
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
//# debugId=FCA8B2807BBD0FBF64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
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.mjs\";\nimport type {\n DaemonOptions,\n DaemonHandle,\n DaemonState,\n DaemonStats,\n} from \"./types.mjs\";\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 defaultMemoryLimit: 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 };\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\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
|
+
],
|
|
7
|
+
"mappings": ";;AAMA;AACA;AACA;AAUA,IAAM,kBAA2C;AAAA,EAC/C,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,oBAAoB;AACtB;AAQA,eAAsB,WAAW,CAC/B,UAAyB,CAAC,GACH;AAAA,EACvB,MAAM,kBAA2C;AAAA,OAC5C;AAAA,OACA;AAAA,EACL;AAAA,EAEA,MAAM,QAAqB;AAAA,IACzB,UAAU,IAAI;AAAA,IACd,aAAa,IAAI;AAAA,IACjB,OAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC1B;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EAEA,MAAM,SAAS,aAAa,CAAC,WAAW;AAAA,IACtC,iBAAiB,QAAQ,KAAK;AAAA,IAC9B,YAAY,KAAK;AAAA,GAClB;AAAA,EAGD,IAAI,gBAAgB,YAAY;AAAA,IAC9B,IAAI;AAAA,MACF,MAAM,OAAO,gBAAgB,UAAU;AAAA,MACvC,MAAM;AAAA,EAGV;AAAA,EAGA,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,IAC3C,OAAO,GAAG,SAAS,MAAM;AAAA,IAEzB,IAAI,gBAAgB,YAAY;AAAA,MAC9B,OAAO,OAAO,gBAAgB,YAAY,MAAM;AAAA,QAC9C,OAAO,eAAe,SAAS,MAAM;AAAA,QACrC,QAAQ;AAAA,OACT;AAAA,IACH,EAAO;AAAA,MACL,OAAO,OAAO,gBAAgB,MAAM,gBAAgB,MAAM,MAAM;AAAA,QAC9D,OAAO,eAAe,SAAS,MAAM;AAAA,QACrC,QAAQ;AAAA,OACT;AAAA;AAAA,GAEJ;AAAA,EAED,MAAM,UAAU,gBAAgB,aAC5B,gBAAgB,aAChB,GAAG,gBAAgB,QAAQ,gBAAgB;AAAA,EAE/C,QAAQ,IAAI,+BAA+B,SAAS;AAAA,EAEpD,OAAO;AAAA,IACL;AAAA,IACA,UAAU,OAAO;AAAA,SACZ,MAAM;AAAA,MACT,gBAAgB,MAAM,SAAS;AAAA,MAC/B,mBAAmB,MAAM,YAAY;AAAA,IACvC;AAAA,IACA,OAAO,YAAY;AAAA,MAEjB,YAAY,WAAW,MAAM,aAAa;AAAA,QACxC,OAAO,QAAQ;AAAA,MACjB;AAAA,MAGA,cAAc,aAAa,MAAM,UAAU;AAAA,QACzC,IAAI;AAAA,UACF,SAAS,QAAQ,QAAQ;AAAA,UACzB,MAAM;AAAA,MAGV;AAAA,MAEA,MAAM,SAAS,MAAM;AAAA,MACrB,MAAM,YAAY,MAAM;AAAA,MAGxB,MAAM,YAAY,MAAM;AAAA,MAGxB,IAAI,gBAAgB,YAAY;AAAA,QAC9B,IAAI;AAAA,UACF,MAAM,OAAO,gBAAgB,UAAU;AAAA,UACvC,MAAM;AAAA,MAGV;AAAA,MAEA,QAAQ,IAAI,wBAAwB;AAAA;AAAA,EAExC;AAAA;AAGF,SAAS,WAAW,CAAC,QAA+B;AAAA,EAClD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,OAAO,MAAM,CAAC,QAAQ;AAAA,MACpB,IAAI,KAAK;AAAA,QACP,OAAO,GAAG;AAAA,MACZ,EAAO;AAAA,QACL,QAAQ;AAAA;AAAA,KAEX;AAAA,GACF;AAAA;AAGH,SAAS,WAAW,CAAC,OAA0B;AAAA,EAC7C,MAAM,MAAM,iBAAiB,MAAM,SAAS;AAAA,EAC5C,MAAM,MAAM,oBAAoB,MAAM,YAAY;AAAA;",
|
|
8
|
+
"debugId": "FCA8B2807BBD0FBF64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback-based FileSystemHandler adapter.
|
|
3
|
+
*
|
|
4
|
+
* Adapts simple client callbacks (readFile, writeFile, etc.) to the
|
|
5
|
+
* FileSystemHandler interface used by @ricsam/isolate-fs.
|
|
6
|
+
*/
|
|
7
|
+
import type { FileSystemHandler } from "@ricsam/isolate-fs";
|
|
8
|
+
import type { FsCallbackRegistrations } from "@ricsam/isolate-protocol";
|
|
9
|
+
import type { ConnectionState } from "./types.ts";
|
|
10
|
+
interface InvokeClientCallback {
|
|
11
|
+
(connection: ConnectionState, callbackId: number, args: unknown[]): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
interface CallbackFsHandlerOptions {
|
|
14
|
+
connection: ConnectionState;
|
|
15
|
+
callbacks: FsCallbackRegistrations;
|
|
16
|
+
invokeClientCallback: InvokeClientCallback;
|
|
17
|
+
basePath?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a FileSystemHandler that invokes client callbacks.
|
|
21
|
+
*
|
|
22
|
+
* Maps WHATWG FileSystem API operations to simple POSIX-like callbacks.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createCallbackFileSystemHandler(options: CallbackFsHandlerOptions): FileSystemHandler;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection handling for the isolate daemon.
|
|
3
|
+
*/
|
|
4
|
+
import type { Socket } from "node:net";
|
|
5
|
+
import type { DaemonState } from "./types.ts";
|
|
6
|
+
/**
|
|
7
|
+
* Handle a new client connection.
|
|
8
|
+
*/
|
|
9
|
+
export declare function handleConnection(socket: Socket, state: DaemonState): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ricsam/isolate-daemon
|
|
3
|
+
*
|
|
4
|
+
* Node.js daemon for running isolated-vm runtimes accessible via IPC.
|
|
5
|
+
*/
|
|
6
|
+
import type { DaemonOptions, DaemonHandle, DaemonStats } from "./types.ts";
|
|
7
|
+
export type { DaemonOptions, DaemonHandle, DaemonStats };
|
|
8
|
+
/**
|
|
9
|
+
* Start the isolate daemon.
|
|
10
|
+
*
|
|
11
|
+
* @param options - Daemon configuration options
|
|
12
|
+
* @returns Handle to control the daemon
|
|
13
|
+
*/
|
|
14
|
+
export declare function startDaemon(options?: DaemonOptions): Promise<DaemonHandle>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal types for the isolate daemon.
|
|
3
|
+
*/
|
|
4
|
+
import type { Socket } from "node:net";
|
|
5
|
+
import type { RuntimeHandle } from "@ricsam/isolate-runtime";
|
|
6
|
+
import type { CallbackRegistration } from "@ricsam/isolate-protocol";
|
|
7
|
+
import type { Browser, BrowserContext, Page } from "playwright";
|
|
8
|
+
import type { PlaywrightHandle } from "@ricsam/isolate-playwright";
|
|
9
|
+
/**
|
|
10
|
+
* Options for starting the daemon.
|
|
11
|
+
*/
|
|
12
|
+
export interface DaemonOptions {
|
|
13
|
+
/** Unix socket path (preferred) */
|
|
14
|
+
socketPath?: string;
|
|
15
|
+
/** TCP host (fallback) */
|
|
16
|
+
host?: string;
|
|
17
|
+
/** TCP port (fallback) */
|
|
18
|
+
port?: number;
|
|
19
|
+
/** Maximum number of isolates */
|
|
20
|
+
maxIsolates?: number;
|
|
21
|
+
/** Default memory limit for isolates (MB) */
|
|
22
|
+
defaultMemoryLimit?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle returned by startDaemon.
|
|
26
|
+
*/
|
|
27
|
+
export interface DaemonHandle {
|
|
28
|
+
/** Close the daemon and all connections */
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
/** Get daemon statistics */
|
|
31
|
+
getStats(): DaemonStats;
|
|
32
|
+
/** Socket path or address the daemon is listening on */
|
|
33
|
+
address: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Daemon statistics.
|
|
37
|
+
*/
|
|
38
|
+
export interface DaemonStats {
|
|
39
|
+
activeIsolates: number;
|
|
40
|
+
activeConnections: number;
|
|
41
|
+
totalIsolatesCreated: number;
|
|
42
|
+
totalRequestsProcessed: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Internal state for a single isolate instance.
|
|
46
|
+
*/
|
|
47
|
+
export interface IsolateInstance {
|
|
48
|
+
isolateId: string;
|
|
49
|
+
runtime: RuntimeHandle;
|
|
50
|
+
ownerConnection: Socket;
|
|
51
|
+
callbacks: Map<number, CallbackRegistration>;
|
|
52
|
+
createdAt: number;
|
|
53
|
+
lastActivity: number;
|
|
54
|
+
/** Playwright browser instance (if setup) */
|
|
55
|
+
browser?: Browser;
|
|
56
|
+
/** Playwright browser context (if setup) */
|
|
57
|
+
browserContext?: BrowserContext;
|
|
58
|
+
/** Playwright page (if setup) */
|
|
59
|
+
page?: Page;
|
|
60
|
+
/** Playwright handle for event management (if setup) */
|
|
61
|
+
playwrightHandle?: PlaywrightHandle;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Pending request waiting for response.
|
|
65
|
+
*/
|
|
66
|
+
export interface PendingRequest {
|
|
67
|
+
resolve: (result: unknown) => void;
|
|
68
|
+
reject: (error: Error) => void;
|
|
69
|
+
timeoutId?: ReturnType<typeof setTimeout>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Internal state for a client connection.
|
|
73
|
+
*/
|
|
74
|
+
export interface ConnectionState {
|
|
75
|
+
socket: Socket;
|
|
76
|
+
isolates: Set<string>;
|
|
77
|
+
pendingRequests: Map<number, PendingRequest>;
|
|
78
|
+
pendingCallbacks: Map<number, PendingRequest>;
|
|
79
|
+
nextRequestId: number;
|
|
80
|
+
nextCallbackId: number;
|
|
81
|
+
nextStreamId: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Global daemon state.
|
|
85
|
+
*/
|
|
86
|
+
export interface DaemonState {
|
|
87
|
+
isolates: Map<string, IsolateInstance>;
|
|
88
|
+
connections: Map<Socket, ConnectionState>;
|
|
89
|
+
stats: DaemonStats;
|
|
90
|
+
options: Required<DaemonOptions>;
|
|
91
|
+
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,59 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ricsam/isolate-daemon",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "./dist/cjs/index.cjs",
|
|
5
|
+
"types": "./dist/types/index.d.ts",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/types/index.d.ts",
|
|
9
|
+
"require": "./dist/cjs/index.cjs",
|
|
10
|
+
"import": "./dist/mjs/index.mjs"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"isolate-daemon": "./bin/daemon.js"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"test": "node --test --experimental-strip-types 'src/**/*.test.ts'",
|
|
19
|
+
"typecheck": "tsc --noEmit"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@ricsam/isolate-protocol": "*",
|
|
23
|
+
"@ricsam/isolate-runtime": "*",
|
|
24
|
+
"@ricsam/isolate-fs": "*",
|
|
25
|
+
"@ricsam/isolate-test-environment": "*",
|
|
26
|
+
"@ricsam/isolate-playwright": "*",
|
|
27
|
+
"playwright": "^1"
|
|
28
|
+
},
|
|
29
|
+
"author": "Richard Samuelsson",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/ricsam/isolate.git"
|
|
34
|
+
},
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/ricsam/isolate/issues"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/ricsam/isolate#readme",
|
|
5
39
|
"keywords": [
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
40
|
+
"isolated-vm",
|
|
41
|
+
"sandbox",
|
|
42
|
+
"javascript",
|
|
43
|
+
"runtime",
|
|
44
|
+
"fetch",
|
|
45
|
+
"filesystem",
|
|
46
|
+
"streams",
|
|
47
|
+
"v8",
|
|
48
|
+
"isolate"
|
|
49
|
+
],
|
|
50
|
+
"description": "Node.js daemon server for running isolated-vm runtimes via IPC",
|
|
51
|
+
"module": "./dist/mjs/index.mjs",
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist",
|
|
57
|
+
"README.md"
|
|
9
58
|
]
|
|
10
|
-
}
|
|
59
|
+
}
|