@ricsam/isolate 0.1.0 → 0.1.2
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 +254 -0
- package/dist/cjs/bridge/diagnostics.cjs +2 -2
- package/dist/cjs/bridge/diagnostics.cjs.map +1 -1
- package/dist/cjs/bridge/legacy-adapters.cjs +2 -2
- package/dist/cjs/bridge/legacy-adapters.cjs.map +1 -1
- package/dist/cjs/bridge/request-context.cjs +2 -2
- package/dist/cjs/bridge/request-context.cjs.map +1 -1
- package/dist/cjs/bridge/runtime-bindings.cjs +2 -2
- package/dist/cjs/bridge/runtime-bindings.cjs.map +1 -1
- package/dist/cjs/browser/browser-runtime.cjs +2 -2
- package/dist/cjs/browser/browser-runtime.cjs.map +1 -1
- package/dist/cjs/daemon.cjs +2 -2
- package/dist/cjs/daemon.cjs.map +1 -1
- package/dist/cjs/files/index.cjs +2 -2
- package/dist/cjs/files/index.cjs.map +1 -1
- package/dist/cjs/host/create-isolate-host.cjs +4 -4
- package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
- package/dist/cjs/host/index.cjs +2 -2
- package/dist/cjs/host/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/internal/client/connection.cjs +2 -2
- package/dist/cjs/internal/client/connection.cjs.map +1 -1
- package/dist/cjs/internal/client/index.cjs +2 -2
- package/dist/cjs/internal/client/index.cjs.map +1 -1
- package/dist/cjs/internal/client/types.cjs +2 -2
- package/dist/cjs/internal/client/types.cjs.map +1 -1
- package/dist/cjs/internal/console/index.cjs +2 -2
- package/dist/cjs/internal/console/index.cjs.map +1 -1
- package/dist/cjs/internal/console/utils.cjs +2 -2
- package/dist/cjs/internal/console/utils.cjs.map +1 -1
- package/dist/cjs/internal/core/index.cjs +2 -2
- package/dist/cjs/internal/core/index.cjs.map +1 -1
- package/dist/cjs/internal/crypto/index.cjs +2 -2
- package/dist/cjs/internal/crypto/index.cjs.map +1 -1
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs +2 -2
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +1 -1
- package/dist/cjs/internal/daemon/connection.cjs +2 -2
- package/dist/cjs/internal/daemon/connection.cjs.map +1 -1
- package/dist/cjs/internal/daemon/daemon.cjs +2 -2
- package/dist/cjs/internal/daemon/daemon.cjs.map +1 -1
- package/dist/cjs/internal/daemon/index.cjs +2 -2
- package/dist/cjs/internal/daemon/index.cjs.map +1 -1
- package/dist/cjs/internal/daemon/runtime-pool.cjs +2 -2
- package/dist/cjs/internal/daemon/runtime-pool.cjs.map +1 -1
- package/dist/cjs/internal/daemon/types.cjs +2 -2
- package/dist/cjs/internal/daemon/types.cjs.map +1 -1
- package/dist/cjs/internal/encoding/index.cjs +2 -2
- package/dist/cjs/internal/encoding/index.cjs.map +1 -1
- package/dist/cjs/internal/fetch/consistency/origins.cjs +2 -2
- package/dist/cjs/internal/fetch/consistency/origins.cjs.map +1 -1
- package/dist/cjs/internal/fetch/index.cjs +2 -2
- package/dist/cjs/internal/fetch/index.cjs.map +1 -1
- package/dist/cjs/internal/fetch/stream-state.cjs +2 -2
- package/dist/cjs/internal/fetch/stream-state.cjs.map +1 -1
- package/dist/cjs/internal/fs/index.cjs +2 -2
- package/dist/cjs/internal/fs/index.cjs.map +1 -1
- package/dist/cjs/internal/fs/node-adapter.cjs +2 -2
- package/dist/cjs/internal/fs/node-adapter.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/bundle.cjs +2 -2
- package/dist/cjs/internal/module-loader/bundle.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/index.cjs +2 -2
- package/dist/cjs/internal/module-loader/index.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/mappings.cjs +2 -2
- package/dist/cjs/internal/module-loader/mappings.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/resolve.cjs +2 -2
- package/dist/cjs/internal/module-loader/resolve.cjs.map +1 -1
- package/dist/cjs/internal/module-loader/strip-types.cjs +2 -2
- package/dist/cjs/internal/module-loader/strip-types.cjs.map +1 -1
- package/dist/cjs/internal/path/index.cjs +2 -2
- package/dist/cjs/internal/path/index.cjs.map +1 -1
- package/dist/cjs/internal/playwright/client.cjs +2 -2
- package/dist/cjs/internal/playwright/client.cjs.map +1 -1
- package/dist/cjs/internal/playwright/handler.cjs +2 -2
- package/dist/cjs/internal/playwright/handler.cjs.map +1 -1
- package/dist/cjs/internal/playwright/index.cjs +2 -2
- package/dist/cjs/internal/playwright/index.cjs.map +1 -1
- package/dist/cjs/internal/playwright/types.cjs +2 -2
- package/dist/cjs/internal/playwright/types.cjs.map +1 -1
- package/dist/cjs/internal/protocol/codec.cjs +2 -2
- package/dist/cjs/internal/protocol/codec.cjs.map +1 -1
- package/dist/cjs/internal/protocol/framing.cjs +2 -2
- package/dist/cjs/internal/protocol/framing.cjs.map +1 -1
- package/dist/cjs/internal/protocol/index.cjs +2 -2
- package/dist/cjs/internal/protocol/index.cjs.map +1 -1
- package/dist/cjs/internal/protocol/marshalValue.cjs +2 -2
- package/dist/cjs/internal/protocol/marshalValue.cjs.map +1 -1
- package/dist/cjs/internal/protocol/serialization.cjs +2 -2
- package/dist/cjs/internal/protocol/serialization.cjs.map +1 -1
- package/dist/cjs/internal/protocol/types.cjs +2 -2
- package/dist/cjs/internal/protocol/types.cjs.map +1 -1
- package/dist/cjs/internal/runtime/index.cjs +2 -2
- package/dist/cjs/internal/runtime/index.cjs.map +1 -1
- package/dist/cjs/internal/server/index.cjs +2 -2
- package/dist/cjs/internal/server/index.cjs.map +1 -1
- package/dist/cjs/internal/test-environment/index.cjs +2 -2
- package/dist/cjs/internal/test-environment/index.cjs.map +1 -1
- package/dist/cjs/internal/timers/index.cjs +2 -2
- package/dist/cjs/internal/timers/index.cjs.map +1 -1
- package/dist/cjs/internal/transform/index.cjs +2 -2
- package/dist/cjs/internal/transform/index.cjs.map +1 -1
- package/dist/cjs/internal/typecheck/index.cjs +2 -2
- package/dist/cjs/internal/typecheck/index.cjs.map +1 -1
- package/dist/cjs/internal/typecheck/isolate-types.cjs +2 -2
- package/dist/cjs/internal/typecheck/isolate-types.cjs.map +1 -1
- package/dist/cjs/internal/typecheck/typecheck.cjs +2 -2
- package/dist/cjs/internal/typecheck/typecheck.cjs.map +1 -1
- package/dist/cjs/modules/index.cjs +11 -4
- package/dist/cjs/modules/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/runtime/script-runtime.cjs +2 -2
- package/dist/cjs/runtime/script-runtime.cjs.map +1 -1
- package/dist/cjs/server/app-server.cjs +2 -2
- package/dist/cjs/server/app-server.cjs.map +1 -1
- package/dist/cjs/testing/integration-helpers.cjs +2 -2
- package/dist/cjs/testing/integration-helpers.cjs.map +1 -1
- package/dist/cjs/typecheck/index.cjs +2 -2
- package/dist/cjs/typecheck/index.cjs.map +1 -1
- package/dist/cjs/types.cjs +2 -2
- package/dist/cjs/types.cjs.map +1 -1
- package/dist/mjs/bridge/diagnostics.mjs +2 -2
- package/dist/mjs/bridge/diagnostics.mjs.map +1 -1
- package/dist/mjs/bridge/legacy-adapters.mjs +2 -2
- package/dist/mjs/bridge/legacy-adapters.mjs.map +1 -1
- package/dist/mjs/bridge/request-context.mjs +2 -2
- package/dist/mjs/bridge/request-context.mjs.map +1 -1
- package/dist/mjs/bridge/runtime-bindings.mjs +2 -2
- package/dist/mjs/bridge/runtime-bindings.mjs.map +1 -1
- package/dist/mjs/browser/browser-runtime.mjs +2 -2
- package/dist/mjs/browser/browser-runtime.mjs.map +1 -1
- package/dist/mjs/daemon.mjs +2 -2
- package/dist/mjs/daemon.mjs.map +1 -1
- package/dist/mjs/files/index.mjs +2 -2
- package/dist/mjs/files/index.mjs.map +1 -1
- package/dist/mjs/host/create-isolate-host.mjs +3 -3
- package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
- package/dist/mjs/host/index.mjs +2 -2
- package/dist/mjs/host/index.mjs.map +1 -1
- package/dist/mjs/index.mjs +2 -2
- package/dist/mjs/index.mjs.map +1 -1
- package/dist/mjs/internal/client/connection.mjs +2 -2
- package/dist/mjs/internal/client/connection.mjs.map +1 -1
- package/dist/mjs/internal/client/index.mjs +2 -2
- package/dist/mjs/internal/client/index.mjs.map +1 -1
- package/dist/mjs/internal/client/types.mjs +1 -1
- package/dist/mjs/internal/client/types.mjs.map +1 -1
- package/dist/mjs/internal/console/index.mjs +2 -2
- package/dist/mjs/internal/console/index.mjs.map +1 -1
- package/dist/mjs/internal/console/utils.mjs +2 -2
- package/dist/mjs/internal/console/utils.mjs.map +1 -1
- package/dist/mjs/internal/core/index.mjs +2 -2
- package/dist/mjs/internal/core/index.mjs.map +1 -1
- package/dist/mjs/internal/crypto/index.mjs +2 -2
- package/dist/mjs/internal/crypto/index.mjs.map +1 -1
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs +2 -2
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +1 -1
- package/dist/mjs/internal/daemon/connection.mjs +2 -2
- package/dist/mjs/internal/daemon/connection.mjs.map +1 -1
- package/dist/mjs/internal/daemon/daemon.mjs +2 -2
- package/dist/mjs/internal/daemon/daemon.mjs.map +1 -1
- package/dist/mjs/internal/daemon/index.mjs +2 -2
- package/dist/mjs/internal/daemon/index.mjs.map +1 -1
- package/dist/mjs/internal/daemon/runtime-pool.mjs +2 -2
- package/dist/mjs/internal/daemon/runtime-pool.mjs.map +1 -1
- package/dist/mjs/internal/daemon/types.mjs +1 -1
- package/dist/mjs/internal/daemon/types.mjs.map +1 -1
- package/dist/mjs/internal/encoding/index.mjs +2 -2
- package/dist/mjs/internal/encoding/index.mjs.map +1 -1
- package/dist/mjs/internal/fetch/consistency/origins.mjs +2 -2
- package/dist/mjs/internal/fetch/consistency/origins.mjs.map +1 -1
- package/dist/mjs/internal/fetch/index.mjs +2 -2
- package/dist/mjs/internal/fetch/index.mjs.map +1 -1
- package/dist/mjs/internal/fetch/stream-state.mjs +2 -2
- package/dist/mjs/internal/fetch/stream-state.mjs.map +1 -1
- package/dist/mjs/internal/fs/index.mjs +2 -2
- package/dist/mjs/internal/fs/index.mjs.map +1 -1
- package/dist/mjs/internal/fs/node-adapter.mjs +2 -2
- package/dist/mjs/internal/fs/node-adapter.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/bundle.mjs +2 -2
- package/dist/mjs/internal/module-loader/bundle.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/index.mjs +2 -2
- package/dist/mjs/internal/module-loader/index.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/mappings.mjs +2 -2
- package/dist/mjs/internal/module-loader/mappings.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/resolve.mjs +2 -2
- package/dist/mjs/internal/module-loader/resolve.mjs.map +1 -1
- package/dist/mjs/internal/module-loader/strip-types.mjs +2 -2
- package/dist/mjs/internal/module-loader/strip-types.mjs.map +1 -1
- package/dist/mjs/internal/path/index.mjs +2 -2
- package/dist/mjs/internal/path/index.mjs.map +1 -1
- package/dist/mjs/internal/playwright/client.mjs +2 -2
- package/dist/mjs/internal/playwright/client.mjs.map +1 -1
- package/dist/mjs/internal/playwright/handler.mjs +2 -2
- package/dist/mjs/internal/playwright/handler.mjs.map +1 -1
- package/dist/mjs/internal/playwright/index.mjs +2 -2
- package/dist/mjs/internal/playwright/index.mjs.map +1 -1
- package/dist/mjs/internal/playwright/types.mjs +2 -2
- package/dist/mjs/internal/playwright/types.mjs.map +1 -1
- package/dist/mjs/internal/protocol/codec.mjs +2 -2
- package/dist/mjs/internal/protocol/codec.mjs.map +1 -1
- package/dist/mjs/internal/protocol/framing.mjs +2 -2
- package/dist/mjs/internal/protocol/framing.mjs.map +1 -1
- package/dist/mjs/internal/protocol/index.mjs +2 -2
- package/dist/mjs/internal/protocol/index.mjs.map +1 -1
- package/dist/mjs/internal/protocol/marshalValue.mjs +2 -2
- package/dist/mjs/internal/protocol/marshalValue.mjs.map +1 -1
- package/dist/mjs/internal/protocol/serialization.mjs +2 -2
- package/dist/mjs/internal/protocol/serialization.mjs.map +1 -1
- package/dist/mjs/internal/protocol/types.mjs +2 -2
- package/dist/mjs/internal/protocol/types.mjs.map +1 -1
- package/dist/mjs/internal/runtime/index.mjs +2 -2
- package/dist/mjs/internal/runtime/index.mjs.map +1 -1
- package/dist/mjs/internal/server/index.mjs +2 -2
- package/dist/mjs/internal/server/index.mjs.map +1 -1
- package/dist/mjs/internal/test-environment/index.mjs +2 -2
- package/dist/mjs/internal/test-environment/index.mjs.map +1 -1
- package/dist/mjs/internal/timers/index.mjs +2 -2
- package/dist/mjs/internal/timers/index.mjs.map +1 -1
- package/dist/mjs/internal/transform/index.mjs +2 -2
- package/dist/mjs/internal/transform/index.mjs.map +1 -1
- package/dist/mjs/internal/typecheck/index.mjs +2 -2
- package/dist/mjs/internal/typecheck/index.mjs.map +1 -1
- package/dist/mjs/internal/typecheck/isolate-types.mjs +2 -2
- package/dist/mjs/internal/typecheck/isolate-types.mjs.map +1 -1
- package/dist/mjs/internal/typecheck/typecheck.mjs +2 -2
- package/dist/mjs/internal/typecheck/typecheck.mjs.map +1 -1
- package/dist/mjs/modules/index.mjs +11 -4
- package/dist/mjs/modules/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/runtime/script-runtime.mjs +2 -2
- package/dist/mjs/runtime/script-runtime.mjs.map +1 -1
- package/dist/mjs/server/app-server.mjs +2 -2
- package/dist/mjs/server/app-server.mjs.map +1 -1
- package/dist/mjs/testing/integration-helpers.mjs +2 -2
- package/dist/mjs/testing/integration-helpers.mjs.map +1 -1
- package/dist/mjs/typecheck/index.mjs +2 -2
- package/dist/mjs/typecheck/index.mjs.map +1 -1
- package/dist/mjs/types.mjs +1 -1
- package/dist/mjs/types.mjs.map +1 -1
- package/package.json +46 -38
package/README.md
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# @ricsam/isolate
|
|
2
|
+
|
|
3
|
+
`@ricsam/isolate` is a runtime-centric JavaScript sandbox built on [`isolated-vm`](https://github.com/nicknisi/isolated-vm). It gives you a single host API for running isolated code with web-style capabilities such as `fetch`, files, streams, server handlers, module loading, and Playwright-backed browser tests.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm add @ricsam/isolate isolated-vm
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Install Playwright when you want browser runtimes:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm add playwright
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## What You Get
|
|
18
|
+
|
|
19
|
+
`@ricsam/isolate` exports a small top-level API:
|
|
20
|
+
|
|
21
|
+
- `createIsolateHost()` to start, connect to, and manage isolate-backed runtimes
|
|
22
|
+
- `createModuleResolver()` to provide virtual modules, source trees, mounted `node_modules`, and fallback resolution
|
|
23
|
+
- `createFileBindings()` to expose a rooted file API to sandboxed code
|
|
24
|
+
- `getTypeProfile()`, `typecheck()`, and `formatTypecheckErrors()` for sandbox-aware TypeScript tooling
|
|
25
|
+
|
|
26
|
+
The host can create three runtime styles:
|
|
27
|
+
|
|
28
|
+
- `host.createRuntime()` for scripts, agents, and ad hoc execution
|
|
29
|
+
- `host.createAppServer()` for `serve()`-based request handlers
|
|
30
|
+
- `host.createBrowserRuntime()` for Playwright-backed execution
|
|
31
|
+
|
|
32
|
+
## Host Bindings
|
|
33
|
+
|
|
34
|
+
Each runtime is configured through `bindings`, which describe how sandboxed code talks to the host:
|
|
35
|
+
|
|
36
|
+
- `console` forwards runtime and browser console output
|
|
37
|
+
- `fetch` handles outbound HTTP requests from the sandbox
|
|
38
|
+
- `files` exposes a safe, root-scoped filesystem
|
|
39
|
+
- `modules` resolves virtual modules, source trees, and mounted packages
|
|
40
|
+
- `tools` exposes async host functions and async iterators
|
|
41
|
+
|
|
42
|
+
Every host callback receives a `HostCallContext` with an `AbortSignal`, runtime identity, resource identity, and request metadata.
|
|
43
|
+
|
|
44
|
+
## Quick Start
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import {
|
|
48
|
+
createFileBindings,
|
|
49
|
+
createIsolateHost,
|
|
50
|
+
createModuleResolver,
|
|
51
|
+
} from "@ricsam/isolate";
|
|
52
|
+
|
|
53
|
+
const host = await createIsolateHost({
|
|
54
|
+
daemon: {
|
|
55
|
+
socketPath: "/tmp/isolate.sock",
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const runtime = await host.createRuntime({
|
|
60
|
+
bindings: {
|
|
61
|
+
console: {
|
|
62
|
+
onEntry(entry) {
|
|
63
|
+
if (entry.type === "output") {
|
|
64
|
+
console.log(entry.stdout);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
fetch: async (request) => await fetch(request),
|
|
69
|
+
files: createFileBindings({
|
|
70
|
+
root: process.cwd(),
|
|
71
|
+
allowWrite: true,
|
|
72
|
+
}),
|
|
73
|
+
modules: createModuleResolver()
|
|
74
|
+
.virtual(
|
|
75
|
+
"@/env",
|
|
76
|
+
`export const mode = "sandbox";`,
|
|
77
|
+
{ filename: "env.ts", resolveDir: "/app" },
|
|
78
|
+
)
|
|
79
|
+
.virtual(
|
|
80
|
+
"/app/main.ts",
|
|
81
|
+
`
|
|
82
|
+
import { mode } from "@/env";
|
|
83
|
+
|
|
84
|
+
const response = await fetch("https://example.com");
|
|
85
|
+
console.log("mode:", mode);
|
|
86
|
+
console.log("status:", response.status);
|
|
87
|
+
console.log(await greet("isolate"));
|
|
88
|
+
`,
|
|
89
|
+
{ filename: "main.ts", resolveDir: "/app" },
|
|
90
|
+
),
|
|
91
|
+
tools: {
|
|
92
|
+
greet: async (name: string) => `hello ${name}`,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
await runtime.eval(`import "/app/main.ts";`, { filename: "/app/entry.ts" });
|
|
99
|
+
} finally {
|
|
100
|
+
await runtime.dispose();
|
|
101
|
+
await host.close();
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## App Servers
|
|
106
|
+
|
|
107
|
+
`createAppServer()` is the long-lived server-oriented API. It boots a runtime around an entry module that calls `serve()` and then lets the host dispatch requests into it.
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
import { createIsolateHost, createModuleResolver } from "@ricsam/isolate";
|
|
111
|
+
|
|
112
|
+
const host = await createIsolateHost();
|
|
113
|
+
const server = await host.createAppServer({
|
|
114
|
+
key: "example/server",
|
|
115
|
+
entry: "/server.ts",
|
|
116
|
+
bindings: {
|
|
117
|
+
modules: createModuleResolver().virtual(
|
|
118
|
+
"/server.ts",
|
|
119
|
+
`
|
|
120
|
+
serve({
|
|
121
|
+
fetch(request) {
|
|
122
|
+
return Response.json({
|
|
123
|
+
pathname: new URL(request.url).pathname,
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
`,
|
|
128
|
+
),
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const result = await server.handle(new Request("http://localhost/hello"));
|
|
133
|
+
if (result.type === "response") {
|
|
134
|
+
console.log(await result.response.json());
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
await server.dispose();
|
|
138
|
+
await host.close();
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`server.handle()` returns either a normal HTTP response or WebSocket upgrade metadata. The `server.ws` helpers let the host continue an upgraded connection by sending open, message, close, and error events back into the runtime.
|
|
142
|
+
|
|
143
|
+
## Browser Runtimes
|
|
144
|
+
|
|
145
|
+
`createBrowserRuntime()` runs sandboxed code against a Playwright page while keeping the host in control of file access, diagnostics, and browser event collection.
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
import { chromium } from "playwright";
|
|
149
|
+
import { createIsolateHost } from "@ricsam/isolate";
|
|
150
|
+
|
|
151
|
+
const browser = await chromium.launch();
|
|
152
|
+
const context = await browser.newContext();
|
|
153
|
+
const page = await context.newPage();
|
|
154
|
+
|
|
155
|
+
const host = await createIsolateHost();
|
|
156
|
+
const runtime = await host.createBrowserRuntime({
|
|
157
|
+
key: "example/browser",
|
|
158
|
+
bindings: {},
|
|
159
|
+
features: { tests: true },
|
|
160
|
+
browser: {
|
|
161
|
+
page,
|
|
162
|
+
captureConsole: true,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const result = await runtime.run(
|
|
167
|
+
`
|
|
168
|
+
test("loads a page", async () => {
|
|
169
|
+
await page.goto("https://example.com");
|
|
170
|
+
await expect(page).toHaveTitle(/Example Domain/);
|
|
171
|
+
});
|
|
172
|
+
`,
|
|
173
|
+
{
|
|
174
|
+
filename: "/browser-test.ts",
|
|
175
|
+
asTestSuite: true,
|
|
176
|
+
timeoutMs: 10_000,
|
|
177
|
+
},
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
console.log(result.tests);
|
|
181
|
+
|
|
182
|
+
await runtime.dispose();
|
|
183
|
+
await context.close();
|
|
184
|
+
await browser.close();
|
|
185
|
+
await host.close();
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Module Resolution
|
|
189
|
+
|
|
190
|
+
`createModuleResolver()` is a fluent builder. You can mix and match:
|
|
191
|
+
|
|
192
|
+
- `virtual(specifier, source, options)` for inline modules
|
|
193
|
+
- `virtualFile(specifier, filePath, options)` for a host file mapped to a virtual specifier
|
|
194
|
+
- `sourceTree(prefix, loader)` for lazy source loading under a virtual path
|
|
195
|
+
- `mountNodeModules(virtualMount, hostPath)` for package resolution from a real `node_modules`
|
|
196
|
+
- `fallback(loader)` for custom last-resort resolution
|
|
197
|
+
|
|
198
|
+
## File Bindings
|
|
199
|
+
|
|
200
|
+
`createFileBindings({ root, allowWrite })` creates a filesystem bridge that stays inside the configured root directory. Attempts to escape that root are rejected, and write operations are disabled unless `allowWrite` is set to `true`.
|
|
201
|
+
|
|
202
|
+
## Typechecking
|
|
203
|
+
|
|
204
|
+
The typecheck helpers let you validate sandbox code against supported capability profiles before executing it.
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
import {
|
|
208
|
+
formatTypecheckErrors,
|
|
209
|
+
getTypeProfile,
|
|
210
|
+
typecheck,
|
|
211
|
+
} from "@ricsam/isolate";
|
|
212
|
+
|
|
213
|
+
const profile = getTypeProfile({
|
|
214
|
+
profile: "browser-test",
|
|
215
|
+
capabilities: ["files"],
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
console.log(profile.include);
|
|
219
|
+
|
|
220
|
+
const result = typecheck({
|
|
221
|
+
code: "page.goto('/')",
|
|
222
|
+
profile: "browser-test",
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
if (!result.success) {
|
|
226
|
+
console.error(formatTypecheckErrors(result.errors));
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Built-in profiles:
|
|
231
|
+
|
|
232
|
+
- `backend`
|
|
233
|
+
- `agent`
|
|
234
|
+
- `browser-test`
|
|
235
|
+
|
|
236
|
+
Capabilities can extend a profile with `fetch`, `files`, `tests`, `browser`, `tools`, `console`, `encoding`, and `timers`.
|
|
237
|
+
|
|
238
|
+
## Daemon CLI
|
|
239
|
+
|
|
240
|
+
The package also exposes an `isolate-daemon` binary:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
isolate-daemon --socket /tmp/isolate.sock
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
By default, `createIsolateHost()` will auto-start a daemon when needed. You can also point the host at an already-running daemon with `daemon.socketPath`, or disable auto-start with `daemon.autoStart: false`.
|
|
247
|
+
|
|
248
|
+
## Development
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
npm run build
|
|
252
|
+
npm run typecheck
|
|
253
|
+
npm test
|
|
254
|
+
```
|
|
@@ -36,7 +36,7 @@ var __export = (target, all) => {
|
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// src/bridge/diagnostics.ts
|
|
40
40
|
var exports_diagnostics = {};
|
|
41
41
|
__export(exports_diagnostics, {
|
|
42
42
|
createRuntimeDiagnostics: () => createRuntimeDiagnostics
|
|
@@ -55,4 +55,4 @@ function createRuntimeDiagnostics() {
|
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
//# debugId=
|
|
58
|
+
//# debugId=40FF8D24B6369A0D64756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import type { RuntimeDiagnostics } from \"../types.cjs\";\n\nexport interface MutableRuntimeDiagnostics extends RuntimeDiagnostics {\n activeRequests: number;\n activeResources: number;\n pendingFiles: number;\n pendingFetches: number;\n pendingModules: number;\n pendingTools: number;\n streamCount: number;\n lifecycleState: \"idle\" | \"active\" | \"reloading\" | \"disposing\";\n}\n\nexport function createRuntimeDiagnostics(): MutableRuntimeDiagnostics {\n return {\n activeRequests: 0,\n activeResources: 0,\n pendingFiles: 0,\n pendingFetches: 0,\n pendingModules: 0,\n pendingTools: 0,\n streamCount: 0,\n lifecycleState: \"idle\",\n };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,wBAAwB,GAA8B;AAAA,EACpE,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AAAA;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "40FF8D24B6369A0D64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/bridge/legacy-adapters.ts
|
|
64
64
|
var exports_legacy_adapters = {};
|
|
65
65
|
__export(exports_legacy_adapters, {
|
|
66
66
|
tryResolveModule: () => tryResolveModule,
|
|
@@ -239,4 +239,4 @@ async function normalizeExplicitModuleResult(specifier, result, fallbackResolveD
|
|
|
239
239
|
return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
//# debugId=
|
|
242
|
+
//# debugId=D5F0F03020F4D4CD64756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import path from \"node:path\";\nimport type { RuntimeOptions } from \"../internal/client/index.cjs\";\nimport type { ModuleLoaderCallback } from \"../internal/protocol/index.cjs\";\nimport { getRequestContext } from \"./request-context.cjs\";\nimport type { HostBindings, HostCallContext, ModuleResolveResult, ModuleResolver, ModuleSource, ToolHandler } from \"../types.cjs\";\nimport type { MutableRuntimeDiagnostics } from \"./diagnostics.cjs\";\n\nfunction createHostCallContext(\n runtimeId: string,\n signal: AbortSignal,\n resourceId: string,\n): HostCallContext {\n const requestContext = getRequestContext();\n return {\n signal,\n runtimeId,\n requestId: requestContext.requestId,\n resourceId,\n metadata: requestContext.metadata,\n };\n}\n\nasync function normalizeModuleResolveResult(\n specifier: string,\n result: ModuleResolveResult,\n fallbackResolveDir?: string,\n): Promise<ModuleSource | null> {\n const resolved = await result;\n if (resolved == null) {\n return null;\n }\n\n if (typeof resolved === \"string\") {\n const filename = path.posix.basename(specifier) || \"__virtual_module__.js\";\n const resolveDir = specifier.startsWith(\"/\")\n ? path.posix.dirname(specifier)\n : fallbackResolveDir ?? \"/\";\n return {\n code: resolved,\n filename,\n resolveDir,\n };\n }\n\n return {\n static: resolved.static,\n filename: resolved.filename,\n resolveDir: resolved.resolveDir,\n code: resolved.code,\n };\n}\n\nfunction isAsyncGeneratorFunction(handler: ToolHandler): boolean {\n return handler.constructor.name === \"AsyncGeneratorFunction\";\n}\n\nexport function createLegacyRuntimeOptions(\n bindings: HostBindings,\n getRuntimeId: () => string,\n diagnostics: MutableRuntimeDiagnostics,\n): RuntimeOptions {\n const moduleLoader = createLegacyModuleLoader(bindings.modules, getRuntimeId, diagnostics);\n\n return {\n console: bindings.console?.onEntry\n ? {\n onEntry: (entry) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `console:${crypto.randomUUID()}`);\n bindings.console?.onEntry?.(entry, context);\n },\n }\n : undefined,\n fetch: bindings.fetch\n ? async (url, init) => {\n diagnostics.pendingFetches += 1;\n diagnostics.activeResources += 1;\n try {\n const request = new Request(url, {\n method: init.method,\n headers: init.headers,\n body: init.rawBody ? init.rawBody.slice(0) : null,\n });\n const context = createHostCallContext(getRuntimeId(), init.signal, `fetch:${crypto.randomUUID()}`);\n return await bindings.fetch!(request, context);\n } finally {\n diagnostics.pendingFetches -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n fs: bindings.files\n ? {\n readFile: bindings.files.readFile\n ? async (filePath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:read:${crypto.randomUUID()}`);\n return await bindings.files!.readFile!(filePath, context);\n }\n : undefined,\n writeFile: bindings.files.writeFile\n ? async (filePath: string, data: ArrayBuffer) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:write:${crypto.randomUUID()}`);\n return await bindings.files!.writeFile!(filePath, data, context);\n }\n : undefined,\n unlink: bindings.files.unlink\n ? async (filePath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:unlink:${crypto.randomUUID()}`);\n return await bindings.files!.unlink!(filePath, context);\n }\n : undefined,\n readdir: bindings.files.readdir\n ? async (dirPath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:readdir:${crypto.randomUUID()}`);\n return await bindings.files!.readdir!(dirPath, context);\n }\n : undefined,\n mkdir: bindings.files.mkdir\n ? async (dirPath: string, options?: { recursive?: boolean }) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:mkdir:${crypto.randomUUID()}`);\n return await bindings.files!.mkdir!(dirPath, options, context);\n }\n : undefined,\n rmdir: bindings.files.rmdir\n ? async (dirPath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rmdir:${crypto.randomUUID()}`);\n return await bindings.files!.rmdir!(dirPath, context);\n }\n : undefined,\n stat: bindings.files.stat\n ? async (filePath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:stat:${crypto.randomUUID()}`);\n return await bindings.files!.stat!(filePath, context);\n }\n : undefined,\n rename: bindings.files.rename\n ? async (from: string, to: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rename:${crypto.randomUUID()}`);\n return await bindings.files!.rename!(from, to, context);\n }\n : undefined,\n }\n : undefined,\n moduleLoader,\n customFunctions: bindings.tools\n ? Object.fromEntries(\n Object.entries(bindings.tools).map(([name, handler]) => {\n if (isAsyncGeneratorFunction(handler)) {\n return [\n name,\n {\n type: \"asyncIterator\" as const,\n fn: (...args: unknown[]) => {\n diagnostics.pendingTools += 1;\n diagnostics.activeResources += 1;\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);\n const iterator = handler(...args, context) as AsyncGenerator<unknown, unknown, unknown>;\n return (async function* () {\n try {\n yield* iterator;\n } finally {\n diagnostics.pendingTools -= 1;\n diagnostics.activeResources -= 1;\n }\n })();\n },\n },\n ];\n }\n\n return [\n name,\n {\n type: \"async\" as const,\n fn: async (...args: unknown[]) => {\n diagnostics.pendingTools += 1;\n diagnostics.activeResources += 1;\n try {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);\n return await handler(...args, context);\n } finally {\n diagnostics.pendingTools -= 1;\n diagnostics.activeResources -= 1;\n }\n },\n },\n ];\n }),\n )\n : undefined,\n };\n}\n\nfunction createLegacyModuleLoader(\n resolver: ModuleResolver | undefined,\n getRuntimeId: () => string,\n diagnostics: MutableRuntimeDiagnostics,\n): ModuleLoaderCallback | undefined {\n if (!resolver) {\n return undefined;\n }\n\n return async (specifier, importer) => {\n diagnostics.activeResources += 1;\n try {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `module:${crypto.randomUUID()}`);\n const result = await resolver.resolve(specifier, importer, context);\n return result;\n } finally {\n diagnostics.activeResources -= 1;\n }\n };\n}\n\nexport function createMappedNodeModulesLoader(mappings: Array<{ from: string; to: string }>): ModuleLoaderCallback | undefined {\n if (mappings.length === 0) {\n return undefined;\n }\n throw new Error(\"createMappedNodeModulesLoader is no longer used directly; call createModuleResolver().mountNodeModules() instead.\");\n}\n\nexport async function tryResolveModule(\n resolver: ModuleResolver | undefined,\n specifier: string,\n importer: { path: string; resolveDir: string },\n context: HostCallContext,\n): Promise<ModuleSource | null> {\n if (!resolver) {\n return null;\n }\n return normalizeModuleResolveResult(specifier, resolver.resolve(specifier, importer, context), importer.resolveDir);\n}\n\nexport async function normalizeExplicitModuleResult(\n specifier: string,\n result: ModuleResolveResult,\n fallbackResolveDir?: string,\n): Promise<ModuleSource | null> {\n return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "D5F0F03020F4D4CD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -36,7 +36,7 @@ var __export = (target, all) => {
|
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// src/bridge/request-context.ts
|
|
40
40
|
var exports_request_context = {};
|
|
41
41
|
__export(exports_request_context, {
|
|
42
42
|
withRequestContext: () => withRequestContext,
|
|
@@ -56,4 +56,4 @@ function getRequestContext() {
|
|
|
56
56
|
return requestContextStorage.getStore() ?? { metadata: {} };
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
//# debugId=
|
|
59
|
+
//# debugId=28CFA6CD346AB89564756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst requestContextStorage = new AsyncLocalStorage<{\n requestId?: string;\n metadata: Record<string, string>;\n signal?: AbortSignal;\n}>();\n\nexport function withRequestContext<T>(\n context: { requestId?: string; metadata?: Record<string, string>; signal?: AbortSignal },\n fn: () => Promise<T>,\n): Promise<T> {\n return requestContextStorage.run(\n {\n requestId: context.requestId,\n metadata: context.metadata ?? {},\n signal: context.signal,\n },\n fn,\n );\n}\n\nexport function getRequestContext(): {\n requestId?: string;\n metadata: Record<string, string>;\n signal?: AbortSignal;\n} {\n return requestContextStorage.getStore() ?? { metadata: {} };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAkC,IAAlC;AAEA,IAAM,wBAAwB,IAAI;AAM3B,SAAS,kBAAqB,CACnC,SACA,IACY;AAAA,EACZ,OAAO,sBAAsB,IAC3B;AAAA,IACE,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ,YAAY,CAAC;AAAA,IAC/B,QAAQ,QAAQ;AAAA,EAClB,GACA,EACF;AAAA;AAGK,SAAS,iBAAiB,GAI/B;AAAA,EACA,OAAO,sBAAsB,SAAS,KAAK,EAAE,UAAU,CAAC,EAAE;AAAA;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "28CFA6CD346AB89564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/bridge/runtime-bindings.ts
|
|
64
64
|
var exports_runtime_bindings = {};
|
|
65
65
|
__export(exports_runtime_bindings, {
|
|
66
66
|
tryResolveModule: () => tryResolveModule,
|
|
@@ -364,4 +364,4 @@ async function normalizeExplicitModuleResult(specifier, result, fallbackResolveD
|
|
|
364
364
|
return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);
|
|
365
365
|
}
|
|
366
366
|
|
|
367
|
-
//# debugId=
|
|
367
|
+
//# debugId=D27BEABC8CB87D9964756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import path from \"node:path\";\nimport type { RuntimeOptions } from \"../internal/client/index.cjs\";\nimport type { ModuleLoaderCallback } from \"../internal/protocol/index.cjs\";\nimport { getRequestContext } from \"./request-context.cjs\";\nimport type {\n HostBindings,\n HostCallContext,\n ModuleResolveResult,\n ModuleResolver,\n ModuleSource,\n ToolHandler,\n} from \"../types.cjs\";\nimport type { MutableRuntimeDiagnostics } from \"./diagnostics.cjs\";\n\nexport interface RuntimeBindingsAdapter {\n runtimeOptions: RuntimeOptions;\n abort(reason?: unknown): void;\n reset(reason?: unknown): void;\n}\n\nfunction createAbortError(reason?: unknown): Error {\n if (reason instanceof Error) {\n return reason;\n }\n\n const error = new Error(\n typeof reason === \"string\" ? reason : \"The operation was aborted\",\n );\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createAbortSignalComposer() {\n const controllers = new Set<AbortController>();\n\n const compose = (...signals: Array<AbortSignal | undefined>): AbortSignal => {\n const activeSignals = signals.filter(\n (signal): signal is AbortSignal => signal !== undefined,\n );\n\n if (activeSignals.length === 0) {\n return AbortSignal.abort(createAbortError());\n }\n\n const aborted = activeSignals.find((signal) => signal.aborted);\n if (aborted) {\n return AbortSignal.abort(aborted.reason ?? createAbortError());\n }\n\n if (activeSignals.length === 1) {\n return activeSignals[0]!;\n }\n\n const controller = new AbortController();\n controllers.add(controller);\n\n const cleanup = () => {\n for (const signal of activeSignals) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n controllers.delete(controller);\n };\n\n const onAbort = (event: Event) => {\n cleanup();\n const signal = event.target as AbortSignal | null;\n controller.abort(signal?.reason ?? createAbortError());\n };\n\n for (const signal of activeSignals) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n controller.signal.addEventListener(\"abort\", cleanup, { once: true });\n\n return controller.signal;\n };\n\n const abortAll = (reason?: unknown) => {\n const error = createAbortError(reason);\n for (const controller of controllers) {\n if (!controller.signal.aborted) {\n controller.abort(error);\n }\n }\n controllers.clear();\n };\n\n return { compose, abortAll };\n}\n\nfunction createHostCallContextFactory(getRuntimeId: () => string) {\n let runtimeController = new AbortController();\n const composedSignals = createAbortSignalComposer();\n\n const createHostCallContext = (\n resourceId: string,\n baseSignal?: AbortSignal,\n ): HostCallContext => {\n const requestContext = getRequestContext();\n const ownerSignal = requestContext.signal ?? runtimeController.signal;\n const signal = baseSignal\n ? composedSignals.compose(ownerSignal, baseSignal)\n : ownerSignal;\n\n return {\n signal,\n runtimeId: getRuntimeId(),\n requestId: requestContext.requestId,\n resourceId,\n metadata: requestContext.metadata,\n };\n };\n\n const abort = (reason?: unknown) => {\n if (!runtimeController.signal.aborted) {\n runtimeController.abort(createAbortError(reason));\n }\n composedSignals.abortAll(reason);\n };\n\n const reset = (reason?: unknown) => {\n abort(reason);\n runtimeController = new AbortController();\n };\n\n return { createHostCallContext, abort, reset };\n}\n\nasync function normalizeModuleResolveResult(\n specifier: string,\n result: ModuleResolveResult,\n fallbackResolveDir?: string,\n): Promise<ModuleSource | null> {\n const resolved = await result;\n if (resolved == null) {\n return null;\n }\n\n if (typeof resolved === \"string\") {\n const filename = path.posix.basename(specifier) || \"__virtual_module__.js\";\n const resolveDir = specifier.startsWith(\"/\")\n ? path.posix.dirname(specifier)\n : fallbackResolveDir ?? \"/\";\n return {\n code: resolved,\n filename,\n resolveDir,\n };\n }\n\n return {\n static: resolved.static,\n filename: resolved.filename,\n resolveDir: resolved.resolveDir,\n code: resolved.code,\n };\n}\n\nfunction isAsyncGeneratorFunction(handler: ToolHandler): boolean {\n return handler.constructor.name === \"AsyncGeneratorFunction\";\n}\n\nexport function createRuntimeBindingsAdapter(\n bindings: HostBindings,\n getRuntimeId: () => string,\n diagnostics: MutableRuntimeDiagnostics,\n): RuntimeBindingsAdapter {\n const contextFactory = createHostCallContextFactory(getRuntimeId);\n const moduleLoader = createModuleLoader(\n bindings.modules,\n contextFactory.createHostCallContext,\n diagnostics,\n );\n\n return {\n runtimeOptions: {\n console: bindings.console?.onEntry\n ? {\n onEntry: (entry) => {\n const context = contextFactory.createHostCallContext(\n `console:${crypto.randomUUID()}`,\n );\n bindings.console?.onEntry?.(entry, context);\n },\n }\n : undefined,\n fetch: bindings.fetch\n ? async (url, init) => {\n diagnostics.pendingFetches += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `fetch:${crypto.randomUUID()}`,\n init.signal,\n );\n const request = new Request(url, {\n method: init.method,\n headers: init.headers,\n body: init.rawBody ? init.rawBody.slice(0) : null,\n signal: context.signal,\n });\n return await bindings.fetch!(request, context);\n } finally {\n diagnostics.pendingFetches -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n fs: bindings.files\n ? {\n readFile: bindings.files.readFile\n ? async (filePath: string) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:read:${crypto.randomUUID()}`,\n );\n return await bindings.files!.readFile!(filePath, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n writeFile: bindings.files.writeFile\n ? async (filePath: string, data: ArrayBuffer) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:write:${crypto.randomUUID()}`,\n );\n return await bindings.files!.writeFile!(filePath, data, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n unlink: bindings.files.unlink\n ? async (filePath: string) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:unlink:${crypto.randomUUID()}`,\n );\n return await bindings.files!.unlink!(filePath, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n readdir: bindings.files.readdir\n ? async (dirPath: string) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:readdir:${crypto.randomUUID()}`,\n );\n return await bindings.files!.readdir!(dirPath, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n mkdir: bindings.files.mkdir\n ? async (dirPath: string, options?: { recursive?: boolean }) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:mkdir:${crypto.randomUUID()}`,\n );\n return await bindings.files!.mkdir!(dirPath, options, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n rmdir: bindings.files.rmdir\n ? async (dirPath: string) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:rmdir:${crypto.randomUUID()}`,\n );\n return await bindings.files!.rmdir!(dirPath, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n stat: bindings.files.stat\n ? async (filePath: string) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:stat:${crypto.randomUUID()}`,\n );\n return await bindings.files!.stat!(filePath, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n rename: bindings.files.rename\n ? async (from: string, to: string) => {\n diagnostics.pendingFiles += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `files:rename:${crypto.randomUUID()}`,\n );\n return await bindings.files!.rename!(from, to, context);\n } finally {\n diagnostics.pendingFiles -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n }\n : undefined,\n moduleLoader,\n customFunctions: bindings.tools\n ? Object.fromEntries(\n Object.entries(bindings.tools).map(([name, handler]) => {\n if (isAsyncGeneratorFunction(handler)) {\n return [\n name,\n {\n type: \"asyncIterator\" as const,\n fn: (...args: unknown[]) => {\n diagnostics.pendingTools += 1;\n diagnostics.activeResources += 1;\n const context = contextFactory.createHostCallContext(\n `tool:${name}:${crypto.randomUUID()}`,\n );\n const iterator = handler(\n ...args,\n context,\n ) as AsyncGenerator<unknown, unknown, unknown>;\n return (async function* () {\n try {\n yield* iterator;\n } finally {\n diagnostics.pendingTools -= 1;\n diagnostics.activeResources -= 1;\n }\n })();\n },\n },\n ];\n }\n\n return [\n name,\n {\n type: \"async\" as const,\n fn: async (...args: unknown[]) => {\n diagnostics.pendingTools += 1;\n diagnostics.activeResources += 1;\n try {\n const context = contextFactory.createHostCallContext(\n `tool:${name}:${crypto.randomUUID()}`,\n );\n return await handler(...args, context);\n } finally {\n diagnostics.pendingTools -= 1;\n diagnostics.activeResources -= 1;\n }\n },\n },\n ];\n }),\n )\n : undefined,\n },\n abort: contextFactory.abort,\n reset: contextFactory.reset,\n };\n}\n\nfunction createModuleLoader(\n resolver: ModuleResolver | undefined,\n createHostCallContext: (\n resourceId: string,\n baseSignal?: AbortSignal,\n ) => HostCallContext,\n diagnostics: MutableRuntimeDiagnostics,\n): ModuleLoaderCallback | undefined {\n if (!resolver) {\n return undefined;\n }\n\n return async (specifier, importer) => {\n diagnostics.pendingModules += 1;\n diagnostics.activeResources += 1;\n try {\n const context = createHostCallContext(`module:${crypto.randomUUID()}`);\n return await resolver.resolve(specifier, importer, context);\n } finally {\n diagnostics.pendingModules -= 1;\n diagnostics.activeResources -= 1;\n }\n };\n}\n\nexport async function tryResolveModule(\n resolver: ModuleResolver | undefined,\n specifier: string,\n importer: { path: string; resolveDir: string },\n context: HostCallContext,\n): Promise<ModuleSource | null> {\n if (!resolver) {\n return null;\n }\n return normalizeModuleResolveResult(\n specifier,\n resolver.resolve(specifier, importer, context),\n importer.resolveDir,\n );\n}\n\nexport async function normalizeExplicitModuleResult(\n specifier: string,\n result: ModuleResolveResult,\n fallbackResolveDir?: string,\n): Promise<ModuleSource | null> {\n return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "D27BEABC8CB87D9964756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/browser/browser-runtime.ts
|
|
64
64
|
var exports_browser_runtime = {};
|
|
65
65
|
__export(exports_browser_runtime, {
|
|
66
66
|
createBrowserRuntimeAdapter: () => createBrowserRuntimeAdapter
|
|
@@ -154,4 +154,4 @@ async function createBrowserRuntimeAdapter(createRuntime, options) {
|
|
|
154
154
|
};
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
//# debugId=
|
|
157
|
+
//# debugId=4537F7187943AFB464756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import path from \"node:path\";\nimport { defaultPlaywrightHandler } from \"../internal/playwright/client.cjs\";\nimport type { RemoteRuntime, RuntimeOptions } from \"../internal/client/index.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { createScriptRuntimeAdapter } from \"../runtime/script-runtime.cjs\";\nimport type { BrowserRuntime, BrowserRuntimeDiagnostics, CreateBrowserRuntimeOptions } from \"../types.cjs\";\n\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".pdf\": \"application/pdf\",\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n };\n return mimeTypes[ext] ?? \"application/octet-stream\";\n}\n\nexport async function createBrowserRuntimeAdapter(\n createRuntime: (options: RuntimeOptions) => Promise<RemoteRuntime>,\n options: CreateBrowserRuntimeOptions,\n): Promise<BrowserRuntime> {\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = options.key ?? \"browser-runtime\";\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n );\n const readFile = options.browser.readFile\n ? async (filePath: string) => {\n const buffer = await options.browser.readFile!(filePath);\n return {\n name: path.basename(filePath),\n mimeType: getMimeType(filePath),\n buffer,\n };\n }\n : undefined;\n const playwrightHandler = defaultPlaywrightHandler(options.browser.page as never, {\n readFile,\n writeFile: options.browser.writeFile as never,\n createPage: options.browser.createPage as never,\n createContext: options.browser.createContext as never,\n });\n const runtime = await createRuntime({\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: options.features?.tests ?? false,\n playwright: {\n handler: playwrightHandler,\n console: options.browser.captureConsole ?? false,\n onEvent: options.browser.onEvent,\n },\n });\n runtimeId = runtime.id;\n const scriptRuntime = createScriptRuntimeAdapter(runtime, diagnostics, {\n onBeforeDispose: (reason) => bindingsAdapter.abort(reason),\n });\n\n return {\n async run(code, runOptions) {\n await scriptRuntime.eval(code, {\n filename: runOptions?.filename,\n executionTimeout: runOptions?.timeoutMs,\n });\n\n if (runOptions?.asTestSuite && (await runtime.testEnvironment.hasTests())) {\n return {\n tests: await runtime.testEnvironment.runTests(runOptions.timeoutMs),\n };\n }\n\n return {};\n },\n async diagnostics(): Promise<BrowserRuntimeDiagnostics> {\n const collectedData = runtime.playwright.getCollectedData();\n return {\n ...(await scriptRuntime.diagnostics()),\n browserConsoleLogs: collectedData.browserConsoleLogs.length,\n networkRequests: collectedData.networkRequests.length,\n networkResponses: collectedData.networkResponses.length,\n pageErrors: collectedData.pageErrors.length,\n requestFailures: collectedData.requestFailures.length,\n collectedData,\n };\n },\n dispose: async (disposeOptions) => {\n await scriptRuntime.dispose(disposeOptions);\n },\n };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAiB,IAAjB;AACyC,IAAzC;AAEyC,IAAzC;AAC6C,IAA7C;AAC2C,IAA3C;AAGA,SAAS,WAAW,CAAC,UAA0B;AAAA,EAC7C,MAAM,MAAM,yBAAK,QAAQ,QAAQ,EAAE,YAAY;AAAA,EAC/C,MAAM,YAAoC;AAAA,IACxC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,OAAO,UAAU,QAAQ;AAAA;AAG3B,eAAsB,2BAA2B,CAC/C,eACA,SACyB;AAAA,EACzB,MAAM,cAAc,4CAAyB;AAAA,EAC7C,IAAI,YAAY,QAAQ,OAAO;AAAA,EAC/B,MAAM,kBAAkB,qDACtB,QAAQ,UACR,MAAM,WACN,WACF;AAAA,EACA,MAAM,WAAW,QAAQ,QAAQ,WAC7B,OAAO,aAAqB;AAAA,IAC1B,MAAM,SAAS,MAAM,QAAQ,QAAQ,SAAU,QAAQ;AAAA,IACvD,OAAO;AAAA,MACL,MAAM,yBAAK,SAAS,QAAQ;AAAA,MAC5B,UAAU,YAAY,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,MAEF;AAAA,EACJ,MAAM,oBAAoB,uCAAyB,QAAQ,QAAQ,MAAe;AAAA,IAChF;AAAA,IACA,WAAW,QAAQ,QAAQ;AAAA,IAC3B,YAAY,QAAQ,QAAQ;AAAA,IAC5B,eAAe,QAAQ,QAAQ;AAAA,EACjC,CAAC;AAAA,EACD,MAAM,UAAU,MAAM,cAAc;AAAA,OAC/B,gBAAgB;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,IAC1B,iBAAiB,QAAQ,UAAU,SAAS;AAAA,IAC5C,YAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,QAAQ,QAAQ,kBAAkB;AAAA,MAC3C,SAAS,QAAQ,QAAQ;AAAA,IAC3B;AAAA,EACF,CAAC;AAAA,EACD,YAAY,QAAQ;AAAA,EACpB,MAAM,gBAAgB,iDAA2B,SAAS,aAAa;AAAA,IACrE,iBAAiB,CAAC,WAAW,gBAAgB,MAAM,MAAM;AAAA,EAC3D,CAAC;AAAA,EAED,OAAO;AAAA,SACC,IAAG,CAAC,MAAM,YAAY;AAAA,MAC1B,MAAM,cAAc,KAAK,MAAM;AAAA,QAC7B,UAAU,YAAY;AAAA,QACtB,kBAAkB,YAAY;AAAA,MAChC,CAAC;AAAA,MAED,IAAI,YAAY,eAAgB,MAAM,QAAQ,gBAAgB,SAAS,GAAI;AAAA,QACzE,OAAO;AAAA,UACL,OAAO,MAAM,QAAQ,gBAAgB,SAAS,WAAW,SAAS;AAAA,QACpE;AAAA,MACF;AAAA,MAEA,OAAO,CAAC;AAAA;AAAA,SAEJ,YAAW,GAAuC;AAAA,MACtD,MAAM,gBAAgB,QAAQ,WAAW,iBAAiB;AAAA,MAC1D,OAAO;AAAA,WACD,MAAM,cAAc,YAAY;AAAA,QACpC,oBAAoB,cAAc,mBAAmB;AAAA,QACrD,iBAAiB,cAAc,gBAAgB;AAAA,QAC/C,kBAAkB,cAAc,iBAAiB;AAAA,QACjD,YAAY,cAAc,WAAW;AAAA,QACrC,iBAAiB,cAAc,gBAAgB;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA,IAEF,SAAS,OAAO,mBAAmB;AAAA,MACjC,MAAM,cAAc,QAAQ,cAAc;AAAA;AAAA,EAE9C;AAAA;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "4537F7187943AFB464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/daemon.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
//
|
|
3
|
+
// src/daemon.ts
|
|
4
4
|
var import_daemon = require("./internal/daemon/index.cjs");
|
|
5
5
|
process.removeAllListeners("warning");
|
|
6
6
|
process.on("warning", (warning) => {
|
|
@@ -88,4 +88,4 @@ main().catch((error) => {
|
|
|
88
88
|
process.exit(1);
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
//# debugId=
|
|
91
|
+
//# debugId=80B56BA02F74D8AC64756E2164756E21
|
package/dist/cjs/daemon.cjs.map
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"#!/usr/bin/env node\n\nprocess.removeAllListeners(\"warning\");\nprocess.on(\"warning\", (warning) => {\n if (\n warning.name === \"ExperimentalWarning\" &&\n warning.message.includes(\"stripTypeScriptTypes\")\n ) {\n return;\n }\n console.warn(warning);\n});\n\nimport { startDaemon, type DaemonOptions } from \"./internal/daemon/index.cjs\";\n\nfunction parseArgs(args: string[]): Partial<DaemonOptions> {\n const options: Partial<DaemonOptions> = {};\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n\n switch (arg) {\n case \"--socket\":\n index += 1;\n if (args[index]) {\n options.socketPath = args[index];\n }\n break;\n case \"--host\":\n index += 1;\n if (args[index]) {\n options.host = args[index];\n options.socketPath = undefined;\n }\n break;\n case \"--port\":\n index += 1;\n if (args[index]) {\n options.port = Number.parseInt(args[index]!, 10);\n options.socketPath = undefined;\n }\n break;\n case \"--max-isolates\":\n index += 1;\n if (args[index]) {\n options.maxIsolates = Number.parseInt(args[index]!, 10);\n }\n break;\n case \"--memory-limit\":\n index += 1;\n if (args[index]) {\n options.defaultMemoryLimitMB = Number.parseInt(args[index]!, 10);\n }\n break;\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?.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 daemon = await startDaemon(parseArgs(process.argv.slice(2)));\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((error) => {\n console.error(\"Failed to start daemon:\", error);\n process.exit(1);\n});\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;AAagD,IAAhD;AAXA,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;AAID,SAAS,SAAS,CAAC,MAAwC;AAAA,EACzD,MAAM,UAAkC,CAAC;AAAA,EAEzC,SAAS,QAAQ,EAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AAAA,IACnD,MAAM,MAAM,KAAK;AAAA,IAEjB,QAAQ;AAAA,WACD;AAAA,QACH,SAAS;AAAA,QACT,IAAI,KAAK,QAAQ;AAAA,UACf,QAAQ,aAAa,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,WACG;AAAA,QACH,SAAS;AAAA,QACT,IAAI,KAAK,QAAQ;AAAA,UACf,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ,aAAa;AAAA,QACvB;AAAA,QACA;AAAA,WACG;AAAA,QACH,SAAS;AAAA,QACT,IAAI,KAAK,QAAQ;AAAA,UACf,QAAQ,OAAO,OAAO,SAAS,KAAK,QAAS,EAAE;AAAA,UAC/C,QAAQ,aAAa;AAAA,QACvB;AAAA,QACA;AAAA,WACG;AAAA,QACH,SAAS;AAAA,QACT,IAAI,KAAK,QAAQ;AAAA,UACf,QAAQ,cAAc,OAAO,SAAS,KAAK,QAAS,EAAE;AAAA,QACxD;AAAA,QACA;AAAA,WACG;AAAA,QACH,SAAS;AAAA,QACT,IAAI,KAAK,QAAQ;AAAA,UACf,QAAQ,uBAAuB,OAAO,SAAS,KAAK,QAAS,EAAE;AAAA,QACjE;AAAA,QACA;AAAA,WACG;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,KAAK,WAAW,GAAG,GAAG;AAAA,UACxB,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,SAAS,MAAM,0BAAY,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,EACjE,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,UAAU;AAAA,EACtB,QAAQ,MAAM,2BAA2B,KAAK;AAAA,EAC9C,QAAQ,KAAK,CAAC;AAAA,CACf;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "80B56BA02F74D8AC64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/files/index.cjs
CHANGED
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/files/index.ts
|
|
64
64
|
var exports_files = {};
|
|
65
65
|
__export(exports_files, {
|
|
66
66
|
createFileBindings: () => createFileBindings
|
|
@@ -137,4 +137,4 @@ function createFileBindings(options) {
|
|
|
137
137
|
};
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
//# debugId=
|
|
140
|
+
//# debugId=80D418D8F25B3F9C64756E2164756E21
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileBindings } from \"../types.cjs\";\n\nfunction resolveSafePath(root: string, requestedPath: string): string {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(path.join(resolvedRoot, requestedPath));\n if (!resolvedPath.startsWith(`${resolvedRoot}${path.sep}`) && resolvedPath !== resolvedRoot) {\n throw new Error(`Access denied: ${requestedPath}`);\n }\n return resolvedPath;\n}\n\nexport function createFileBindings(options: {\n root: string;\n allowWrite?: boolean;\n}): FileBindings {\n const allowWrite = options.allowWrite ?? false;\n\n return {\n readFile: async (requestedPath) => {\n const safePath = resolveSafePath(options.root, requestedPath);\n const buffer = await fs.readFile(safePath);\n return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n },\n writeFile: async (requestedPath, data) => {\n if (!allowWrite) {\n throw new Error(\"Write access is disabled for these file bindings.\");\n }\n const safePath = resolveSafePath(options.root, requestedPath);\n await fs.mkdir(path.dirname(safePath), { recursive: true });\n await fs.writeFile(safePath, Buffer.from(data));\n },\n unlink: async (requestedPath) => {\n if (!allowWrite) {\n throw new Error(\"Write access is disabled for these file bindings.\");\n }\n const safePath = resolveSafePath(options.root, requestedPath);\n await fs.unlink(safePath);\n },\n readdir: async (requestedPath) => {\n const safePath = resolveSafePath(options.root, requestedPath);\n return await fs.readdir(safePath);\n },\n mkdir: async (requestedPath, mkdirOptions) => {\n if (!allowWrite) {\n throw new Error(\"Write access is disabled for these file bindings.\");\n }\n const safePath = resolveSafePath(options.root, requestedPath);\n await fs.mkdir(safePath, { recursive: mkdirOptions?.recursive ?? false });\n },\n rmdir: async (requestedPath) => {\n if (!allowWrite) {\n throw new Error(\"Write access is disabled for these file bindings.\");\n }\n const safePath = resolveSafePath(options.root, requestedPath);\n await fs.rmdir(safePath);\n },\n stat: async (requestedPath) => {\n const safePath = resolveSafePath(options.root, requestedPath);\n const stats = await fs.stat(safePath);\n return {\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n };\n },\n rename: async (from, to) => {\n if (!allowWrite) {\n throw new Error(\"Write access is disabled for these file bindings.\");\n }\n const safeFrom = resolveSafePath(options.root, from);\n const safeTo = resolveSafePath(options.root, to);\n await fs.rename(safeFrom, safeTo);\n },\n };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "80D418D8F25B3F9C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -60,7 +60,7 @@ var __export = (target, all) => {
|
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// src/host/create-isolate-host.ts
|
|
64
64
|
var exports_create_isolate_host = {};
|
|
65
65
|
__export(exports_create_isolate_host, {
|
|
66
66
|
createIsolateHost: () => createIsolateHost
|
|
@@ -76,7 +76,7 @@ var import_browser_runtime = require("../browser/browser-runtime.cjs");
|
|
|
76
76
|
var import_script_runtime = require("../runtime/script-runtime.cjs");
|
|
77
77
|
var import_app_server = require("../server/app-server.cjs");
|
|
78
78
|
function resolveDefaultDaemonEntrypoint() {
|
|
79
|
-
const localPath = import_node_path.default.resolve("/home/runner/work/isolate/isolate/
|
|
79
|
+
const localPath = import_node_path.default.resolve("/home/runner/work/isolate/isolate/src/host", "../daemon.ts");
|
|
80
80
|
if (import_node_fs.default.existsSync(localPath)) {
|
|
81
81
|
return localPath;
|
|
82
82
|
}
|
|
@@ -205,7 +205,7 @@ class HostImpl {
|
|
|
205
205
|
}
|
|
206
206
|
} catch {}
|
|
207
207
|
const cli = entrypoint ? ["node", "--experimental-strip-types", entrypoint, "--socket", socketPath] : ["isolate-daemon", "--socket", socketPath];
|
|
208
|
-
const cwd = this.options.daemon?.cwd ?? (entrypoint ? import_node_path.default.resolve("/home/runner/work/isolate/isolate/
|
|
208
|
+
const cwd = this.options.daemon?.cwd ?? (entrypoint ? import_node_path.default.resolve("/home/runner/work/isolate/isolate/src/host", "../..") : process.cwd());
|
|
209
209
|
this.daemonProcess = import_node_child_process.spawn(cli[0], cli.slice(1), {
|
|
210
210
|
cwd,
|
|
211
211
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -232,4 +232,4 @@ async function createIsolateHost(options) {
|
|
|
232
232
|
return new HostImpl(options);
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
-
//# debugId=
|
|
235
|
+
//# debugId=C171316CAF8E438664756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/host/create-isolate-host.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { connect, type DaemonConnection, type RemoteRuntime, type RuntimeOptions } from \"../internal/client/index.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { createBrowserRuntimeAdapter } from \"../browser/browser-runtime.cjs\";\nimport { createScriptRuntimeAdapter } from \"../runtime/script-runtime.cjs\";\nimport { createAppServerAdapter } from \"../server/app-server.cjs\";\nimport type { CreateBrowserRuntimeOptions, CreateIsolateHostOptions, CreateRuntimeOptions, IsolateHost } from \"../types.cjs\";\n\nfunction resolveDefaultDaemonEntrypoint(): string | null {\n const localPath = path.resolve(import.meta.dirname, \"../daemon.ts\");\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n return null;\n}\n\nasync function waitForSocket(socketPath: string, timeoutMs: number): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (fs.existsSync(socketPath)) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n throw new Error(`Daemon socket not available after ${timeoutMs}ms`);\n}\n\nclass HostImpl implements IsolateHost {\n private readonly options: CreateIsolateHostOptions;\n private daemonProcess: ChildProcess | null = null;\n private connection: DaemonConnection | null = null;\n private connectionPromise: Promise<DaemonConnection> | null = null;\n private readonly servers = new Set<object>();\n private readonly runtimes = new Set<object>();\n\n constructor(options?: CreateIsolateHostOptions) {\n this.options = options ?? {};\n }\n\n async createAppServer(options: CreateRuntimeOptions & { key: string; entry: string; entryFilename?: string; webSockets?: { onCommand?: (command: { type: \"message\" | \"close\"; connectionId: string; data?: string | ArrayBuffer; code?: number; reason?: string }) => void } }) {\n const server = await createAppServerAdapter(() => this.getConnection(), options);\n this.servers.add(server);\n return server;\n }\n\n async createRuntime(options: CreateRuntimeOptions) {\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = options.key ?? \"runtime\";\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n );\n const runtime = await this.createRemoteRuntime(\n {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: options.features?.tests ?? false,\n },\n options.key,\n );\n runtimeId = runtime.id;\n const adapter = createScriptRuntimeAdapter(runtime, diagnostics, {\n onBeforeDispose: (reason) => bindingsAdapter.abort(reason),\n });\n this.runtimes.add(adapter);\n return adapter;\n }\n\n async createBrowserRuntime(options: CreateBrowserRuntimeOptions) {\n const browserRuntime = await createBrowserRuntimeAdapter(\n async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key),\n options,\n );\n this.runtimes.add(browserRuntime);\n return browserRuntime;\n }\n\n async diagnostics() {\n return {\n runtimes: this.runtimes.size,\n servers: this.servers.size,\n connected: this.connection?.isConnected() ?? false,\n };\n }\n\n async close(): Promise<void> {\n if (this.connection) {\n await this.connection.close().catch(() => {});\n }\n this.connection = null;\n this.connectionPromise = null;\n\n if (this.daemonProcess) {\n const process = this.daemonProcess;\n this.daemonProcess = null;\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n process.kill(\"SIGKILL\");\n resolve();\n }, 5000);\n process.once(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n process.kill(\"SIGTERM\");\n });\n }\n }\n\n private async createRemoteRuntime(options: RuntimeOptions, key?: string): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n if (key) {\n return await connection.createNamespace(key).createRuntime(options);\n }\n return await connection.createRuntime(options);\n }\n\n private async getConnection(): Promise<DaemonConnection> {\n if (this.connection?.isConnected()) {\n return this.connection;\n }\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = (async () => {\n await this.ensureDaemon();\n this.connection = await connect({\n socket: this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\",\n timeout: this.options.daemon?.timeoutMs ?? 5000,\n });\n return this.connection;\n })();\n\n return await this.connectionPromise.finally(() => {\n this.connectionPromise = null;\n });\n }\n\n private async ensureDaemon(): Promise<void> {\n if (this.connection?.isConnected()) {\n return;\n }\n\n if (this.options.daemon?.autoStart === false) {\n return;\n }\n\n if (this.daemonProcess) {\n return;\n }\n\n const socketPath = this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\";\n const entrypoint = this.options.daemon?.entrypoint ?? resolveDefaultDaemonEntrypoint();\n\n try {\n if (fs.existsSync(socketPath)) {\n fs.unlinkSync(socketPath);\n }\n } catch {\n // ignore stale socket cleanup failures\n }\n\n const cli = entrypoint\n ? [\"node\", \"--experimental-strip-types\", entrypoint, \"--socket\", socketPath]\n : [\"isolate-daemon\", \"--socket\", socketPath];\n const cwd = this.options.daemon?.cwd ?? (entrypoint ? path.resolve(import.meta.dirname, \"
|
|
5
|
+
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { connect, type DaemonConnection, type RemoteRuntime, type RuntimeOptions } from \"../internal/client/index.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { createBrowserRuntimeAdapter } from \"../browser/browser-runtime.cjs\";\nimport { createScriptRuntimeAdapter } from \"../runtime/script-runtime.cjs\";\nimport { createAppServerAdapter } from \"../server/app-server.cjs\";\nimport type { CreateBrowserRuntimeOptions, CreateIsolateHostOptions, CreateRuntimeOptions, IsolateHost } from \"../types.cjs\";\n\nfunction resolveDefaultDaemonEntrypoint(): string | null {\n const localPath = path.resolve(import.meta.dirname, \"../daemon.ts\");\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n return null;\n}\n\nasync function waitForSocket(socketPath: string, timeoutMs: number): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (fs.existsSync(socketPath)) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n throw new Error(`Daemon socket not available after ${timeoutMs}ms`);\n}\n\nclass HostImpl implements IsolateHost {\n private readonly options: CreateIsolateHostOptions;\n private daemonProcess: ChildProcess | null = null;\n private connection: DaemonConnection | null = null;\n private connectionPromise: Promise<DaemonConnection> | null = null;\n private readonly servers = new Set<object>();\n private readonly runtimes = new Set<object>();\n\n constructor(options?: CreateIsolateHostOptions) {\n this.options = options ?? {};\n }\n\n async createAppServer(options: CreateRuntimeOptions & { key: string; entry: string; entryFilename?: string; webSockets?: { onCommand?: (command: { type: \"message\" | \"close\"; connectionId: string; data?: string | ArrayBuffer; code?: number; reason?: string }) => void } }) {\n const server = await createAppServerAdapter(() => this.getConnection(), options);\n this.servers.add(server);\n return server;\n }\n\n async createRuntime(options: CreateRuntimeOptions) {\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = options.key ?? \"runtime\";\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n );\n const runtime = await this.createRemoteRuntime(\n {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: options.features?.tests ?? false,\n },\n options.key,\n );\n runtimeId = runtime.id;\n const adapter = createScriptRuntimeAdapter(runtime, diagnostics, {\n onBeforeDispose: (reason) => bindingsAdapter.abort(reason),\n });\n this.runtimes.add(adapter);\n return adapter;\n }\n\n async createBrowserRuntime(options: CreateBrowserRuntimeOptions) {\n const browserRuntime = await createBrowserRuntimeAdapter(\n async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key),\n options,\n );\n this.runtimes.add(browserRuntime);\n return browserRuntime;\n }\n\n async diagnostics() {\n return {\n runtimes: this.runtimes.size,\n servers: this.servers.size,\n connected: this.connection?.isConnected() ?? false,\n };\n }\n\n async close(): Promise<void> {\n if (this.connection) {\n await this.connection.close().catch(() => {});\n }\n this.connection = null;\n this.connectionPromise = null;\n\n if (this.daemonProcess) {\n const process = this.daemonProcess;\n this.daemonProcess = null;\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n process.kill(\"SIGKILL\");\n resolve();\n }, 5000);\n process.once(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n process.kill(\"SIGTERM\");\n });\n }\n }\n\n private async createRemoteRuntime(options: RuntimeOptions, key?: string): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n if (key) {\n return await connection.createNamespace(key).createRuntime(options);\n }\n return await connection.createRuntime(options);\n }\n\n private async getConnection(): Promise<DaemonConnection> {\n if (this.connection?.isConnected()) {\n return this.connection;\n }\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = (async () => {\n await this.ensureDaemon();\n this.connection = await connect({\n socket: this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\",\n timeout: this.options.daemon?.timeoutMs ?? 5000,\n });\n return this.connection;\n })();\n\n return await this.connectionPromise.finally(() => {\n this.connectionPromise = null;\n });\n }\n\n private async ensureDaemon(): Promise<void> {\n if (this.connection?.isConnected()) {\n return;\n }\n\n if (this.options.daemon?.autoStart === false) {\n return;\n }\n\n if (this.daemonProcess) {\n return;\n }\n\n const socketPath = this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\";\n const entrypoint = this.options.daemon?.entrypoint ?? resolveDefaultDaemonEntrypoint();\n\n try {\n if (fs.existsSync(socketPath)) {\n fs.unlinkSync(socketPath);\n }\n } catch {\n // ignore stale socket cleanup failures\n }\n\n const cli = entrypoint\n ? [\"node\", \"--experimental-strip-types\", entrypoint, \"--socket\", socketPath]\n : [\"isolate-daemon\", \"--socket\", socketPath];\n const cwd = this.options.daemon?.cwd ?? (entrypoint ? path.resolve(import.meta.dirname, \"../..\") : process.cwd());\n this.daemonProcess = spawn(cli[0]!, cli.slice(1), {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n NODE_OPTIONS: \"\",\n },\n });\n\n this.daemonProcess.stdout?.on(\"data\", (data: Buffer) => {\n console.log(\"[isolate-host]\", data.toString().trim());\n });\n this.daemonProcess.stderr?.on(\"data\", (data: Buffer) => {\n console.error(\"[isolate-host]\", data.toString().trim());\n });\n this.daemonProcess.on(\"exit\", () => {\n this.daemonProcess = null;\n this.connection = null;\n this.connectionPromise = null;\n });\n\n await waitForSocket(socketPath, this.options.daemon?.timeoutMs ?? 10_000);\n }\n}\n\nexport async function createIsolateHost(options?: CreateIsolateHostOptions): Promise<IsolateHost> {\n return new HostImpl(options);\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAe,IAAf;AACiB,IAAjB;AACyC,IAAzC;AACwF,IAAxF;AACyC,IAAzC;AAC6C,IAA7C;AAC4C,IAA5C;AAC2C,IAA3C;AACuC,IAAvC;AAGA,SAAS,8BAA8B,GAAkB;AAAA,EACvD,MAAM,YAAY,yBAAK,QAAoB
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAe,IAAf;AACiB,IAAjB;AACyC,IAAzC;AACwF,IAAxF;AACyC,IAAzC;AAC6C,IAA7C;AAC4C,IAA5C;AAC2C,IAA3C;AACuC,IAAvC;AAGA,SAAS,8BAA8B,GAAkB;AAAA,EACvD,MAAM,YAAY,yBAAK,QAAoB,8CAAS,cAAc;AAAA,EAClE,IAAI,uBAAG,WAAW,SAAS,GAAG;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,aAAa,CAAC,YAAoB,WAAkC;AAAA,EACjF,MAAM,YAAY,KAAK,IAAI;AAAA,EAC3B,OAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AAAA,IACzC,IAAI,uBAAG,WAAW,UAAU,GAAG;AAAA,MAC7B,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,IACA,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,IAAI,MAAM,qCAAqC,aAAa;AAAA;AAAA;AAGpE,MAAM,SAAgC;AAAA,EACnB;AAAA,EACT,gBAAqC;AAAA,EACrC,aAAsC;AAAA,EACtC,oBAAsD;AAAA,EAC7C,UAAU,IAAI;AAAA,EACd,WAAW,IAAI;AAAA,EAEhC,WAAW,CAAC,SAAoC;AAAA,IAC9C,KAAK,UAAU,WAAW,CAAC;AAAA;AAAA,OAGvB,gBAAe,CAAC,SAA0P;AAAA,IAC9Q,MAAM,SAAS,MAAM,yCAAuB,MAAM,KAAK,cAAc,GAAG,OAAO;AAAA,IAC/E,KAAK,QAAQ,IAAI,MAAM;AAAA,IACvB,OAAO;AAAA;AAAA,OAGH,cAAa,CAAC,SAA+B;AAAA,IACjD,MAAM,cAAc,4CAAyB;AAAA,IAC7C,IAAI,YAAY,QAAQ,OAAO;AAAA,IAC/B,MAAM,kBAAkB,qDACtB,QAAQ,UACR,MAAM,WACN,WACF;AAAA,IACA,MAAM,UAAU,MAAM,KAAK,oBACzB;AAAA,SACK,gBAAgB;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb,eAAe,QAAQ;AAAA,MACvB,kBAAkB,QAAQ;AAAA,MAC1B,iBAAiB,QAAQ,UAAU,SAAS;AAAA,IAC9C,GACA,QAAQ,GACV;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,MAAM,UAAU,iDAA2B,SAAS,aAAa;AAAA,MAC/D,iBAAiB,CAAC,WAAW,gBAAgB,MAAM,MAAM;AAAA,IAC3D,CAAC;AAAA,IACD,KAAK,SAAS,IAAI,OAAO;AAAA,IACzB,OAAO;AAAA;AAAA,OAGH,qBAAoB,CAAC,SAAsC;AAAA,IAC/D,MAAM,iBAAiB,MAAM,mDAC3B,OAAO,mBAAmB,MAAM,KAAK,oBAAoB,gBAAgB,QAAQ,GAAG,GACpF,OACF;AAAA,IACA,KAAK,SAAS,IAAI,cAAc;AAAA,IAChC,OAAO;AAAA;AAAA,OAGH,YAAW,GAAG;AAAA,IAClB,OAAO;AAAA,MACL,UAAU,KAAK,SAAS;AAAA,MACxB,SAAS,KAAK,QAAQ;AAAA,MACtB,WAAW,KAAK,YAAY,YAAY,KAAK;AAAA,IAC/C;AAAA;AAAA,OAGI,MAAK,GAAkB;AAAA,IAC3B,IAAI,KAAK,YAAY;AAAA,MACnB,MAAM,KAAK,WAAW,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,KAAK,aAAa;AAAA,IAClB,KAAK,oBAAoB;AAAA,IAEzB,IAAI,KAAK,eAAe;AAAA,MACtB,MAAM,WAAU,KAAK;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,MAAM,IAAI,QAAc,CAAC,YAAY;AAAA,QACnC,MAAM,UAAU,WAAW,MAAM;AAAA,UAC/B,SAAQ,KAAK,SAAS;AAAA,UACtB,QAAQ;AAAA,WACP,IAAI;AAAA,QACP,SAAQ,KAAK,QAAQ,MAAM;AAAA,UACzB,aAAa,OAAO;AAAA,UACpB,QAAQ;AAAA,SACT;AAAA,QACD,SAAQ,KAAK,SAAS;AAAA,OACvB;AAAA,IACH;AAAA;AAAA,OAGY,oBAAmB,CAAC,SAAyB,KAAsC;AAAA,IAC/F,MAAM,aAAa,MAAM,KAAK,cAAc;AAAA,IAC5C,IAAI,KAAK;AAAA,MACP,OAAO,MAAM,WAAW,gBAAgB,GAAG,EAAE,cAAc,OAAO;AAAA,IACpE;AAAA,IACA,OAAO,MAAM,WAAW,cAAc,OAAO;AAAA;AAAA,OAGjC,cAAa,GAA8B;AAAA,IACvD,IAAI,KAAK,YAAY,YAAY,GAAG;AAAA,MAClC,OAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,KAAK,mBAAmB;AAAA,MAC1B,OAAO,KAAK;AAAA,IACd;AAAA,IAEA,KAAK,qBAAqB,YAAY;AAAA,MACpC,MAAM,KAAK,aAAa;AAAA,MACxB,KAAK,aAAa,MAAM,sBAAQ;AAAA,QAC9B,QAAQ,KAAK,QAAQ,QAAQ,cAAc;AAAA,QAC3C,SAAS,KAAK,QAAQ,QAAQ,aAAa;AAAA,MAC7C,CAAC;AAAA,MACD,OAAO,KAAK;AAAA,OACX;AAAA,IAEH,OAAO,MAAM,KAAK,kBAAkB,QAAQ,MAAM;AAAA,MAChD,KAAK,oBAAoB;AAAA,KAC1B;AAAA;AAAA,OAGW,aAAY,GAAkB;AAAA,IAC1C,IAAI,KAAK,YAAY,YAAY,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,QAAQ,QAAQ,cAAc,OAAO;AAAA,MAC5C;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,KAAK,QAAQ,QAAQ,cAAc;AAAA,IACtD,MAAM,aAAa,KAAK,QAAQ,QAAQ,cAAc,+BAA+B;AAAA,IAErF,IAAI;AAAA,MACF,IAAI,uBAAG,WAAW,UAAU,GAAG;AAAA,QAC7B,uBAAG,WAAW,UAAU;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,IAIR,MAAM,MAAM,aACR,CAAC,QAAQ,8BAA8B,YAAY,YAAY,UAAU,IACzE,CAAC,kBAAkB,YAAY,UAAU;AAAA,IAC7C,MAAM,MAAM,KAAK,QAAQ,QAAQ,QAAQ,aAAa,yBAAK,QAAoB,8CAAS,OAAO,IAAI,QAAQ,IAAI;AAAA,IAC/G,KAAK,gBAAgB,gCAAM,IAAI,IAAK,IAAI,MAAM,CAAC,GAAG;AAAA,MAChD;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK;AAAA,WACA,QAAQ;AAAA,QACX,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,IAED,KAAK,cAAc,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAAA,MACtD,QAAQ,IAAI,kBAAkB,KAAK,SAAS,EAAE,KAAK,CAAC;AAAA,KACrD;AAAA,IACD,KAAK,cAAc,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAAA,MACtD,QAAQ,MAAM,kBAAkB,KAAK,SAAS,EAAE,KAAK,CAAC;AAAA,KACvD;AAAA,IACD,KAAK,cAAc,GAAG,QAAQ,MAAM;AAAA,MAClC,KAAK,gBAAgB;AAAA,MACrB,KAAK,aAAa;AAAA,MAClB,KAAK,oBAAoB;AAAA,KAC1B;AAAA,IAED,MAAM,cAAc,YAAY,KAAK,QAAQ,QAAQ,aAAa,GAAM;AAAA;AAE5E;AAEA,eAAsB,iBAAiB,CAAC,SAA0D;AAAA,EAChG,OAAO,IAAI,SAAS,OAAO;AAAA;",
|
|
8
|
+
"debugId": "C171316CAF8E438664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|