@ricsam/isolate 0.0.1 → 0.1.1
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 +243 -34
- package/dist/cjs/bridge/diagnostics.cjs +58 -0
- package/dist/cjs/bridge/diagnostics.cjs.map +10 -0
- package/dist/cjs/bridge/legacy-adapters.cjs +242 -0
- package/dist/cjs/bridge/legacy-adapters.cjs.map +10 -0
- package/dist/cjs/bridge/request-context.cjs +59 -0
- package/dist/cjs/bridge/request-context.cjs.map +10 -0
- package/dist/cjs/bridge/runtime-bindings.cjs +367 -0
- package/dist/cjs/bridge/runtime-bindings.cjs.map +10 -0
- package/dist/cjs/browser/browser-runtime.cjs +157 -0
- package/dist/cjs/browser/browser-runtime.cjs.map +10 -0
- package/dist/cjs/daemon.cjs +91 -0
- package/dist/cjs/daemon.cjs.map +10 -0
- package/dist/cjs/files/index.cjs +140 -0
- package/dist/cjs/files/index.cjs.map +10 -0
- package/dist/cjs/host/create-isolate-host.cjs +235 -0
- package/dist/cjs/host/create-isolate-host.cjs.map +10 -0
- package/dist/cjs/host/index.cjs +47 -0
- package/dist/cjs/host/index.cjs.map +10 -0
- package/dist/cjs/index.cjs +55 -0
- package/dist/cjs/index.cjs.map +10 -0
- package/dist/cjs/internal/client/connection.cjs +1919 -0
- package/dist/cjs/internal/client/connection.cjs.map +10 -0
- package/dist/cjs/internal/client/index.cjs +48 -0
- package/dist/cjs/internal/client/index.cjs.map +10 -0
- package/dist/cjs/internal/client/types.cjs +30 -0
- package/dist/cjs/internal/client/types.cjs.map +9 -0
- package/dist/cjs/internal/console/index.cjs +506 -0
- package/dist/cjs/internal/console/index.cjs.map +10 -0
- package/dist/cjs/internal/console/utils.cjs +70 -0
- package/dist/cjs/internal/console/utils.cjs.map +10 -0
- package/dist/cjs/internal/core/index.cjs +2745 -0
- package/dist/cjs/internal/core/index.cjs.map +10 -0
- package/dist/cjs/internal/crypto/index.cjs +470 -0
- package/dist/cjs/internal/crypto/index.cjs.map +10 -0
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs +355 -0
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +10 -0
- package/dist/cjs/internal/daemon/connection.cjs +1952 -0
- package/dist/cjs/internal/daemon/connection.cjs.map +10 -0
- package/dist/cjs/internal/daemon/daemon.cjs +98 -0
- package/dist/cjs/internal/daemon/daemon.cjs.map +10 -0
- package/dist/cjs/internal/daemon/index.cjs +145 -0
- package/dist/cjs/internal/daemon/index.cjs.map +10 -0
- package/dist/cjs/internal/daemon/runtime-pool.cjs +106 -0
- package/dist/cjs/internal/daemon/runtime-pool.cjs.map +10 -0
- package/dist/cjs/internal/daemon/types.cjs +30 -0
- package/dist/cjs/internal/daemon/types.cjs.map +9 -0
- package/dist/cjs/internal/encoding/index.cjs +419 -0
- package/dist/cjs/internal/encoding/index.cjs.map +10 -0
- package/dist/cjs/internal/fetch/consistency/origins.cjs +598 -0
- package/dist/cjs/internal/fetch/consistency/origins.cjs.map +10 -0
- package/dist/cjs/internal/fetch/index.cjs +2640 -0
- package/dist/cjs/internal/fetch/index.cjs.map +10 -0
- package/dist/cjs/internal/fetch/stream-state.cjs +256 -0
- package/dist/cjs/internal/fetch/stream-state.cjs.map +10 -0
- package/dist/cjs/internal/fs/index.cjs +847 -0
- package/dist/cjs/internal/fs/index.cjs.map +10 -0
- package/dist/cjs/internal/fs/node-adapter.cjs +254 -0
- package/dist/cjs/internal/fs/node-adapter.cjs.map +10 -0
- package/dist/cjs/internal/module-loader/bundle.cjs +482 -0
- package/dist/cjs/internal/module-loader/bundle.cjs.map +10 -0
- package/dist/cjs/internal/module-loader/index.cjs +240 -0
- package/dist/cjs/internal/module-loader/index.cjs.map +10 -0
- package/dist/cjs/internal/module-loader/mappings.cjs +120 -0
- package/dist/cjs/internal/module-loader/mappings.cjs.map +10 -0
- package/dist/cjs/internal/module-loader/resolve.cjs +177 -0
- package/dist/cjs/internal/module-loader/resolve.cjs.map +10 -0
- package/dist/cjs/internal/module-loader/strip-types.cjs +236 -0
- package/dist/cjs/internal/module-loader/strip-types.cjs.map +10 -0
- package/dist/cjs/internal/path/index.cjs +503 -0
- package/dist/cjs/internal/path/index.cjs.map +10 -0
- package/dist/cjs/internal/playwright/client.cjs +49 -0
- package/dist/cjs/internal/playwright/client.cjs.map +10 -0
- package/dist/cjs/internal/playwright/handler.cjs +1416 -0
- package/dist/cjs/internal/playwright/handler.cjs.map +10 -0
- package/dist/cjs/internal/playwright/index.cjs +1289 -0
- package/dist/cjs/internal/playwright/index.cjs.map +10 -0
- package/dist/cjs/internal/playwright/types.cjs +47 -0
- package/dist/cjs/internal/playwright/types.cjs.map +10 -0
- package/dist/cjs/internal/protocol/codec.cjs +510 -0
- package/dist/cjs/internal/protocol/codec.cjs.map +10 -0
- package/dist/cjs/internal/protocol/framing.cjs +141 -0
- package/dist/cjs/internal/protocol/framing.cjs.map +10 -0
- package/dist/cjs/internal/protocol/index.cjs +110 -0
- package/dist/cjs/internal/protocol/index.cjs.map +10 -0
- package/dist/cjs/internal/protocol/marshalValue.cjs +518 -0
- package/dist/cjs/internal/protocol/marshalValue.cjs.map +10 -0
- package/dist/cjs/internal/protocol/serialization.cjs +109 -0
- package/dist/cjs/internal/protocol/serialization.cjs.map +10 -0
- package/dist/cjs/internal/protocol/types.cjs +181 -0
- package/dist/cjs/internal/protocol/types.cjs.map +10 -0
- package/dist/cjs/internal/runtime/index.cjs +1235 -0
- package/dist/cjs/internal/runtime/index.cjs.map +10 -0
- package/dist/cjs/internal/server/index.cjs +223 -0
- package/dist/cjs/internal/server/index.cjs.map +10 -0
- package/dist/cjs/internal/test-environment/index.cjs +1415 -0
- package/dist/cjs/internal/test-environment/index.cjs.map +10 -0
- package/dist/cjs/internal/timers/index.cjs +200 -0
- package/dist/cjs/internal/timers/index.cjs.map +10 -0
- package/dist/cjs/internal/transform/index.cjs +361 -0
- package/dist/cjs/internal/transform/index.cjs.map +10 -0
- package/dist/cjs/internal/typecheck/index.cjs +60 -0
- package/dist/cjs/internal/typecheck/index.cjs.map +10 -0
- package/dist/cjs/internal/typecheck/isolate-types.cjs +2614 -0
- package/dist/cjs/internal/typecheck/isolate-types.cjs.map +10 -0
- package/dist/cjs/internal/typecheck/typecheck.cjs +131 -0
- package/dist/cjs/internal/typecheck/typecheck.cjs.map +10 -0
- package/dist/cjs/modules/index.cjs +160 -0
- package/dist/cjs/modules/index.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/runtime/script-runtime.cjs +97 -0
- package/dist/cjs/runtime/script-runtime.cjs.map +10 -0
- package/dist/cjs/server/app-server.cjs +158 -0
- package/dist/cjs/server/app-server.cjs.map +10 -0
- package/dist/cjs/testing/integration-helpers.cjs +127 -0
- package/dist/cjs/testing/integration-helpers.cjs.map +10 -0
- package/dist/cjs/typecheck/index.cjs +96 -0
- package/dist/cjs/typecheck/index.cjs.map +10 -0
- package/dist/cjs/types.cjs +30 -0
- package/dist/cjs/types.cjs.map +9 -0
- package/dist/mjs/bridge/diagnostics.mjs +18 -0
- package/dist/mjs/bridge/diagnostics.mjs.map +10 -0
- package/dist/mjs/bridge/legacy-adapters.mjs +178 -0
- package/dist/mjs/bridge/legacy-adapters.mjs.map +10 -0
- package/dist/mjs/bridge/request-context.mjs +19 -0
- package/dist/mjs/bridge/request-context.mjs.map +10 -0
- package/dist/mjs/bridge/runtime-bindings.mjs +303 -0
- package/dist/mjs/bridge/runtime-bindings.mjs.map +10 -0
- package/dist/mjs/browser/browser-runtime.mjs +93 -0
- package/dist/mjs/browser/browser-runtime.mjs.map +10 -0
- package/dist/mjs/daemon.mjs +91 -0
- package/dist/mjs/daemon.mjs.map +10 -0
- package/dist/mjs/files/index.mjs +76 -0
- package/dist/mjs/files/index.mjs.map +10 -0
- package/dist/mjs/host/create-isolate-host.mjs +171 -0
- package/dist/mjs/host/create-isolate-host.mjs.map +10 -0
- package/dist/mjs/host/index.mjs +7 -0
- package/dist/mjs/host/index.mjs.map +10 -0
- package/dist/mjs/index.mjs +15 -0
- package/dist/mjs/index.mjs.map +10 -0
- package/dist/mjs/internal/client/connection.mjs +1872 -0
- package/dist/mjs/internal/client/connection.mjs.map +10 -0
- package/dist/mjs/internal/client/index.mjs +8 -0
- package/dist/mjs/internal/client/index.mjs.map +10 -0
- package/dist/mjs/internal/client/types.mjs +2 -0
- package/dist/mjs/internal/client/types.mjs.map +9 -0
- package/dist/mjs/internal/console/index.mjs +442 -0
- package/dist/mjs/internal/console/index.mjs.map +10 -0
- package/dist/mjs/internal/console/utils.mjs +30 -0
- package/dist/mjs/internal/console/utils.mjs.map +10 -0
- package/dist/mjs/internal/core/index.mjs +2681 -0
- package/dist/mjs/internal/core/index.mjs.map +10 -0
- package/dist/mjs/internal/crypto/index.mjs +406 -0
- package/dist/mjs/internal/crypto/index.mjs.map +10 -0
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs +315 -0
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +10 -0
- package/dist/mjs/internal/daemon/connection.mjs +1931 -0
- package/dist/mjs/internal/daemon/connection.mjs.map +10 -0
- package/dist/mjs/internal/daemon/daemon.mjs +98 -0
- package/dist/mjs/internal/daemon/daemon.mjs.map +10 -0
- package/dist/mjs/internal/daemon/index.mjs +105 -0
- package/dist/mjs/internal/daemon/index.mjs.map +10 -0
- package/dist/mjs/internal/daemon/runtime-pool.mjs +66 -0
- package/dist/mjs/internal/daemon/runtime-pool.mjs.map +10 -0
- package/dist/mjs/internal/daemon/types.mjs +2 -0
- package/dist/mjs/internal/daemon/types.mjs.map +9 -0
- package/dist/mjs/internal/encoding/index.mjs +379 -0
- package/dist/mjs/internal/encoding/index.mjs.map +10 -0
- package/dist/mjs/internal/fetch/consistency/origins.mjs +558 -0
- package/dist/mjs/internal/fetch/consistency/origins.mjs.map +10 -0
- package/dist/mjs/internal/fetch/index.mjs +2580 -0
- package/dist/mjs/internal/fetch/index.mjs.map +10 -0
- package/dist/mjs/internal/fetch/stream-state.mjs +216 -0
- package/dist/mjs/internal/fetch/stream-state.mjs.map +10 -0
- package/dist/mjs/internal/fs/index.mjs +783 -0
- package/dist/mjs/internal/fs/index.mjs.map +10 -0
- package/dist/mjs/internal/fs/node-adapter.mjs +190 -0
- package/dist/mjs/internal/fs/node-adapter.mjs.map +10 -0
- package/dist/mjs/internal/module-loader/bundle.mjs +418 -0
- package/dist/mjs/internal/module-loader/bundle.mjs.map +10 -0
- package/dist/mjs/internal/module-loader/index.mjs +185 -0
- package/dist/mjs/internal/module-loader/index.mjs.map +10 -0
- package/dist/mjs/internal/module-loader/mappings.mjs +80 -0
- package/dist/mjs/internal/module-loader/mappings.mjs.map +10 -0
- package/dist/mjs/internal/module-loader/resolve.mjs +113 -0
- package/dist/mjs/internal/module-loader/resolve.mjs.map +10 -0
- package/dist/mjs/internal/module-loader/strip-types.mjs +172 -0
- package/dist/mjs/internal/module-loader/strip-types.mjs.map +10 -0
- package/dist/mjs/internal/path/index.mjs +463 -0
- package/dist/mjs/internal/path/index.mjs.map +10 -0
- package/dist/mjs/internal/playwright/client.mjs +13 -0
- package/dist/mjs/internal/playwright/client.mjs.map +10 -0
- package/dist/mjs/internal/playwright/handler.mjs +1378 -0
- package/dist/mjs/internal/playwright/handler.mjs.map +10 -0
- package/dist/mjs/internal/playwright/index.mjs +1234 -0
- package/dist/mjs/internal/playwright/index.mjs.map +10 -0
- package/dist/mjs/internal/playwright/types.mjs +7 -0
- package/dist/mjs/internal/playwright/types.mjs.map +10 -0
- package/dist/mjs/internal/protocol/codec.mjs +470 -0
- package/dist/mjs/internal/protocol/codec.mjs.map +10 -0
- package/dist/mjs/internal/protocol/framing.mjs +101 -0
- package/dist/mjs/internal/protocol/framing.mjs.map +10 -0
- package/dist/mjs/internal/protocol/index.mjs +98 -0
- package/dist/mjs/internal/protocol/index.mjs.map +10 -0
- package/dist/mjs/internal/protocol/marshalValue.mjs +494 -0
- package/dist/mjs/internal/protocol/marshalValue.mjs.map +10 -0
- package/dist/mjs/internal/protocol/serialization.mjs +69 -0
- package/dist/mjs/internal/protocol/serialization.mjs.map +10 -0
- package/dist/mjs/internal/protocol/types.mjs +141 -0
- package/dist/mjs/internal/protocol/types.mjs.map +10 -0
- package/dist/mjs/internal/runtime/index.mjs +1198 -0
- package/dist/mjs/internal/runtime/index.mjs.map +10 -0
- package/dist/mjs/internal/server/index.mjs +183 -0
- package/dist/mjs/internal/server/index.mjs.map +10 -0
- package/dist/mjs/internal/test-environment/index.mjs +1351 -0
- package/dist/mjs/internal/test-environment/index.mjs.map +10 -0
- package/dist/mjs/internal/timers/index.mjs +136 -0
- package/dist/mjs/internal/timers/index.mjs.map +10 -0
- package/dist/mjs/internal/transform/index.mjs +321 -0
- package/dist/mjs/internal/transform/index.mjs.map +10 -0
- package/dist/mjs/internal/typecheck/index.mjs +35 -0
- package/dist/mjs/internal/typecheck/index.mjs.map +10 -0
- package/dist/mjs/internal/typecheck/isolate-types.mjs +2574 -0
- package/dist/mjs/internal/typecheck/isolate-types.mjs.map +10 -0
- package/dist/mjs/internal/typecheck/typecheck.mjs +91 -0
- package/dist/mjs/internal/typecheck/typecheck.mjs.map +10 -0
- package/dist/mjs/modules/index.mjs +96 -0
- package/dist/mjs/modules/index.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/runtime/script-runtime.mjs +57 -0
- package/dist/mjs/runtime/script-runtime.mjs.map +10 -0
- package/dist/mjs/server/app-server.mjs +118 -0
- package/dist/mjs/server/app-server.mjs.map +10 -0
- package/dist/mjs/testing/integration-helpers.mjs +63 -0
- package/dist/mjs/testing/integration-helpers.mjs.map +10 -0
- package/dist/mjs/typecheck/index.mjs +56 -0
- package/dist/mjs/typecheck/index.mjs.map +10 -0
- package/dist/mjs/types.mjs +2 -0
- package/dist/mjs/types.mjs.map +9 -0
- package/dist/types/bridge/diagnostics.d.ts +12 -0
- package/dist/types/bridge/legacy-adapters.d.ts +14 -0
- package/dist/types/bridge/request-context.d.ts +10 -0
- package/dist/types/bridge/runtime-bindings.d.ts +14 -0
- package/dist/types/browser/browser-runtime.d.ts +3 -0
- package/dist/types/daemon.d.ts +2 -0
- package/dist/types/files/index.d.ts +5 -0
- package/dist/types/host/create-isolate-host.d.ts +2 -0
- package/dist/types/host/index.d.ts +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/internal/client/connection.d.ts +9 -0
- package/dist/types/internal/client/index.d.ts +8 -0
- package/dist/types/internal/client/types.d.ts +198 -0
- package/dist/types/internal/console/index.d.ts +108 -0
- package/dist/types/internal/console/utils.d.ts +27 -0
- package/dist/types/internal/core/index.d.ts +119 -0
- package/dist/types/internal/crypto/index.d.ts +18 -0
- package/dist/types/internal/daemon/callback-fs-handler.d.ts +28 -0
- package/dist/types/internal/daemon/connection.d.ts +9 -0
- package/dist/types/internal/daemon/daemon.d.ts +2 -0
- package/dist/types/internal/daemon/index.d.ts +14 -0
- package/dist/types/internal/daemon/runtime-pool.d.ts +16 -0
- package/dist/types/internal/daemon/types.d.ts +211 -0
- package/dist/types/internal/encoding/index.d.ts +21 -0
- package/dist/types/internal/fetch/consistency/origins.d.ts +179 -0
- package/dist/types/internal/fetch/index.d.ts +93 -0
- package/dist/types/internal/fetch/stream-state.d.ts +65 -0
- package/dist/types/internal/fs/index.d.ts +70 -0
- package/dist/types/internal/fs/node-adapter.d.ts +24 -0
- package/dist/types/internal/module-loader/bundle.d.ts +33 -0
- package/dist/types/internal/module-loader/index.d.ts +30 -0
- package/dist/types/internal/module-loader/mappings.d.ts +47 -0
- package/dist/types/internal/module-loader/resolve.d.ts +26 -0
- package/dist/types/internal/module-loader/strip-types.d.ts +19 -0
- package/dist/types/internal/path/index.d.ts +23 -0
- package/dist/types/internal/playwright/client.d.ts +7 -0
- package/dist/types/internal/playwright/handler.d.ts +44 -0
- package/dist/types/internal/playwright/index.d.ts +14 -0
- package/dist/types/internal/playwright/types.d.ts +145 -0
- package/dist/types/internal/protocol/codec.d.ts +242 -0
- package/dist/types/internal/protocol/framing.d.ts +89 -0
- package/dist/types/internal/protocol/index.d.ts +10 -0
- package/dist/types/internal/protocol/marshalValue.d.ts +79 -0
- package/dist/types/internal/protocol/serialization.d.ts +23 -0
- package/dist/types/internal/protocol/types.d.ts +996 -0
- package/dist/types/internal/runtime/index.d.ts +200 -0
- package/dist/types/internal/server/index.d.ts +42 -0
- package/dist/types/internal/test-environment/index.d.ts +112 -0
- package/dist/types/internal/timers/index.d.ts +22 -0
- package/dist/types/internal/transform/index.d.ts +36 -0
- package/dist/types/internal/typecheck/index.d.ts +7 -0
- package/dist/types/internal/typecheck/isolate-types.d.ts +94 -0
- package/dist/types/internal/typecheck/typecheck.d.ts +148 -0
- package/dist/types/modules/index.d.ts +2 -0
- package/dist/types/runtime/script-runtime.d.ts +6 -0
- package/dist/types/server/app-server.d.ts +3 -0
- package/dist/types/testing/integration-helpers.d.ts +9 -0
- package/dist/types/typecheck/index.d.ts +8 -0
- package/dist/types/types.d.ts +233 -0
- package/package.json +82 -6
package/README.md
CHANGED
|
@@ -1,45 +1,254 @@
|
|
|
1
1
|
# @ricsam/isolate
|
|
2
2
|
|
|
3
|
-
|
|
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
|
+
});
|
|
4
224
|
|
|
5
|
-
|
|
225
|
+
if (!result.success) {
|
|
226
|
+
console.error(formatTypecheckErrors(result.errors));
|
|
227
|
+
}
|
|
228
|
+
```
|
|
6
229
|
|
|
7
|
-
|
|
230
|
+
Built-in profiles:
|
|
8
231
|
|
|
9
|
-
|
|
232
|
+
- `backend`
|
|
233
|
+
- `agent`
|
|
234
|
+
- `browser-test`
|
|
10
235
|
|
|
11
|
-
|
|
12
|
-
1. Configure OIDC trusted publishing for the package name `@ricsam/isolate`
|
|
13
|
-
2. Enable secure, token-less publishing from CI/CD workflows
|
|
14
|
-
3. Establish provenance for packages published under this name
|
|
236
|
+
Capabilities can extend a profile with `fetch`, `files`, `tests`, `browser`, `tools`, `console`, `encoding`, and `timers`.
|
|
15
237
|
|
|
16
|
-
##
|
|
238
|
+
## Daemon CLI
|
|
17
239
|
|
|
18
|
-
|
|
240
|
+
The package also exposes an `isolate-daemon` binary:
|
|
19
241
|
|
|
20
|
-
|
|
242
|
+
```bash
|
|
243
|
+
isolate-daemon --socket /tmp/isolate.sock
|
|
244
|
+
```
|
|
21
245
|
|
|
22
|
-
|
|
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
|
|
23
249
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## DO NOT USE THIS PACKAGE
|
|
30
|
-
|
|
31
|
-
This package is a placeholder for OIDC configuration only. It:
|
|
32
|
-
- Contains no executable code
|
|
33
|
-
- Provides no functionality
|
|
34
|
-
- Should not be installed as a dependency
|
|
35
|
-
- Exists only for administrative purposes
|
|
36
|
-
|
|
37
|
-
## More Information
|
|
38
|
-
|
|
39
|
-
For more details about npm's trusted publishing feature, see:
|
|
40
|
-
- [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
|
|
41
|
-
- [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
**Maintained for OIDC setup purposes only**
|
|
250
|
+
```bash
|
|
251
|
+
npm run build
|
|
252
|
+
npm run typecheck
|
|
253
|
+
npm test
|
|
254
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
8
|
+
var __toCommonJS = (from) => {
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
10
|
+
if (entry)
|
|
11
|
+
return entry;
|
|
12
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
__moduleCache.set(from, entry);
|
|
22
|
+
return entry;
|
|
23
|
+
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
29
|
+
var __export = (target, all) => {
|
|
30
|
+
for (var name in all)
|
|
31
|
+
__defProp(target, name, {
|
|
32
|
+
get: all[name],
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/bridge/diagnostics.ts
|
|
40
|
+
var exports_diagnostics = {};
|
|
41
|
+
__export(exports_diagnostics, {
|
|
42
|
+
createRuntimeDiagnostics: () => createRuntimeDiagnostics
|
|
43
|
+
});
|
|
44
|
+
module.exports = __toCommonJS(exports_diagnostics);
|
|
45
|
+
function createRuntimeDiagnostics() {
|
|
46
|
+
return {
|
|
47
|
+
activeRequests: 0,
|
|
48
|
+
activeResources: 0,
|
|
49
|
+
pendingFiles: 0,
|
|
50
|
+
pendingFetches: 0,
|
|
51
|
+
pendingModules: 0,
|
|
52
|
+
pendingTools: 0,
|
|
53
|
+
streamCount: 0,
|
|
54
|
+
lifecycleState: "idle"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//# debugId=40FF8D24B6369A0D64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bridge/diagnostics.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
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
|
+
],
|
|
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": "40FF8D24B6369A0D64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
for (let key of __getOwnPropNames(mod))
|
|
23
|
+
if (!__hasOwnProp.call(to, key))
|
|
24
|
+
__defProp(to, key, {
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
26
|
+
enumerable: true
|
|
27
|
+
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __toCommonJS = (from) => {
|
|
33
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
34
|
+
if (entry)
|
|
35
|
+
return entry;
|
|
36
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
37
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
38
|
+
for (var key of __getOwnPropNames(from))
|
|
39
|
+
if (!__hasOwnProp.call(entry, key))
|
|
40
|
+
__defProp(entry, key, {
|
|
41
|
+
get: __accessProp.bind(from, key),
|
|
42
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
__moduleCache.set(from, entry);
|
|
46
|
+
return entry;
|
|
47
|
+
};
|
|
48
|
+
var __moduleCache;
|
|
49
|
+
var __returnValue = (v) => v;
|
|
50
|
+
function __exportSetter(name, newValue) {
|
|
51
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
52
|
+
}
|
|
53
|
+
var __export = (target, all) => {
|
|
54
|
+
for (var name in all)
|
|
55
|
+
__defProp(target, name, {
|
|
56
|
+
get: all[name],
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
set: __exportSetter.bind(all, name)
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/bridge/legacy-adapters.ts
|
|
64
|
+
var exports_legacy_adapters = {};
|
|
65
|
+
__export(exports_legacy_adapters, {
|
|
66
|
+
tryResolveModule: () => tryResolveModule,
|
|
67
|
+
normalizeExplicitModuleResult: () => normalizeExplicitModuleResult,
|
|
68
|
+
createMappedNodeModulesLoader: () => createMappedNodeModulesLoader,
|
|
69
|
+
createLegacyRuntimeOptions: () => createLegacyRuntimeOptions
|
|
70
|
+
});
|
|
71
|
+
module.exports = __toCommonJS(exports_legacy_adapters);
|
|
72
|
+
var import_node_path = __toESM(require("node:path"));
|
|
73
|
+
var import_request_context = require("./request-context.cjs");
|
|
74
|
+
function createHostCallContext(runtimeId, signal, resourceId) {
|
|
75
|
+
const requestContext = import_request_context.getRequestContext();
|
|
76
|
+
return {
|
|
77
|
+
signal,
|
|
78
|
+
runtimeId,
|
|
79
|
+
requestId: requestContext.requestId,
|
|
80
|
+
resourceId,
|
|
81
|
+
metadata: requestContext.metadata
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function normalizeModuleResolveResult(specifier, result, fallbackResolveDir) {
|
|
85
|
+
const resolved = await result;
|
|
86
|
+
if (resolved == null) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
if (typeof resolved === "string") {
|
|
90
|
+
const filename = import_node_path.default.posix.basename(specifier) || "__virtual_module__.js";
|
|
91
|
+
const resolveDir = specifier.startsWith("/") ? import_node_path.default.posix.dirname(specifier) : fallbackResolveDir ?? "/";
|
|
92
|
+
return {
|
|
93
|
+
code: resolved,
|
|
94
|
+
filename,
|
|
95
|
+
resolveDir
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
static: resolved.static,
|
|
100
|
+
filename: resolved.filename,
|
|
101
|
+
resolveDir: resolved.resolveDir,
|
|
102
|
+
code: resolved.code
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function isAsyncGeneratorFunction(handler) {
|
|
106
|
+
return handler.constructor.name === "AsyncGeneratorFunction";
|
|
107
|
+
}
|
|
108
|
+
function createLegacyRuntimeOptions(bindings, getRuntimeId, diagnostics) {
|
|
109
|
+
const moduleLoader = createLegacyModuleLoader(bindings.modules, getRuntimeId, diagnostics);
|
|
110
|
+
return {
|
|
111
|
+
console: bindings.console?.onEntry ? {
|
|
112
|
+
onEntry: (entry) => {
|
|
113
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `console:${crypto.randomUUID()}`);
|
|
114
|
+
bindings.console?.onEntry?.(entry, context);
|
|
115
|
+
}
|
|
116
|
+
} : undefined,
|
|
117
|
+
fetch: bindings.fetch ? async (url, init) => {
|
|
118
|
+
diagnostics.pendingFetches += 1;
|
|
119
|
+
diagnostics.activeResources += 1;
|
|
120
|
+
try {
|
|
121
|
+
const request = new Request(url, {
|
|
122
|
+
method: init.method,
|
|
123
|
+
headers: init.headers,
|
|
124
|
+
body: init.rawBody ? init.rawBody.slice(0) : null
|
|
125
|
+
});
|
|
126
|
+
const context = createHostCallContext(getRuntimeId(), init.signal, `fetch:${crypto.randomUUID()}`);
|
|
127
|
+
return await bindings.fetch(request, context);
|
|
128
|
+
} finally {
|
|
129
|
+
diagnostics.pendingFetches -= 1;
|
|
130
|
+
diagnostics.activeResources -= 1;
|
|
131
|
+
}
|
|
132
|
+
} : undefined,
|
|
133
|
+
fs: bindings.files ? {
|
|
134
|
+
readFile: bindings.files.readFile ? async (filePath) => {
|
|
135
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:read:${crypto.randomUUID()}`);
|
|
136
|
+
return await bindings.files.readFile(filePath, context);
|
|
137
|
+
} : undefined,
|
|
138
|
+
writeFile: bindings.files.writeFile ? async (filePath, data) => {
|
|
139
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:write:${crypto.randomUUID()}`);
|
|
140
|
+
return await bindings.files.writeFile(filePath, data, context);
|
|
141
|
+
} : undefined,
|
|
142
|
+
unlink: bindings.files.unlink ? async (filePath) => {
|
|
143
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:unlink:${crypto.randomUUID()}`);
|
|
144
|
+
return await bindings.files.unlink(filePath, context);
|
|
145
|
+
} : undefined,
|
|
146
|
+
readdir: bindings.files.readdir ? async (dirPath) => {
|
|
147
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:readdir:${crypto.randomUUID()}`);
|
|
148
|
+
return await bindings.files.readdir(dirPath, context);
|
|
149
|
+
} : undefined,
|
|
150
|
+
mkdir: bindings.files.mkdir ? async (dirPath, options) => {
|
|
151
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:mkdir:${crypto.randomUUID()}`);
|
|
152
|
+
return await bindings.files.mkdir(dirPath, options, context);
|
|
153
|
+
} : undefined,
|
|
154
|
+
rmdir: bindings.files.rmdir ? async (dirPath) => {
|
|
155
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rmdir:${crypto.randomUUID()}`);
|
|
156
|
+
return await bindings.files.rmdir(dirPath, context);
|
|
157
|
+
} : undefined,
|
|
158
|
+
stat: bindings.files.stat ? async (filePath) => {
|
|
159
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:stat:${crypto.randomUUID()}`);
|
|
160
|
+
return await bindings.files.stat(filePath, context);
|
|
161
|
+
} : undefined,
|
|
162
|
+
rename: bindings.files.rename ? async (from, to) => {
|
|
163
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rename:${crypto.randomUUID()}`);
|
|
164
|
+
return await bindings.files.rename(from, to, context);
|
|
165
|
+
} : undefined
|
|
166
|
+
} : undefined,
|
|
167
|
+
moduleLoader,
|
|
168
|
+
customFunctions: bindings.tools ? Object.fromEntries(Object.entries(bindings.tools).map(([name, handler]) => {
|
|
169
|
+
if (isAsyncGeneratorFunction(handler)) {
|
|
170
|
+
return [
|
|
171
|
+
name,
|
|
172
|
+
{
|
|
173
|
+
type: "asyncIterator",
|
|
174
|
+
fn: (...args) => {
|
|
175
|
+
diagnostics.pendingTools += 1;
|
|
176
|
+
diagnostics.activeResources += 1;
|
|
177
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);
|
|
178
|
+
const iterator = handler(...args, context);
|
|
179
|
+
return async function* () {
|
|
180
|
+
try {
|
|
181
|
+
yield* iterator;
|
|
182
|
+
} finally {
|
|
183
|
+
diagnostics.pendingTools -= 1;
|
|
184
|
+
diagnostics.activeResources -= 1;
|
|
185
|
+
}
|
|
186
|
+
}();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
];
|
|
190
|
+
}
|
|
191
|
+
return [
|
|
192
|
+
name,
|
|
193
|
+
{
|
|
194
|
+
type: "async",
|
|
195
|
+
fn: async (...args) => {
|
|
196
|
+
diagnostics.pendingTools += 1;
|
|
197
|
+
diagnostics.activeResources += 1;
|
|
198
|
+
try {
|
|
199
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);
|
|
200
|
+
return await handler(...args, context);
|
|
201
|
+
} finally {
|
|
202
|
+
diagnostics.pendingTools -= 1;
|
|
203
|
+
diagnostics.activeResources -= 1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
];
|
|
208
|
+
})) : undefined
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function createLegacyModuleLoader(resolver, getRuntimeId, diagnostics) {
|
|
212
|
+
if (!resolver) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
return async (specifier, importer) => {
|
|
216
|
+
diagnostics.activeResources += 1;
|
|
217
|
+
try {
|
|
218
|
+
const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `module:${crypto.randomUUID()}`);
|
|
219
|
+
const result = await resolver.resolve(specifier, importer, context);
|
|
220
|
+
return result;
|
|
221
|
+
} finally {
|
|
222
|
+
diagnostics.activeResources -= 1;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function createMappedNodeModulesLoader(mappings) {
|
|
227
|
+
if (mappings.length === 0) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
throw new Error("createMappedNodeModulesLoader is no longer used directly; call createModuleResolver().mountNodeModules() instead.");
|
|
231
|
+
}
|
|
232
|
+
async function tryResolveModule(resolver, specifier, importer, context) {
|
|
233
|
+
if (!resolver) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
return normalizeModuleResolveResult(specifier, resolver.resolve(specifier, importer, context), importer.resolveDir);
|
|
237
|
+
}
|
|
238
|
+
async function normalizeExplicitModuleResult(specifier, result, fallbackResolveDir) {
|
|
239
|
+
return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
//# debugId=D5F0F03020F4D4CD64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bridge/legacy-adapters.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
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
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "D5F0F03020F4D4CD64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|