@ricsam/isolate 0.1.3 → 0.1.5
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 +25 -2
- package/dist/cjs/internal/async-context/index.cjs +140 -0
- package/dist/cjs/internal/async-context/index.cjs.map +10 -0
- package/dist/cjs/internal/client/connection.cjs +175 -123
- package/dist/cjs/internal/client/connection.cjs.map +3 -3
- package/dist/cjs/internal/console/index.cjs +2 -2
- package/dist/cjs/internal/console/index.cjs.map +2 -2
- package/dist/cjs/internal/core/index.cjs +13 -5
- package/dist/cjs/internal/core/index.cjs.map +3 -3
- package/dist/cjs/internal/crypto/index.cjs +2 -2
- package/dist/cjs/internal/crypto/index.cjs.map +2 -2
- package/dist/cjs/internal/daemon/connection.cjs +77 -12
- package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
- package/dist/cjs/internal/encoding/index.cjs.map +1 -1
- package/dist/cjs/internal/fetch/index.cjs +80 -18
- package/dist/cjs/internal/fetch/index.cjs.map +3 -3
- 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 +2 -2
- package/dist/cjs/internal/module-loader/bundle.cjs +225 -8
- package/dist/cjs/internal/module-loader/bundle.cjs.map +3 -3
- package/dist/cjs/internal/path/index.cjs.map +1 -1
- package/dist/cjs/internal/playwright/index.cjs +2 -2
- package/dist/cjs/internal/playwright/index.cjs.map +2 -2
- package/dist/cjs/internal/runtime/index.cjs +78 -6
- package/dist/cjs/internal/runtime/index.cjs.map +3 -3
- package/dist/cjs/internal/test-environment/index.cjs +2 -2
- package/dist/cjs/internal/test-environment/index.cjs.map +2 -2
- package/dist/cjs/internal/timers/index.cjs +9 -4
- package/dist/cjs/internal/timers/index.cjs.map +3 -3
- package/dist/cjs/internal/typecheck/isolate-types.cjs +36 -1
- package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/internal/async-context/index.mjs +100 -0
- package/dist/mjs/internal/async-context/index.mjs.map +10 -0
- package/dist/mjs/internal/client/connection.mjs +176 -123
- package/dist/mjs/internal/client/connection.mjs.map +3 -3
- package/dist/mjs/internal/console/index.mjs +2 -2
- package/dist/mjs/internal/console/index.mjs.map +2 -2
- package/dist/mjs/internal/core/index.mjs +13 -5
- package/dist/mjs/internal/core/index.mjs.map +3 -3
- package/dist/mjs/internal/crypto/index.mjs +2 -2
- package/dist/mjs/internal/crypto/index.mjs.map +2 -2
- package/dist/mjs/internal/daemon/connection.mjs +77 -12
- package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
- package/dist/mjs/internal/encoding/index.mjs.map +1 -1
- package/dist/mjs/internal/fetch/index.mjs +80 -18
- package/dist/mjs/internal/fetch/index.mjs.map +3 -3
- 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 +2 -2
- package/dist/mjs/internal/module-loader/bundle.mjs +225 -8
- package/dist/mjs/internal/module-loader/bundle.mjs.map +3 -3
- package/dist/mjs/internal/path/index.mjs.map +1 -1
- package/dist/mjs/internal/playwright/index.mjs +2 -2
- package/dist/mjs/internal/playwright/index.mjs.map +2 -2
- package/dist/mjs/internal/runtime/index.mjs +78 -6
- package/dist/mjs/internal/runtime/index.mjs.map +3 -3
- package/dist/mjs/internal/test-environment/index.mjs +2 -2
- package/dist/mjs/internal/test-environment/index.mjs.map +2 -2
- package/dist/mjs/internal/timers/index.mjs +9 -4
- package/dist/mjs/internal/timers/index.mjs.map +3 -3
- package/dist/mjs/internal/typecheck/isolate-types.mjs +36 -1
- package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/internal/async-context/index.d.ts +5 -0
- package/dist/types/internal/console/index.d.ts +1 -1
- package/dist/types/internal/core/index.d.ts +2 -2
- package/dist/types/internal/crypto/index.d.ts +1 -1
- package/dist/types/internal/daemon/types.d.ts +1 -0
- package/dist/types/internal/encoding/index.d.ts +1 -1
- package/dist/types/internal/fetch/index.d.ts +1 -1
- package/dist/types/internal/fetch/stream-state.d.ts +1 -1
- package/dist/types/internal/fs/index.d.ts +1 -1
- package/dist/types/internal/path/index.d.ts +1 -1
- package/dist/types/internal/playwright/index.d.ts +1 -1
- package/dist/types/internal/test-environment/index.d.ts +1 -1
- package/dist/types/internal/timers/index.d.ts +1 -1
- package/dist/types/internal/typecheck/isolate-types.d.ts +2 -2
- package/package.json +8 -3
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// src/internal/runtime/index.ts
|
|
2
|
-
import ivm from "isolated-vm";
|
|
2
|
+
import ivm from "@ricsam/isolated-vm";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { setupCore } from "../core/index.mjs";
|
|
5
|
+
import { setupAsyncContext } from "../async-context/index.mjs";
|
|
5
6
|
import { normalizeEntryFilename } from "../protocol/index.mjs";
|
|
6
7
|
import {
|
|
7
8
|
transformEntryCode,
|
|
@@ -166,6 +167,20 @@ async function runWithExecutionTimeout(state, timeoutMs, label, operation) {
|
|
|
166
167
|
var iteratorSessions = new Map;
|
|
167
168
|
var ISOLATE_MARSHAL_CODE = `
|
|
168
169
|
(function() {
|
|
170
|
+
const __wrapAsyncContextCallback = (callback) => (
|
|
171
|
+
typeof callback === 'function' && globalThis.__isolateAsyncContextInternals?.wrapCallback
|
|
172
|
+
? globalThis.__isolateAsyncContextInternals.wrapCallback(callback)
|
|
173
|
+
: callback
|
|
174
|
+
);
|
|
175
|
+
let __customFn_nextCallbackId = 1;
|
|
176
|
+
const __customFn_callbacks = new Map();
|
|
177
|
+
|
|
178
|
+
function __customFn_registerCallback(callback) {
|
|
179
|
+
const callbackId = __customFn_nextCallbackId++;
|
|
180
|
+
__customFn_callbacks.set(callbackId, __wrapAsyncContextCallback(callback));
|
|
181
|
+
return callbackId;
|
|
182
|
+
}
|
|
183
|
+
|
|
169
184
|
// Marshal a value (JavaScript → Ref)
|
|
170
185
|
function marshalForHost(value, depth = 0) {
|
|
171
186
|
if (depth > 100) throw new Error('Maximum marshalling depth exceeded');
|
|
@@ -176,7 +191,9 @@ var ISOLATE_MARSHAL_CODE = `
|
|
|
176
191
|
const type = typeof value;
|
|
177
192
|
if (type === 'string' || type === 'number' || type === 'boolean') return value;
|
|
178
193
|
if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };
|
|
179
|
-
if (type === 'function')
|
|
194
|
+
if (type === 'function') {
|
|
195
|
+
return { __type: 'CallbackRef', callbackId: __customFn_registerCallback(value) };
|
|
196
|
+
}
|
|
180
197
|
if (type === 'symbol') throw new Error('Cannot marshal Symbol values');
|
|
181
198
|
|
|
182
199
|
if (type === 'object') {
|
|
@@ -228,6 +245,35 @@ var ISOLATE_MARSHAL_CODE = `
|
|
|
228
245
|
return value;
|
|
229
246
|
}
|
|
230
247
|
|
|
248
|
+
async function invokeLocalCallback(callbackId, argsJson) {
|
|
249
|
+
const callback = __customFn_callbacks.get(callbackId);
|
|
250
|
+
if (!callback) {
|
|
251
|
+
return JSON.stringify({
|
|
252
|
+
ok: false,
|
|
253
|
+
error: {
|
|
254
|
+
message: 'Callback ' + callbackId + ' not found',
|
|
255
|
+
name: 'Error',
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
const rawArgs = JSON.parse(argsJson);
|
|
262
|
+
const args = unmarshalFromHost(rawArgs);
|
|
263
|
+
const result = await callback(...args);
|
|
264
|
+
return JSON.stringify({ ok: true, value: marshalForHost(result) });
|
|
265
|
+
} catch (error) {
|
|
266
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
267
|
+
return JSON.stringify({
|
|
268
|
+
ok: false,
|
|
269
|
+
error: {
|
|
270
|
+
message: err.message,
|
|
271
|
+
name: err.name,
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
231
277
|
// Unmarshal a value (Ref → JavaScript)
|
|
232
278
|
function unmarshalFromHost(value, depth = 0) {
|
|
233
279
|
if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');
|
|
@@ -415,14 +461,16 @@ var ISOLATE_MARSHAL_CODE = `
|
|
|
415
461
|
// Expose as globals
|
|
416
462
|
globalThis.__marshalForHost = marshalForHost;
|
|
417
463
|
globalThis.__unmarshalFromHost = unmarshalFromHost;
|
|
464
|
+
globalThis.__customFn_invokeLocalCallback = invokeLocalCallback;
|
|
418
465
|
})();
|
|
419
466
|
`;
|
|
420
467
|
async function setupCustomFunctions(context, customFunctions, marshalOptions) {
|
|
421
468
|
const global = context.global;
|
|
469
|
+
const isolateUnmarshalContext = {};
|
|
422
470
|
const invokeCallbackRef = new ivm.Reference(async (nameOrId, argsJson) => {
|
|
423
471
|
if (typeof nameOrId === "number" && marshalOptions) {
|
|
424
472
|
const rawArgs2 = JSON.parse(argsJson);
|
|
425
|
-
const args2 = unmarshalValue(rawArgs2);
|
|
473
|
+
const args2 = unmarshalValue(rawArgs2, isolateUnmarshalContext);
|
|
426
474
|
try {
|
|
427
475
|
const result = await marshalOptions.invokeCallback(nameOrId, args2);
|
|
428
476
|
const ctx = marshalOptions.createMarshalContext();
|
|
@@ -449,7 +497,7 @@ async function setupCustomFunctions(context, customFunctions, marshalOptions) {
|
|
|
449
497
|
});
|
|
450
498
|
}
|
|
451
499
|
const rawArgs = JSON.parse(argsJson);
|
|
452
|
-
const args = unmarshalValue(rawArgs);
|
|
500
|
+
const args = unmarshalValue(rawArgs, isolateUnmarshalContext);
|
|
453
501
|
try {
|
|
454
502
|
const result = await def.fn(...args);
|
|
455
503
|
if (marshalOptions) {
|
|
@@ -470,6 +518,27 @@ async function setupCustomFunctions(context, customFunctions, marshalOptions) {
|
|
|
470
518
|
});
|
|
471
519
|
global.setSync("__customFn_invoke", invokeCallbackRef);
|
|
472
520
|
context.evalSync(ISOLATE_MARSHAL_CODE);
|
|
521
|
+
const invokeIsolateCallbackRef = context.global.getSync("__customFn_invokeLocalCallback", { reference: true });
|
|
522
|
+
isolateUnmarshalContext.getCallback = (callbackId) => {
|
|
523
|
+
return async (...args) => {
|
|
524
|
+
let marshalledArgs;
|
|
525
|
+
if (marshalOptions) {
|
|
526
|
+
const ctx = marshalOptions.createMarshalContext();
|
|
527
|
+
marshalledArgs = await marshalValue(args, ctx);
|
|
528
|
+
marshalledArgs = marshalOptions.addCallbackIdsToRefs(marshalledArgs);
|
|
529
|
+
} else {
|
|
530
|
+
marshalledArgs = await marshalValue(args);
|
|
531
|
+
}
|
|
532
|
+
const resultJson = await invokeIsolateCallbackRef.apply(undefined, [callbackId, JSON.stringify(marshalledArgs)], { result: { promise: true, copy: true } });
|
|
533
|
+
const result = JSON.parse(resultJson);
|
|
534
|
+
if (result.ok) {
|
|
535
|
+
return unmarshalValue(result.value, isolateUnmarshalContext);
|
|
536
|
+
}
|
|
537
|
+
const error = new Error(result.error?.message ?? `Callback ${callbackId} failed`);
|
|
538
|
+
error.name = result.error?.name ?? "Error";
|
|
539
|
+
throw error;
|
|
540
|
+
};
|
|
541
|
+
};
|
|
473
542
|
for (const name of Object.keys(customFunctions)) {
|
|
474
543
|
const def = customFunctions[name];
|
|
475
544
|
if (def.type === "async") {
|
|
@@ -796,7 +865,9 @@ async function createRuntime(options) {
|
|
|
796
865
|
const isolate = new ivm.Isolate({
|
|
797
866
|
memoryLimit: opts.memoryLimitMB
|
|
798
867
|
});
|
|
799
|
-
const context = await isolate.createContext(
|
|
868
|
+
const context = await isolate.createContext({
|
|
869
|
+
asyncContext: true
|
|
870
|
+
});
|
|
800
871
|
const state = {
|
|
801
872
|
id,
|
|
802
873
|
isolate,
|
|
@@ -817,6 +888,7 @@ async function createRuntime(options) {
|
|
|
817
888
|
moduleLoader: opts.moduleLoader,
|
|
818
889
|
customFunctions: opts.customFunctions
|
|
819
890
|
};
|
|
891
|
+
await setupAsyncContext(context);
|
|
820
892
|
state.handles.core = await setupCore(context);
|
|
821
893
|
state.handles.console = await setupConsole(context, opts.console);
|
|
822
894
|
state.handles.encoding = await setupEncoding(context);
|
|
@@ -1195,4 +1267,4 @@ export {
|
|
|
1195
1267
|
createNodeFileSystemHandler
|
|
1196
1268
|
};
|
|
1197
1269
|
|
|
1198
|
-
//# debugId=
|
|
1270
|
+
//# debugId=77608E9A39FCAD7464756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/runtime/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import ivm from \"isolated-vm\";\nimport path from \"node:path\";\nimport { setupCore } from \"../core/index.mjs\";\nimport { normalizeEntryFilename } from \"../protocol/index.mjs\";\nimport {\n transformEntryCode,\n transformModuleCode,\n contentHash,\n mapErrorStack,\n type SourceMap,\n type TransformResult,\n} from \"../transform/index.mjs\";\n\n// Re-export for convenience\nexport { normalizeEntryFilename } from \"../protocol/index.mjs\";\nimport { setupConsole } from \"../console/index.mjs\";\nimport { setupEncoding } from \"../encoding/index.mjs\";\nimport { setupTimers } from \"../timers/index.mjs\";\nimport { setupPath } from \"../path/index.mjs\";\nimport { setupCrypto } from \"../crypto/index.mjs\";\nimport { setupFetch } from \"../fetch/index.mjs\";\nimport { setupFs } from \"../fs/index.mjs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"../test-environment/index.mjs\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type PlaywrightSetupOptions,\n} from \"../playwright/index.mjs\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"../console/index.mjs\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n ClientWebSocketCommand,\n} from \"../fetch/index.mjs\";\nimport type { FsOptions, FsHandle } from \"../fs/index.mjs\";\nimport type { CoreHandle } from \"../core/index.mjs\";\nimport type { EncodingHandle } from \"../encoding/index.mjs\";\nimport type { TimersHandle } from \"../timers/index.mjs\";\nimport type { PathHandle } from \"../path/index.mjs\";\nimport type { CryptoHandle } from \"../crypto/index.mjs\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"../test-environment/index.mjs\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n PlaywrightEvent,\n} from \"../playwright/index.mjs\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n FetchRequestInit,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n EvalOptions as ProtocolEvalOptions,\n PlaywrightOptions as ProtocolPlaywrightOptions,\n BaseRuntimeOptions,\n} from \"../protocol/index.mjs\";\nimport {\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n} from \"../protocol/index.mjs\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n FetchRequestInit,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"../protocol/index.mjs\";\n\n// Re-export shared protocol option types\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\n\n/**\n * Options for customizing how custom function return values are marshalled.\n * Used by the daemon to support returned callbacks/promises/iterators via IPC.\n */\nexport interface CustomFunctionsMarshalOptions {\n /** Factory to create a MarshalContext for registering returned callbacks/promises/iterators */\n createMarshalContext: () => MarshalContext;\n /** Post-processor to add callback IDs to PromiseRef/AsyncIteratorRef values */\n addCallbackIdsToRefs: (value: unknown) => unknown;\n /** Handler for numeric callback IDs from marshalled refs (CallbackRef, PromiseRef, AsyncIteratorRef) */\n invokeCallback: (callbackId: number, args: unknown[]) => Promise<unknown>;\n}\n\n/**\n * Options for creating a runtime.\n * Extends BaseRuntimeOptions and adds runtime-specific fs type.\n */\nexport interface RuntimeOptions<T extends Record<string, any[]> = Record<string, unknown[]>>\n extends BaseRuntimeOptions<T> {\n /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /**\n * Optional marshal options for custom functions.\n * When provided, enables MarshalContext-based marshalling for returned values.\n * Used by the daemon for IPC proxying of callbacks/promises/iterators.\n */\n customFunctionsMarshalOptions?: CustomFunctionsMarshalOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(\n connectionId: string,\n code: number,\n reason: string\n ): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n /** Dispatch open event to a client WebSocket in the isolate */\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string): void;\n /** Dispatch message event to a client WebSocket in the isolate */\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer): void;\n /** Dispatch close event to a client WebSocket in the isolate */\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean): void;\n /** Dispatch error event to a client WebSocket in the isolate */\n dispatchClientWebSocketError(socketId: string): void;\n /** Register callback for client WebSocket commands from isolate */\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void): () => void;\n /** Register callback for events emitted from isolate code */\n onEvent(callback: (event: string, payload: unknown) => void): () => void;\n /** Dispatch an event into the isolate (calls __on listeners) */\n dispatchEvent(event: string, payload: unknown): void;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n * Timers fire automatically based on real time.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n pageErrors: PageErrorInfo[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n requestFailures: RequestFailureInfo[];\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filenameOrOptions?: string | EvalOptions): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n /** Clear module cache and source maps (used for namespace pooling/reuse) */\n clearModuleCache(): void;\n\n /**\n * Array of pending callback promises. Push promises here to have them\n * awaited after each eval() call completes. Used by daemon for IPC flush.\n * For standalone use this array stays empty (callbacks are synchronous).\n */\n readonly pendingCallbacks: Promise<unknown>[];\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n id: string;\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n staticModuleCache: Map<string, ivm.Module>;\n moduleLoadsInFlight: Map<string, Promise<ivm.Module>>;\n transformCache: Map<string, TransformResult>;\n moduleToFilename: Map<ivm.Module, string>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n sourceMaps: Map<string, SourceMap>;\n /** Tracks the import chain for each module (resolved path → list of ancestor paths) */\n moduleImportChain: Map<string, string[]>;\n /** Tracks which file imported a given specifier (resolvedSpecifier → importerPath) */\n specifierToImporter: Map<string, string>;\n /** Pending callbacks to await after eval (for daemon IPC fire-and-forget pattern) */\n pendingCallbacks: Promise<unknown>[];\n /** Per-runtime eval queue to prevent overlapping module linking/evaluation */\n evalChain: Promise<void>;\n /** Optional timeout for full eval/test executions */\n executionTimeout?: number;\n /** True after dispose() starts */\n isDisposed: boolean;\n /** Cached dispose promise to make disposal idempotent */\n disposePromise?: Promise<void>;\n /** Human-readable reason recorded when disposal first started */\n disposeReason?: string;\n /** Timeout budget that permanently poisoned this runtime */\n timedOutExecutionMs?: number;\n}\n\nfunction getConfiguredExecutionTimeout(timeoutMs?: number): number | undefined {\n if (typeof timeoutMs !== \"number\" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return undefined;\n }\n return timeoutMs;\n}\n\nfunction createTimeoutError(label: string, timeoutMs: number): Error {\n const error = new Error(`${label} timed out after ${timeoutMs}ms`);\n error.name = \"TimeoutError\";\n return error;\n}\n\nfunction createDisposedRuntimeError(): Error {\n return new Error(\"Runtime has been disposed\");\n}\n\nfunction createTimedOutRuntimeError(timeoutMs: number): Error {\n const error = new Error(\n `Runtime execution timed out after ${timeoutMs}ms; create a new runtime.`\n );\n error.name = \"TimeoutError\";\n return error;\n}\n\nfunction assertRuntimeUsable(state: RuntimeState): void {\n if (state.timedOutExecutionMs !== undefined) {\n throw createTimedOutRuntimeError(state.timedOutExecutionMs);\n }\n if (state.isDisposed) {\n throw createDisposedRuntimeError();\n }\n}\n\ninterface DisposeRuntimeStateOptions {\n reason: string;\n log?: boolean;\n error?: unknown;\n}\n\nfunction logRuntimeDisposal(state: RuntimeState, options: DisposeRuntimeStateOptions): void {\n const message = `[isolate-runtime] Disposing runtime ${state.id}: ${options.reason}`;\n if (options.error) {\n console.error(message, options.error);\n return;\n }\n console.warn(message);\n}\n\nasync function disposeRuntimeState(\n state: RuntimeState,\n options: DisposeRuntimeStateOptions = { reason: \"RuntimeHandle.dispose() called\", log: false },\n): Promise<void> {\n if (state.disposePromise) {\n return state.disposePromise;\n }\n\n state.disposeReason = options.reason;\n state.isDisposed = true;\n if (options.log !== false) {\n logRuntimeDisposal(state, options);\n }\n state.disposePromise = (async () => {\n if (state.customFnInvokeRef) {\n try {\n state.customFnInvokeRef.release();\n } catch {\n // Ignore cleanup errors during disposal.\n } finally {\n state.customFnInvokeRef = undefined;\n }\n }\n\n const disposeHandle = (dispose: (() => void) | undefined): void => {\n if (!dispose) return;\n try {\n dispose();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n };\n\n disposeHandle(state.handles.playwright?.dispose.bind(state.handles.playwright));\n disposeHandle(state.handles.testEnvironment?.dispose.bind(state.handles.testEnvironment));\n disposeHandle(state.handles.fs?.dispose.bind(state.handles.fs));\n disposeHandle(state.handles.fetch?.dispose.bind(state.handles.fetch));\n disposeHandle(state.handles.crypto?.dispose.bind(state.handles.crypto));\n disposeHandle(state.handles.path?.dispose.bind(state.handles.path));\n disposeHandle(state.handles.timers?.dispose.bind(state.handles.timers));\n disposeHandle(state.handles.encoding?.dispose.bind(state.handles.encoding));\n disposeHandle(state.handles.console?.dispose.bind(state.handles.console));\n disposeHandle(state.handles.core?.dispose.bind(state.handles.core));\n\n state.pendingCallbacks.length = 0;\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n state.moduleToFilename.clear();\n state.moduleImportChain.clear();\n state.specifierToImporter.clear();\n state.sourceMaps.clear();\n\n try {\n state.context.release();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n\n try {\n state.isolate.dispose();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n })();\n\n return state.disposePromise;\n}\n\nasync function runWithExecutionTimeout<T>(\n state: RuntimeState,\n timeoutMs: number | undefined,\n label: string,\n operation: () => Promise<T>,\n): Promise<T> {\n const effectiveTimeoutMs = getConfiguredExecutionTimeout(timeoutMs);\n if (effectiveTimeoutMs === undefined) {\n return operation();\n }\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n const timeoutError = createTimeoutError(label, effectiveTimeoutMs);\n state.timedOutExecutionMs ??= effectiveTimeoutMs;\n void disposeRuntimeState(state, {\n reason: timeoutError.message,\n error: timeoutError,\n });\n reject(timeoutError);\n }, effectiveTimeoutMs);\n });\n\n try {\n return await Promise.race([operation(), timeoutPromise]);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') throw new Error('Cannot marshal functions from isolate');\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n const callbackId = value.callbackId;\n return async function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [callbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n }\n\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n }\n case 'PromiseRef': {\n const promiseId = value.promiseId;\n return (async () => {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [value.__resolveCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n }\n\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n })();\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n const throwCallbackId = value.__throwCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [nextCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [returnCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done ?? true,\n value: unmarshalFromHost(result.value.value ?? result.value),\n };\n },\n async throw(e) {\n if (throwCallbackId == null) {\n throw e;\n }\n const errorValue = e && typeof e === 'object'\n ? { message: e.message, name: e.name, stack: e.stack }\n : { message: String(e), name: 'Error' };\n const argsJson = JSON.stringify([iteratorId, errorValue]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [throwCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value),\n };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n // Expose as globals\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n})();\n`;\n\n// CustomFunctionsMarshalOptions is exported at the top of the file\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n *\n * When marshalOptions is provided, returned values are marshalled with a MarshalContext,\n * enabling proper proxying of callbacks/promises/iterators across boundaries.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions,\n marshalOptions?: CustomFunctionsMarshalOptions,\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result.\n // The first argument can be a string function name (for custom functions) or a\n // numeric callback ID (for returned callbacks/promises/iterators from marshal).\n const invokeCallbackRef = new ivm.Reference(\n async (nameOrId: string | number, argsJson: string): Promise<string> => {\n // Check if this is a local callback ID (numeric, used by returned callbacks/promises/iterators)\n if (typeof nameOrId === \"number\" && marshalOptions) {\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n const result = await marshalOptions.invokeCallback(nameOrId, args);\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n\n const name = String(nameOrId);\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n // Unmarshal args from isolate (converts Refs back to JavaScript types)\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n // Always await the result: for daemon-bridged functions, even \"sync\" custom functions\n // are async due to IPC, so we need to resolve the promise.\n const result = await def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n }\n const marshalledResult = await marshalValue(result);\n return JSON.stringify({ ok: true, value: marshalledResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n `);\n } else if (def.type === \"sync\") {\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySync(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const iteratorPromise = (async () => {\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n throw Object.assign(new Error(result.error.message), {\n name: result.error.name,\n });\n })();\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const iterator = await iteratorPromise;\n return iterator.next();\n },\n async return(v) {\n const iterator = await iteratorPromise;\n return iterator.return ? iterator.return(v) : { done: true, value: v };\n },\n async throw(e) {\n const iterator = await iteratorPromise;\n if (!iterator.throw) {\n throw e;\n }\n return iterator.throw(e);\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create local marshal options for standalone runtime custom functions.\n * Enables returned callbacks/promises/iterators without daemon IPC.\n */\nfunction createLocalCustomFunctionsMarshalOptions(): CustomFunctionsMarshalOptions {\n const returnedCallbacks = new Map<number, Function>();\n const returnedPromises = new Map<number, Promise<unknown>>();\n const returnedIterators = new Map<number, AsyncIterator<unknown>>();\n let nextLocalCallbackId = 1_000_000;\n\n const createMarshalContext = (): MarshalContext => ({\n registerCallback: (fn: Function): number => {\n const callbackId = nextLocalCallbackId++;\n returnedCallbacks.set(callbackId, fn);\n return callbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = nextLocalCallbackId++;\n returnedPromises.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = nextLocalCallbackId++;\n returnedIterators.set(iteratorId, iterator);\n return iteratorId;\n },\n });\n\n const isPromiseRef = (\n value: unknown\n ): value is { __type: \"PromiseRef\"; promiseId: number } =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { __type?: string }).__type === \"PromiseRef\";\n\n const isAsyncIteratorRef = (\n value: unknown\n ): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { __type?: string }).__type === \"AsyncIteratorRef\";\n\n const addCallbackIdsToRefs = (value: unknown): unknown => {\n if (value === null || typeof value !== \"object\") return value;\n\n if (isPromiseRef(value)) {\n if (\"__resolveCallbackId\" in value) return value;\n\n const resolveCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(resolveCallbackId, async (promiseId: number) => {\n const promise = returnedPromises.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const result = await promise;\n returnedPromises.delete(promiseId);\n const ctx = createMarshalContext();\n const marshalled = await marshalValue(result, ctx);\n return addCallbackIdsToRefs(marshalled);\n });\n\n return { ...value, __resolveCallbackId: resolveCallbackId };\n }\n\n if (isAsyncIteratorRef(value)) {\n if (\"__nextCallbackId\" in value) return value;\n\n const nextCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(nextCallbackId, async (iteratorId: number) => {\n const iterator = returnedIterators.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const result = await iterator.next();\n if (result.done) {\n returnedIterators.delete(iteratorId);\n }\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n const returnCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(\n returnCallbackId,\n async (iteratorId: number, returnValue?: unknown) => {\n const iterator = returnedIterators.get(iteratorId);\n returnedIterators.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const result = await iterator.return(returnValue);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n }\n );\n\n const throwCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(\n throwCallbackId,\n async (\n iteratorId: number,\n errorValue?: { message?: string; name?: string; stack?: string },\n ) => {\n const iterator = returnedIterators.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n try {\n if (!iterator.throw) {\n throw Object.assign(\n new Error(errorValue?.message ?? \"Iterator does not support throw()\"),\n { name: errorValue?.name ?? \"Error\", stack: errorValue?.stack },\n );\n }\n const thrownError = Object.assign(\n new Error(errorValue?.message ?? \"Iterator throw()\"),\n { name: errorValue?.name ?? \"Error\", stack: errorValue?.stack },\n );\n const result = await iterator.throw(thrownError);\n if (result.done) {\n returnedIterators.delete(iteratorId);\n }\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n } catch (error) {\n returnedIterators.delete(iteratorId);\n throw error;\n }\n },\n );\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n __throwCallbackId: throwCallbackId,\n };\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => addCallbackIdsToRefs(item));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = addCallbackIdsToRefs(\n (value as Record<string, unknown>)[key]\n );\n }\n return result;\n };\n\n const invokeCallback = async (\n callbackId: number,\n args: unknown[]\n ): Promise<unknown> => {\n const callback = returnedCallbacks.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n return await callback(...args);\n };\n\n return { createMarshalContext, addCallbackIdsToRefs, invokeCallback };\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Get importer info\n const importerPath = state.moduleToFilename.get(referrer) ?? \"<unknown>\";\n const importerResolveDir = path.posix.dirname(importerPath);\n const importerStack = state.moduleImportChain.get(importerPath) ?? [];\n\n // Resolve relative specifiers to absolute-like paths for cache key uniqueness.\n // This prevents cross-package collisions (e.g. two different packages both importing \"./utils.js\").\n const resolvedSpecifier = specifier.startsWith('.')\n ? path.posix.normalize(path.posix.join(importerResolveDir, specifier))\n : specifier;\n\n // Track who imports this specifier (for error diagnostics)\n state.specifierToImporter.set(resolvedSpecifier, importerPath);\n\n // Static cache first\n const staticCached = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCached) return staticCached;\n\n const cached = state.moduleCache.get(resolvedSpecifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n }\n\n // Invoke module loader - capture full result including static flag\n const result = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\n const { code, resolveDir } = result;\n\n // Validate filename: must be a basename (no slashes)\n if (result.filename.includes('/')) {\n throw new Error(\n `moduleLoader returned a filename with slashes: \"${result.filename}\". ` +\n `filename must be a basename (e.g. \"utils.js\"), not a path.`\n );\n }\n\n // Construct resolved filename using result.filename\n const resolvedFilename = path.posix.join(resolveDir, result.filename);\n\n // Cache by specifier + content hash (allows invalidation when content changes)\n const hash = contentHash(code);\n const cacheKey = `${resolvedSpecifier}:${hash}`;\n const inFlightKey = `${result.static ? \"static\" : \"dynamic\"}:${cacheKey}`;\n\n // Cache checks again after await in case another resolver call won the race\n const staticCachedAfterLoad = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCachedAfterLoad) return staticCachedAfterLoad;\n\n const cachedAfterLoad = state.moduleCache.get(resolvedSpecifier);\n if (cachedAfterLoad) return cachedAfterLoad;\n\n const hashCached = state.moduleCache.get(cacheKey);\n if (hashCached) return hashCached;\n\n const inFlight = state.moduleLoadsInFlight.get(inFlightKey);\n if (inFlight) return inFlight;\n\n const loadPromise = (async (): Promise<ivm.Module> => {\n let mod: ivm.Module | undefined;\n try {\n // Transform cache — check transform cache first (survives reuse in daemon)\n let transformed: TransformResult | undefined = state.transformCache.get(hash);\n if (!transformed) {\n transformed = await transformModuleCode(code, resolvedSpecifier);\n state.transformCache.set(hash, transformed);\n }\n\n if (transformed.sourceMap) {\n state.sourceMaps.set(resolvedSpecifier, transformed.sourceMap);\n }\n\n // Compile the module using resolvedSpecifier as filename\n mod = await state.isolate.compileModule(transformed.code, {\n filename: resolvedSpecifier,\n });\n\n // Track resolved filename for nested imports\n state.moduleToFilename.set(mod, resolvedFilename);\n\n // Track import chain for error diagnostics\n state.moduleImportChain.set(resolvedFilename, [...importerStack, importerPath]);\n\n // Cache the compiled module before linker uses it (supports circular deps)\n if (result.static) {\n state.staticModuleCache.set(resolvedSpecifier, mod);\n } else {\n state.moduleCache.set(resolvedSpecifier, mod);\n state.moduleCache.set(cacheKey, mod);\n }\n\n return mod;\n } catch (err) {\n // Annotate error with module resolution context\n const error = err instanceof Error ? err : new Error(String(err));\n error.message = `Failed to compile module \"${resolvedSpecifier}\" (imported by \"${importerPath}\"):\\n${error.message}`;\n if (importerStack.length > 0) {\n error.message += `\\n\\nImport chain:\\n ${[...importerStack, importerPath].join('\\n -> ')}`;\n }\n\n // Remove partial cache state to avoid returning poisoned module entries later.\n if (mod) {\n state.moduleToFilename.delete(mod);\n if (result.static) {\n if (state.staticModuleCache.get(resolvedSpecifier) === mod) {\n state.staticModuleCache.delete(resolvedSpecifier);\n }\n } else {\n if (state.moduleCache.get(resolvedSpecifier) === mod) {\n state.moduleCache.delete(resolvedSpecifier);\n }\n if (state.moduleCache.get(cacheKey) === mod) {\n state.moduleCache.delete(cacheKey);\n }\n }\n }\n throw error;\n }\n })();\n\n state.moduleLoadsInFlight.set(inFlightKey, loadPromise);\n try {\n return await loadPromise;\n } finally {\n state.moduleLoadsInFlight.delete(inFlightKey);\n }\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (url: string, init: FetchRequestInit): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(url, init));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\n */\nexport async function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n options?: RuntimeOptions<T>\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n id,\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n staticModuleCache: new Map(),\n moduleLoadsInFlight: new Map(),\n transformCache: new Map(),\n moduleToFilename: new Map(),\n sourceMaps: new Map(),\n moduleImportChain: new Map(),\n specifierToImporter: new Map(),\n pendingCallbacks: [],\n evalChain: Promise.resolve(),\n executionTimeout: getConfiguredExecutionTimeout(opts.executionTimeout),\n isDisposed: false,\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob) and Buffer\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n const customMarshalOptions =\n opts.customFunctionsMarshalOptions ??\n createLocalCustomFunctionsMarshalOptions();\n\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n customMarshalOptions,\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright - AFTER test environment so expect can be extended\n if (opts.playwright) {\n if (!opts.playwright.handler) {\n throw new Error(\n \"Playwright configured without handler. Provide playwright.handler in createRuntime options.\"\n );\n }\n\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n stdout: event.stdout,\n location: event.location,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n const playwrightSetupOptions: PlaywrightSetupOptions = {\n handler: opts.playwright.handler,\n timeout: opts.playwright.timeout,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n };\n\n state.handles.playwright = await setupPlaywright(context, playwrightSetupOptions);\n }\n\n const ensureRuntimeUsable = (): void => {\n assertRuntimeUsable(state);\n };\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketOpen(socketId, protocol, extensions);\n },\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketMessage(socketId, data);\n },\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketClose(socketId, code, reason, wasClean);\n },\n dispatchClientWebSocketError(socketId: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketError(socketId);\n },\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onClientWebSocketCommand(callback);\n },\n onEvent(callback: (event: string, payload: unknown) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onEvent(callback);\n },\n dispatchEvent(event: string, payload: unknown) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchEvent(event, payload);\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n ensureRuntimeUsable();\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n ensureRuntimeUsable();\n state.handles.console?.reset();\n },\n getTimers() {\n ensureRuntimeUsable();\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n ensureRuntimeUsable();\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n ensureRuntimeUsable();\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(timeout?: number): Promise<RunResults> {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n\n const executionTimeout = timeout ?? state.executionTimeout;\n return runWithExecutionTimeout(\n state,\n executionTimeout,\n \"Test\",\n async () => {\n return runTestsInContext(state.context);\n },\n );\n },\n hasTests(): boolean {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n ensureRuntimeUsable();\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n ensureRuntimeUsable();\n if (!state.handles.playwright) {\n throw new Error(\n \"Playwright not configured. Provide playwright.handler in createRuntime options.\"\n );\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n pageErrors: state.handles.playwright.getPageErrors(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n requestFailures: state.handles.playwright.getRequestFailures(),\n };\n },\n clearCollectedData() {\n ensureRuntimeUsable();\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n pendingCallbacks: state.pendingCallbacks,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> {\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n const executionTimeout = options?.executionTimeout ?? state.executionTimeout;\n\n const runEval = async (): Promise<void> => {\n assertRuntimeUsable(state);\n\n // Normalize filename to absolute path for module resolution\n const filename = normalizeEntryFilename(options?.filename);\n\n try {\n await runWithExecutionTimeout(\n state,\n executionTimeout,\n \"Execution\",\n async () => {\n // Transform entry code: strip types, validate, wrap in async function\n const transformed = await transformEntryCode(code, filename);\n if (transformed.sourceMap) {\n state.sourceMaps.set(filename, transformed.sourceMap);\n }\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(transformed.code, {\n filename,\n });\n\n // Track entry module filename and import chain\n state.moduleToFilename.set(mod, filename);\n state.moduleImportChain.set(filename, []);\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n try {\n await mod.instantiate(state.context, resolver);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Extract failing module specifier and export name from V8 error\n // e.g. \"The requested module './foo' does not provide an export named 'Bar'\"\n const specifierMatch = error.message.match(/The requested module '([^']+)'/);\n const exportMatch = error.message.match(/export named '([^']+)'/);\n const failingSpecifier = specifierMatch?.[1];\n const failingExport = exportMatch?.[1];\n\n // Find which file imports the failing specifier\n const importerFile = failingSpecifier\n ? state.specifierToImporter.get(failingSpecifier)\n : undefined;\n\n // Build the full import chain from entry → importer → failing module\n const details: string[] = [];\n\n if (importerFile) {\n const chain = state.moduleImportChain.get(importerFile) ?? [];\n const fullChain = [...chain, importerFile];\n if (failingSpecifier) fullChain.push(failingSpecifier);\n const trimmed = fullChain.length > 12 ? fullChain.slice(-12) : fullChain;\n const prefix = fullChain.length > 12 ? \" ...\\n\" : \"\";\n details.push(`Import chain:\\n${prefix}${trimmed.map((p) => ` ${p}`).join(\"\\n -> \")}`);\n } else if (failingSpecifier) {\n // Fallback: search moduleImportChain for any path containing the specifier\n for (const [modPath, chain] of state.moduleImportChain) {\n if (modPath.includes(failingSpecifier) || modPath.endsWith(failingSpecifier)) {\n const fullChain = [...chain, modPath];\n const trimmed = fullChain.length > 12 ? fullChain.slice(-12) : fullChain;\n details.push(`Import chain:\\n${trimmed.map((p) => ` ${p}`).join(\"\\n -> \")}`);\n break;\n }\n }\n }\n\n if (failingExport && failingSpecifier) {\n details.push(\n `Hint: If '${failingExport}' is a TypeScript type/interface, use \\`import type\\` to prevent it from being resolved at runtime:\\n` +\n ` import type { ${failingExport} } from '${failingSpecifier}';`\n );\n }\n\n const suffix = details.length > 0 ? \"\\n\\n\" + details.join(\"\\n\\n\") : \"\";\n error.message = `Module instantiation failed: ${error.message}${suffix}`;\n throw error;\n }\n\n await mod.evaluate();\n\n const ns = mod.namespace;\n const runRef = await ns.get(\"default\", { reference: true });\n try {\n await runRef.apply(undefined, [], {\n result: { promise: true },\n });\n } finally {\n runRef.release();\n }\n\n if (state.pendingCallbacks.length > 0) {\n await Promise.all(state.pendingCallbacks);\n state.pendingCallbacks.length = 0;\n }\n },\n );\n } catch (err) {\n const error = err as Error;\n if (error.stack && state.sourceMaps.size > 0) {\n error.stack = mapErrorStack(error.stack, state.sourceMaps);\n }\n throw error;\n }\n };\n\n const queuedEval = state.evalChain.then(runEval, runEval);\n state.evalChain = queuedEval.then(\n () => undefined,\n () => undefined\n );\n return queuedEval;\n },\n\n clearModuleCache() {\n ensureRuntimeUsable();\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n state.moduleToFilename.clear();\n state.moduleImportChain.clear();\n state.specifierToImporter.clear();\n state.sourceMaps.clear();\n // staticModuleCache and transformCache intentionally preserved\n },\n\n async dispose(): Promise<void> {\n await disposeRuntimeState(state);\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"../core/index.mjs\";\nexport type { CoreHandle, SetupCoreOptions } from \"../core/index.mjs\";\n\nexport { setupConsole } from \"../console/index.mjs\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"../console/utils.mjs\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"../console/index.mjs\";\n\nexport { setupCrypto } from \"../crypto/index.mjs\";\nexport type { CryptoHandle } from \"../crypto/index.mjs\";\n\nexport { setupEncoding } from \"../encoding/index.mjs\";\nexport type { EncodingHandle } from \"../encoding/index.mjs\";\n\nexport { setupFetch } from \"../fetch/index.mjs\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n ClientWebSocketCommand,\n} from \"../fetch/index.mjs\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"../fs/index.mjs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"../fs/index.mjs\";\n\nexport { setupPath } from \"../path/index.mjs\";\nexport type { PathHandle, PathOptions } from \"../path/index.mjs\";\n\nexport { setupTimers } from \"../timers/index.mjs\";\nexport type { TimersHandle } from \"../timers/index.mjs\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"../test-environment/index.mjs\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"../test-environment/index.mjs\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"../playwright/index.mjs\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n} from \"../playwright/index.mjs\";\n"
|
|
5
|
+
"import ivm from \"@ricsam/isolated-vm\";\nimport path from \"node:path\";\nimport { setupCore } from \"../core/index.mjs\";\nimport { setupAsyncContext } from \"../async-context/index.mjs\";\nimport { normalizeEntryFilename } from \"../protocol/index.mjs\";\nimport {\n transformEntryCode,\n transformModuleCode,\n contentHash,\n mapErrorStack,\n type SourceMap,\n type TransformResult,\n} from \"../transform/index.mjs\";\n\n// Re-export for convenience\nexport { normalizeEntryFilename } from \"../protocol/index.mjs\";\nimport { setupConsole } from \"../console/index.mjs\";\nimport { setupEncoding } from \"../encoding/index.mjs\";\nimport { setupTimers } from \"../timers/index.mjs\";\nimport { setupPath } from \"../path/index.mjs\";\nimport { setupCrypto } from \"../crypto/index.mjs\";\nimport { setupFetch } from \"../fetch/index.mjs\";\nimport { setupFs } from \"../fs/index.mjs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"../test-environment/index.mjs\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type PlaywrightSetupOptions,\n} from \"../playwright/index.mjs\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"../console/index.mjs\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n ClientWebSocketCommand,\n} from \"../fetch/index.mjs\";\nimport type { FsOptions, FsHandle } from \"../fs/index.mjs\";\nimport type { CoreHandle } from \"../core/index.mjs\";\nimport type { EncodingHandle } from \"../encoding/index.mjs\";\nimport type { TimersHandle } from \"../timers/index.mjs\";\nimport type { PathHandle } from \"../path/index.mjs\";\nimport type { CryptoHandle } from \"../crypto/index.mjs\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"../test-environment/index.mjs\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n PlaywrightEvent,\n} from \"../playwright/index.mjs\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n FetchRequestInit,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n EvalOptions as ProtocolEvalOptions,\n PlaywrightOptions as ProtocolPlaywrightOptions,\n BaseRuntimeOptions,\n} from \"../protocol/index.mjs\";\nimport {\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n type UnmarshalContext,\n} from \"../protocol/index.mjs\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n FetchRequestInit,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"../protocol/index.mjs\";\n\n// Re-export shared protocol option types\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\n\n/**\n * Options for customizing how custom function return values are marshalled.\n * Used by the daemon to support returned callbacks/promises/iterators via IPC.\n */\nexport interface CustomFunctionsMarshalOptions {\n /** Factory to create a MarshalContext for registering returned callbacks/promises/iterators */\n createMarshalContext: () => MarshalContext;\n /** Post-processor to add callback IDs to PromiseRef/AsyncIteratorRef values */\n addCallbackIdsToRefs: (value: unknown) => unknown;\n /** Handler for numeric callback IDs from marshalled refs (CallbackRef, PromiseRef, AsyncIteratorRef) */\n invokeCallback: (callbackId: number, args: unknown[]) => Promise<unknown>;\n}\n\n/**\n * Options for creating a runtime.\n * Extends BaseRuntimeOptions and adds runtime-specific fs type.\n */\nexport interface RuntimeOptions<T extends Record<string, any[]> = Record<string, unknown[]>>\n extends BaseRuntimeOptions<T> {\n /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /**\n * Optional marshal options for custom functions.\n * When provided, enables MarshalContext-based marshalling for returned values.\n * Used by the daemon for IPC proxying of callbacks/promises/iterators.\n */\n customFunctionsMarshalOptions?: CustomFunctionsMarshalOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(\n connectionId: string,\n code: number,\n reason: string\n ): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n /** Dispatch open event to a client WebSocket in the isolate */\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string): void;\n /** Dispatch message event to a client WebSocket in the isolate */\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer): void;\n /** Dispatch close event to a client WebSocket in the isolate */\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean): void;\n /** Dispatch error event to a client WebSocket in the isolate */\n dispatchClientWebSocketError(socketId: string): void;\n /** Register callback for client WebSocket commands from isolate */\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void): () => void;\n /** Register callback for events emitted from isolate code */\n onEvent(callback: (event: string, payload: unknown) => void): () => void;\n /** Dispatch an event into the isolate (calls __on listeners) */\n dispatchEvent(event: string, payload: unknown): void;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n * Timers fire automatically based on real time.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n pageErrors: PageErrorInfo[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n requestFailures: RequestFailureInfo[];\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filenameOrOptions?: string | EvalOptions): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n /** Clear module cache and source maps (used for namespace pooling/reuse) */\n clearModuleCache(): void;\n\n /**\n * Array of pending callback promises. Push promises here to have them\n * awaited after each eval() call completes. Used by daemon for IPC flush.\n * For standalone use this array stays empty (callbacks are synchronous).\n */\n readonly pendingCallbacks: Promise<unknown>[];\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n id: string;\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n staticModuleCache: Map<string, ivm.Module>;\n moduleLoadsInFlight: Map<string, Promise<ivm.Module>>;\n transformCache: Map<string, TransformResult>;\n moduleToFilename: Map<ivm.Module, string>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n sourceMaps: Map<string, SourceMap>;\n /** Tracks the import chain for each module (resolved path → list of ancestor paths) */\n moduleImportChain: Map<string, string[]>;\n /** Tracks which file imported a given specifier (resolvedSpecifier → importerPath) */\n specifierToImporter: Map<string, string>;\n /** Pending callbacks to await after eval (for daemon IPC fire-and-forget pattern) */\n pendingCallbacks: Promise<unknown>[];\n /** Per-runtime eval queue to prevent overlapping module linking/evaluation */\n evalChain: Promise<void>;\n /** Optional timeout for full eval/test executions */\n executionTimeout?: number;\n /** True after dispose() starts */\n isDisposed: boolean;\n /** Cached dispose promise to make disposal idempotent */\n disposePromise?: Promise<void>;\n /** Human-readable reason recorded when disposal first started */\n disposeReason?: string;\n /** Timeout budget that permanently poisoned this runtime */\n timedOutExecutionMs?: number;\n}\n\nfunction getConfiguredExecutionTimeout(timeoutMs?: number): number | undefined {\n if (typeof timeoutMs !== \"number\" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return undefined;\n }\n return timeoutMs;\n}\n\nfunction createTimeoutError(label: string, timeoutMs: number): Error {\n const error = new Error(`${label} timed out after ${timeoutMs}ms`);\n error.name = \"TimeoutError\";\n return error;\n}\n\nfunction createDisposedRuntimeError(): Error {\n return new Error(\"Runtime has been disposed\");\n}\n\nfunction createTimedOutRuntimeError(timeoutMs: number): Error {\n const error = new Error(\n `Runtime execution timed out after ${timeoutMs}ms; create a new runtime.`\n );\n error.name = \"TimeoutError\";\n return error;\n}\n\nfunction assertRuntimeUsable(state: RuntimeState): void {\n if (state.timedOutExecutionMs !== undefined) {\n throw createTimedOutRuntimeError(state.timedOutExecutionMs);\n }\n if (state.isDisposed) {\n throw createDisposedRuntimeError();\n }\n}\n\ninterface DisposeRuntimeStateOptions {\n reason: string;\n log?: boolean;\n error?: unknown;\n}\n\nfunction logRuntimeDisposal(state: RuntimeState, options: DisposeRuntimeStateOptions): void {\n const message = `[isolate-runtime] Disposing runtime ${state.id}: ${options.reason}`;\n if (options.error) {\n console.error(message, options.error);\n return;\n }\n console.warn(message);\n}\n\nasync function disposeRuntimeState(\n state: RuntimeState,\n options: DisposeRuntimeStateOptions = { reason: \"RuntimeHandle.dispose() called\", log: false },\n): Promise<void> {\n if (state.disposePromise) {\n return state.disposePromise;\n }\n\n state.disposeReason = options.reason;\n state.isDisposed = true;\n if (options.log !== false) {\n logRuntimeDisposal(state, options);\n }\n state.disposePromise = (async () => {\n if (state.customFnInvokeRef) {\n try {\n state.customFnInvokeRef.release();\n } catch {\n // Ignore cleanup errors during disposal.\n } finally {\n state.customFnInvokeRef = undefined;\n }\n }\n\n const disposeHandle = (dispose: (() => void) | undefined): void => {\n if (!dispose) return;\n try {\n dispose();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n };\n\n disposeHandle(state.handles.playwright?.dispose.bind(state.handles.playwright));\n disposeHandle(state.handles.testEnvironment?.dispose.bind(state.handles.testEnvironment));\n disposeHandle(state.handles.fs?.dispose.bind(state.handles.fs));\n disposeHandle(state.handles.fetch?.dispose.bind(state.handles.fetch));\n disposeHandle(state.handles.crypto?.dispose.bind(state.handles.crypto));\n disposeHandle(state.handles.path?.dispose.bind(state.handles.path));\n disposeHandle(state.handles.timers?.dispose.bind(state.handles.timers));\n disposeHandle(state.handles.encoding?.dispose.bind(state.handles.encoding));\n disposeHandle(state.handles.console?.dispose.bind(state.handles.console));\n disposeHandle(state.handles.core?.dispose.bind(state.handles.core));\n\n state.pendingCallbacks.length = 0;\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n state.moduleToFilename.clear();\n state.moduleImportChain.clear();\n state.specifierToImporter.clear();\n state.sourceMaps.clear();\n\n try {\n state.context.release();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n\n try {\n state.isolate.dispose();\n } catch {\n // Ignore cleanup errors during disposal.\n }\n })();\n\n return state.disposePromise;\n}\n\nasync function runWithExecutionTimeout<T>(\n state: RuntimeState,\n timeoutMs: number | undefined,\n label: string,\n operation: () => Promise<T>,\n): Promise<T> {\n const effectiveTimeoutMs = getConfiguredExecutionTimeout(timeoutMs);\n if (effectiveTimeoutMs === undefined) {\n return operation();\n }\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n const timeoutError = createTimeoutError(label, effectiveTimeoutMs);\n state.timedOutExecutionMs ??= effectiveTimeoutMs;\n void disposeRuntimeState(state, {\n reason: timeoutError.message,\n error: timeoutError,\n });\n reject(timeoutError);\n }, effectiveTimeoutMs);\n });\n\n try {\n return await Promise.race([operation(), timeoutPromise]);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n const __wrapAsyncContextCallback = (callback) => (\n typeof callback === 'function' && globalThis.__isolateAsyncContextInternals?.wrapCallback\n ? globalThis.__isolateAsyncContextInternals.wrapCallback(callback)\n : callback\n );\n let __customFn_nextCallbackId = 1;\n const __customFn_callbacks = new Map();\n\n function __customFn_registerCallback(callback) {\n const callbackId = __customFn_nextCallbackId++;\n __customFn_callbacks.set(callbackId, __wrapAsyncContextCallback(callback));\n return callbackId;\n }\n\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') {\n return { __type: 'CallbackRef', callbackId: __customFn_registerCallback(value) };\n }\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n async function invokeLocalCallback(callbackId, argsJson) {\n const callback = __customFn_callbacks.get(callbackId);\n if (!callback) {\n return JSON.stringify({\n ok: false,\n error: {\n message: 'Callback ' + callbackId + ' not found',\n name: 'Error',\n },\n });\n }\n\n try {\n const rawArgs = JSON.parse(argsJson);\n const args = unmarshalFromHost(rawArgs);\n const result = await callback(...args);\n return JSON.stringify({ ok: true, value: marshalForHost(result) });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n return JSON.stringify({\n ok: false,\n error: {\n message: err.message,\n name: err.name,\n },\n });\n }\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n const callbackId = value.callbackId;\n return async function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [callbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n }\n\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n }\n case 'PromiseRef': {\n const promiseId = value.promiseId;\n return (async () => {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [value.__resolveCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n }\n\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n })();\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n const throwCallbackId = value.__throwCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [nextCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [returnCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done ?? true,\n value: unmarshalFromHost(result.value.value ?? result.value),\n };\n },\n async throw(e) {\n if (throwCallbackId == null) {\n throw e;\n }\n const errorValue = e && typeof e === 'object'\n ? { message: e.message, name: e.name, stack: e.stack }\n : { message: String(e), name: 'Error' };\n const argsJson = JSON.stringify([iteratorId, errorValue]);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [throwCallbackId, argsJson],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value),\n };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n // Expose as globals\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n globalThis.__customFn_invokeLocalCallback = invokeLocalCallback;\n})();\n`;\n\n// CustomFunctionsMarshalOptions is exported at the top of the file\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n *\n * When marshalOptions is provided, returned values are marshalled with a MarshalContext,\n * enabling proper proxying of callbacks/promises/iterators across boundaries.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions,\n marshalOptions?: CustomFunctionsMarshalOptions,\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n const isolateUnmarshalContext: UnmarshalContext = {};\n\n // Reference that invokes the callback and returns the result.\n // The first argument can be a string function name (for custom functions) or a\n // numeric callback ID (for returned callbacks/promises/iterators from marshal).\n const invokeCallbackRef = new ivm.Reference(\n async (nameOrId: string | number, argsJson: string): Promise<string> => {\n // Check if this is a local callback ID (numeric, used by returned callbacks/promises/iterators)\n if (typeof nameOrId === \"number\" && marshalOptions) {\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs, isolateUnmarshalContext) as unknown[];\n try {\n const result = await marshalOptions.invokeCallback(nameOrId, args);\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n\n const name = String(nameOrId);\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n // Unmarshal args from isolate (converts Refs back to JavaScript types)\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs, isolateUnmarshalContext) as unknown[];\n try {\n // Always await the result: for daemon-bridged functions, even \"sync\" custom functions\n // are async due to IPC, so we need to resolve the promise.\n const result = await def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n }\n const marshalledResult = await marshalValue(result);\n return JSON.stringify({ ok: true, value: marshalledResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n const invokeIsolateCallbackRef = context.global.getSync(\n \"__customFn_invokeLocalCallback\",\n { reference: true },\n ) as ivm.Reference<(callbackId: number, argsJson: string) => Promise<string>>;\n\n isolateUnmarshalContext.getCallback = (callbackId: number) => {\n return async (...args: unknown[]) => {\n let marshalledArgs: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledArgs = await marshalValue(args, ctx);\n marshalledArgs = marshalOptions.addCallbackIdsToRefs(marshalledArgs);\n } else {\n marshalledArgs = await marshalValue(args);\n }\n\n const resultJson = await invokeIsolateCallbackRef.apply(\n undefined,\n [callbackId, JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } },\n ) as string;\n const result = JSON.parse(resultJson) as {\n ok: boolean;\n value?: unknown;\n error?: { message?: string; name?: string };\n };\n\n if (result.ok) {\n return unmarshalValue(result.value, isolateUnmarshalContext);\n }\n\n const error = new Error(result.error?.message ?? `Callback ${callbackId} failed`);\n error.name = result.error?.name ?? \"Error\";\n throw error;\n };\n };\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n `);\n } else if (def.type === \"sync\") {\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySync(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const iteratorPromise = (async () => {\n const resultJson = await __customFn_invoke.apply(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)],\n { result: { promise: true, copy: true } }\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n }\n throw Object.assign(new Error(result.error.message), {\n name: result.error.name,\n });\n })();\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const iterator = await iteratorPromise;\n return iterator.next();\n },\n async return(v) {\n const iterator = await iteratorPromise;\n return iterator.return ? iterator.return(v) : { done: true, value: v };\n },\n async throw(e) {\n const iterator = await iteratorPromise;\n if (!iterator.throw) {\n throw e;\n }\n return iterator.throw(e);\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create local marshal options for standalone runtime custom functions.\n * Enables returned callbacks/promises/iterators without daemon IPC.\n */\nfunction createLocalCustomFunctionsMarshalOptions(): CustomFunctionsMarshalOptions {\n const returnedCallbacks = new Map<number, Function>();\n const returnedPromises = new Map<number, Promise<unknown>>();\n const returnedIterators = new Map<number, AsyncIterator<unknown>>();\n let nextLocalCallbackId = 1_000_000;\n\n const createMarshalContext = (): MarshalContext => ({\n registerCallback: (fn: Function): number => {\n const callbackId = nextLocalCallbackId++;\n returnedCallbacks.set(callbackId, fn);\n return callbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = nextLocalCallbackId++;\n returnedPromises.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = nextLocalCallbackId++;\n returnedIterators.set(iteratorId, iterator);\n return iteratorId;\n },\n });\n\n const isPromiseRef = (\n value: unknown\n ): value is { __type: \"PromiseRef\"; promiseId: number } =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { __type?: string }).__type === \"PromiseRef\";\n\n const isAsyncIteratorRef = (\n value: unknown\n ): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { __type?: string }).__type === \"AsyncIteratorRef\";\n\n const addCallbackIdsToRefs = (value: unknown): unknown => {\n if (value === null || typeof value !== \"object\") return value;\n\n if (isPromiseRef(value)) {\n if (\"__resolveCallbackId\" in value) return value;\n\n const resolveCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(resolveCallbackId, async (promiseId: number) => {\n const promise = returnedPromises.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const result = await promise;\n returnedPromises.delete(promiseId);\n const ctx = createMarshalContext();\n const marshalled = await marshalValue(result, ctx);\n return addCallbackIdsToRefs(marshalled);\n });\n\n return { ...value, __resolveCallbackId: resolveCallbackId };\n }\n\n if (isAsyncIteratorRef(value)) {\n if (\"__nextCallbackId\" in value) return value;\n\n const nextCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(nextCallbackId, async (iteratorId: number) => {\n const iterator = returnedIterators.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const result = await iterator.next();\n if (result.done) {\n returnedIterators.delete(iteratorId);\n }\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n const returnCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(\n returnCallbackId,\n async (iteratorId: number, returnValue?: unknown) => {\n const iterator = returnedIterators.get(iteratorId);\n returnedIterators.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const result = await iterator.return(returnValue);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n }\n );\n\n const throwCallbackId = nextLocalCallbackId++;\n returnedCallbacks.set(\n throwCallbackId,\n async (\n iteratorId: number,\n errorValue?: { message?: string; name?: string; stack?: string },\n ) => {\n const iterator = returnedIterators.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n try {\n if (!iterator.throw) {\n throw Object.assign(\n new Error(errorValue?.message ?? \"Iterator does not support throw()\"),\n { name: errorValue?.name ?? \"Error\", stack: errorValue?.stack },\n );\n }\n const thrownError = Object.assign(\n new Error(errorValue?.message ?? \"Iterator throw()\"),\n { name: errorValue?.name ?? \"Error\", stack: errorValue?.stack },\n );\n const result = await iterator.throw(thrownError);\n if (result.done) {\n returnedIterators.delete(iteratorId);\n }\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n } catch (error) {\n returnedIterators.delete(iteratorId);\n throw error;\n }\n },\n );\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n __throwCallbackId: throwCallbackId,\n };\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => addCallbackIdsToRefs(item));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = addCallbackIdsToRefs(\n (value as Record<string, unknown>)[key]\n );\n }\n return result;\n };\n\n const invokeCallback = async (\n callbackId: number,\n args: unknown[]\n ): Promise<unknown> => {\n const callback = returnedCallbacks.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n return await callback(...args);\n };\n\n return { createMarshalContext, addCallbackIdsToRefs, invokeCallback };\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Get importer info\n const importerPath = state.moduleToFilename.get(referrer) ?? \"<unknown>\";\n const importerResolveDir = path.posix.dirname(importerPath);\n const importerStack = state.moduleImportChain.get(importerPath) ?? [];\n\n // Resolve relative specifiers to absolute-like paths for cache key uniqueness.\n // This prevents cross-package collisions (e.g. two different packages both importing \"./utils.js\").\n const resolvedSpecifier = specifier.startsWith('.')\n ? path.posix.normalize(path.posix.join(importerResolveDir, specifier))\n : specifier;\n\n // Track who imports this specifier (for error diagnostics)\n state.specifierToImporter.set(resolvedSpecifier, importerPath);\n\n // Static cache first\n const staticCached = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCached) return staticCached;\n\n const cached = state.moduleCache.get(resolvedSpecifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n }\n\n // Invoke module loader - capture full result including static flag\n const result = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\n const { code, resolveDir } = result;\n\n // Validate filename: must be a basename (no slashes)\n if (result.filename.includes('/')) {\n throw new Error(\n `moduleLoader returned a filename with slashes: \"${result.filename}\". ` +\n `filename must be a basename (e.g. \"utils.js\"), not a path.`\n );\n }\n\n // Construct resolved filename using result.filename\n const resolvedFilename = path.posix.join(resolveDir, result.filename);\n\n // Cache by specifier + content hash (allows invalidation when content changes)\n const hash = contentHash(code);\n const cacheKey = `${resolvedSpecifier}:${hash}`;\n const inFlightKey = `${result.static ? \"static\" : \"dynamic\"}:${cacheKey}`;\n\n // Cache checks again after await in case another resolver call won the race\n const staticCachedAfterLoad = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCachedAfterLoad) return staticCachedAfterLoad;\n\n const cachedAfterLoad = state.moduleCache.get(resolvedSpecifier);\n if (cachedAfterLoad) return cachedAfterLoad;\n\n const hashCached = state.moduleCache.get(cacheKey);\n if (hashCached) return hashCached;\n\n const inFlight = state.moduleLoadsInFlight.get(inFlightKey);\n if (inFlight) return inFlight;\n\n const loadPromise = (async (): Promise<ivm.Module> => {\n let mod: ivm.Module | undefined;\n try {\n // Transform cache — check transform cache first (survives reuse in daemon)\n let transformed: TransformResult | undefined = state.transformCache.get(hash);\n if (!transformed) {\n transformed = await transformModuleCode(code, resolvedSpecifier);\n state.transformCache.set(hash, transformed);\n }\n\n if (transformed.sourceMap) {\n state.sourceMaps.set(resolvedSpecifier, transformed.sourceMap);\n }\n\n // Compile the module using resolvedSpecifier as filename\n mod = await state.isolate.compileModule(transformed.code, {\n filename: resolvedSpecifier,\n });\n\n // Track resolved filename for nested imports\n state.moduleToFilename.set(mod, resolvedFilename);\n\n // Track import chain for error diagnostics\n state.moduleImportChain.set(resolvedFilename, [...importerStack, importerPath]);\n\n // Cache the compiled module before linker uses it (supports circular deps)\n if (result.static) {\n state.staticModuleCache.set(resolvedSpecifier, mod);\n } else {\n state.moduleCache.set(resolvedSpecifier, mod);\n state.moduleCache.set(cacheKey, mod);\n }\n\n return mod;\n } catch (err) {\n // Annotate error with module resolution context\n const error = err instanceof Error ? err : new Error(String(err));\n error.message = `Failed to compile module \"${resolvedSpecifier}\" (imported by \"${importerPath}\"):\\n${error.message}`;\n if (importerStack.length > 0) {\n error.message += `\\n\\nImport chain:\\n ${[...importerStack, importerPath].join('\\n -> ')}`;\n }\n\n // Remove partial cache state to avoid returning poisoned module entries later.\n if (mod) {\n state.moduleToFilename.delete(mod);\n if (result.static) {\n if (state.staticModuleCache.get(resolvedSpecifier) === mod) {\n state.staticModuleCache.delete(resolvedSpecifier);\n }\n } else {\n if (state.moduleCache.get(resolvedSpecifier) === mod) {\n state.moduleCache.delete(resolvedSpecifier);\n }\n if (state.moduleCache.get(cacheKey) === mod) {\n state.moduleCache.delete(cacheKey);\n }\n }\n }\n throw error;\n }\n })();\n\n state.moduleLoadsInFlight.set(inFlightKey, loadPromise);\n try {\n return await loadPromise;\n } finally {\n state.moduleLoadsInFlight.delete(inFlightKey);\n }\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (url: string, init: FetchRequestInit): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(url, init));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\n */\nexport async function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n options?: RuntimeOptions<T>\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext({\n asyncContext: true,\n } as any);\n\n // Initialize state\n const state: RuntimeState = {\n id,\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n staticModuleCache: new Map(),\n moduleLoadsInFlight: new Map(),\n transformCache: new Map(),\n moduleToFilename: new Map(),\n sourceMaps: new Map(),\n moduleImportChain: new Map(),\n specifierToImporter: new Map(),\n pendingCallbacks: [],\n evalChain: Promise.resolve(),\n executionTimeout: getConfiguredExecutionTimeout(opts.executionTimeout),\n isDisposed: false,\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n };\n\n // Setup all APIs in order\n await setupAsyncContext(context);\n\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob) and Buffer\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n const customMarshalOptions =\n opts.customFunctionsMarshalOptions ??\n createLocalCustomFunctionsMarshalOptions();\n\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n customMarshalOptions,\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright - AFTER test environment so expect can be extended\n if (opts.playwright) {\n if (!opts.playwright.handler) {\n throw new Error(\n \"Playwright configured without handler. Provide playwright.handler in createRuntime options.\"\n );\n }\n\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n stdout: event.stdout,\n location: event.location,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n const playwrightSetupOptions: PlaywrightSetupOptions = {\n handler: opts.playwright.handler,\n timeout: opts.playwright.timeout,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n };\n\n state.handles.playwright = await setupPlaywright(context, playwrightSetupOptions);\n }\n\n const ensureRuntimeUsable = (): void => {\n assertRuntimeUsable(state);\n };\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketOpen(socketId, protocol, extensions);\n },\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketMessage(socketId, data);\n },\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketClose(socketId, code, reason, wasClean);\n },\n dispatchClientWebSocketError(socketId: string) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchClientWebSocketError(socketId);\n },\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onClientWebSocketCommand(callback);\n },\n onEvent(callback: (event: string, payload: unknown) => void) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onEvent(callback);\n },\n dispatchEvent(event: string, payload: unknown) {\n ensureRuntimeUsable();\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchEvent(event, payload);\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n ensureRuntimeUsable();\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n ensureRuntimeUsable();\n state.handles.console?.reset();\n },\n getTimers() {\n ensureRuntimeUsable();\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n ensureRuntimeUsable();\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n ensureRuntimeUsable();\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(timeout?: number): Promise<RunResults> {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n\n const executionTimeout = timeout ?? state.executionTimeout;\n return runWithExecutionTimeout(\n state,\n executionTimeout,\n \"Test\",\n async () => {\n return runTestsInContext(state.context);\n },\n );\n },\n hasTests(): boolean {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n ensureRuntimeUsable();\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n ensureRuntimeUsable();\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n ensureRuntimeUsable();\n if (!state.handles.playwright) {\n throw new Error(\n \"Playwright not configured. Provide playwright.handler in createRuntime options.\"\n );\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n pageErrors: state.handles.playwright.getPageErrors(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n requestFailures: state.handles.playwright.getRequestFailures(),\n };\n },\n clearCollectedData() {\n ensureRuntimeUsable();\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n pendingCallbacks: state.pendingCallbacks,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> {\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n const executionTimeout = options?.executionTimeout ?? state.executionTimeout;\n\n const runEval = async (): Promise<void> => {\n assertRuntimeUsable(state);\n\n // Normalize filename to absolute path for module resolution\n const filename = normalizeEntryFilename(options?.filename);\n\n try {\n await runWithExecutionTimeout(\n state,\n executionTimeout,\n \"Execution\",\n async () => {\n // Transform entry code: strip types, validate, wrap in async function\n const transformed = await transformEntryCode(code, filename);\n if (transformed.sourceMap) {\n state.sourceMaps.set(filename, transformed.sourceMap);\n }\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(transformed.code, {\n filename,\n });\n\n // Track entry module filename and import chain\n state.moduleToFilename.set(mod, filename);\n state.moduleImportChain.set(filename, []);\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n try {\n await mod.instantiate(state.context, resolver);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Extract failing module specifier and export name from V8 error\n // e.g. \"The requested module './foo' does not provide an export named 'Bar'\"\n const specifierMatch = error.message.match(/The requested module '([^']+)'/);\n const exportMatch = error.message.match(/export named '([^']+)'/);\n const failingSpecifier = specifierMatch?.[1];\n const failingExport = exportMatch?.[1];\n\n // Find which file imports the failing specifier\n const importerFile = failingSpecifier\n ? state.specifierToImporter.get(failingSpecifier)\n : undefined;\n\n // Build the full import chain from entry → importer → failing module\n const details: string[] = [];\n\n if (importerFile) {\n const chain = state.moduleImportChain.get(importerFile) ?? [];\n const fullChain = [...chain, importerFile];\n if (failingSpecifier) fullChain.push(failingSpecifier);\n const trimmed = fullChain.length > 12 ? fullChain.slice(-12) : fullChain;\n const prefix = fullChain.length > 12 ? \" ...\\n\" : \"\";\n details.push(`Import chain:\\n${prefix}${trimmed.map((p) => ` ${p}`).join(\"\\n -> \")}`);\n } else if (failingSpecifier) {\n // Fallback: search moduleImportChain for any path containing the specifier\n for (const [modPath, chain] of state.moduleImportChain) {\n if (modPath.includes(failingSpecifier) || modPath.endsWith(failingSpecifier)) {\n const fullChain = [...chain, modPath];\n const trimmed = fullChain.length > 12 ? fullChain.slice(-12) : fullChain;\n details.push(`Import chain:\\n${trimmed.map((p) => ` ${p}`).join(\"\\n -> \")}`);\n break;\n }\n }\n }\n\n if (failingExport && failingSpecifier) {\n details.push(\n `Hint: If '${failingExport}' is a TypeScript type/interface, use \\`import type\\` to prevent it from being resolved at runtime:\\n` +\n ` import type { ${failingExport} } from '${failingSpecifier}';`\n );\n }\n\n const suffix = details.length > 0 ? \"\\n\\n\" + details.join(\"\\n\\n\") : \"\";\n error.message = `Module instantiation failed: ${error.message}${suffix}`;\n throw error;\n }\n\n await mod.evaluate();\n\n const ns = mod.namespace;\n const runRef = await ns.get(\"default\", { reference: true });\n try {\n await runRef.apply(undefined, [], {\n result: { promise: true },\n });\n } finally {\n runRef.release();\n }\n\n if (state.pendingCallbacks.length > 0) {\n await Promise.all(state.pendingCallbacks);\n state.pendingCallbacks.length = 0;\n }\n },\n );\n } catch (err) {\n const error = err as Error;\n if (error.stack && state.sourceMaps.size > 0) {\n error.stack = mapErrorStack(error.stack, state.sourceMaps);\n }\n throw error;\n }\n };\n\n const queuedEval = state.evalChain.then(runEval, runEval);\n state.evalChain = queuedEval.then(\n () => undefined,\n () => undefined\n );\n return queuedEval;\n },\n\n clearModuleCache() {\n ensureRuntimeUsable();\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n state.moduleToFilename.clear();\n state.moduleImportChain.clear();\n state.specifierToImporter.clear();\n state.sourceMaps.clear();\n // staticModuleCache and transformCache intentionally preserved\n },\n\n async dispose(): Promise<void> {\n await disposeRuntimeState(state);\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"../core/index.mjs\";\nexport type { CoreHandle, SetupCoreOptions } from \"../core/index.mjs\";\n\nexport { setupConsole } from \"../console/index.mjs\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"../console/utils.mjs\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"../console/index.mjs\";\n\nexport { setupCrypto } from \"../crypto/index.mjs\";\nexport type { CryptoHandle } from \"../crypto/index.mjs\";\n\nexport { setupEncoding } from \"../encoding/index.mjs\";\nexport type { EncodingHandle } from \"../encoding/index.mjs\";\n\nexport { setupFetch } from \"../fetch/index.mjs\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n ClientWebSocketCommand,\n} from \"../fetch/index.mjs\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"../fs/index.mjs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"../fs/index.mjs\";\n\nexport { setupPath } from \"../path/index.mjs\";\nexport type { PathHandle, PathOptions } from \"../path/index.mjs\";\n\nexport { setupTimers } from \"../timers/index.mjs\";\nexport type { TimersHandle } from \"../timers/index.mjs\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"../test-environment/index.mjs\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"../test-environment/index.mjs\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"../playwright/index.mjs\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n} from \"../playwright/index.mjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "77608E9A39FCAD7464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/internal/test-environment/index.ts
|
|
2
|
-
import IsolatedVM from "isolated-vm";
|
|
2
|
+
import IsolatedVM from "@ricsam/isolated-vm";
|
|
3
3
|
var testEnvironmentCode = `
|
|
4
4
|
(function() {
|
|
5
5
|
// ============================================================
|
|
@@ -1348,4 +1348,4 @@ export {
|
|
|
1348
1348
|
getTestCount
|
|
1349
1349
|
};
|
|
1350
1350
|
|
|
1351
|
-
//# debugId=
|
|
1351
|
+
//# debugId=5AE2A012F8078D4E64756E2164756E21
|