@ricsam/isolate 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/bridge/legacy-adapters.cjs +3 -2
- package/dist/cjs/bridge/legacy-adapters.cjs.map +3 -3
- package/dist/cjs/bridge/runtime-bindings.cjs +8 -7
- package/dist/cjs/bridge/runtime-bindings.cjs.map +3 -3
- package/dist/cjs/internal/client/connection.cjs +16 -14
- package/dist/cjs/internal/client/connection.cjs.map +3 -3
- package/dist/cjs/internal/console/index.cjs +18 -14
- package/dist/cjs/internal/console/index.cjs.map +3 -3
- package/dist/cjs/internal/daemon/connection.cjs +11 -12
- package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
- package/dist/cjs/internal/event-callback.cjs +70 -0
- package/dist/cjs/internal/event-callback.cjs.map +10 -0
- package/dist/cjs/internal/playwright/handler.cjs +3 -4
- package/dist/cjs/internal/playwright/handler.cjs.map +3 -3
- package/dist/cjs/internal/playwright/index.cjs +58 -64
- package/dist/cjs/internal/playwright/index.cjs.map +3 -3
- package/dist/cjs/internal/protocol/types.cjs.map +2 -2
- package/dist/cjs/internal/runtime/index.cjs +4 -12
- package/dist/cjs/internal/runtime/index.cjs.map +3 -3
- package/dist/cjs/internal/test-environment/index.cjs +3 -2
- package/dist/cjs/internal/test-environment/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/playwright.cjs.map +2 -2
- package/dist/cjs/runtime/test-event-subscriptions.cjs +3 -6
- package/dist/cjs/runtime/test-event-subscriptions.cjs.map +3 -3
- package/dist/mjs/bridge/legacy-adapters.mjs +3 -2
- package/dist/mjs/bridge/legacy-adapters.mjs.map +3 -3
- package/dist/mjs/bridge/runtime-bindings.mjs +8 -7
- package/dist/mjs/bridge/runtime-bindings.mjs.map +3 -3
- package/dist/mjs/internal/client/connection.mjs +16 -14
- package/dist/mjs/internal/client/connection.mjs.map +3 -3
- package/dist/mjs/internal/console/index.mjs +18 -14
- package/dist/mjs/internal/console/index.mjs.map +3 -3
- package/dist/mjs/internal/daemon/connection.mjs +11 -12
- package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
- package/dist/mjs/internal/event-callback.mjs +30 -0
- package/dist/mjs/internal/event-callback.mjs.map +10 -0
- package/dist/mjs/internal/playwright/handler.mjs +3 -4
- package/dist/mjs/internal/playwright/handler.mjs.map +3 -3
- package/dist/mjs/internal/playwright/index.mjs +58 -64
- package/dist/mjs/internal/playwright/index.mjs.map +3 -3
- package/dist/mjs/internal/protocol/types.mjs.map +2 -2
- package/dist/mjs/internal/runtime/index.mjs +4 -12
- package/dist/mjs/internal/runtime/index.mjs.map +3 -3
- package/dist/mjs/internal/test-environment/index.mjs +3 -2
- package/dist/mjs/internal/test-environment/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/playwright.mjs.map +2 -2
- package/dist/mjs/runtime/test-event-subscriptions.mjs +3 -6
- package/dist/mjs/runtime/test-event-subscriptions.mjs.map +3 -3
- package/dist/types/internal/console/index.d.ts +2 -1
- package/dist/types/internal/event-callback.d.ts +1 -0
- package/dist/types/internal/protocol/types.d.ts +4 -3
- package/dist/types/internal/runtime/index.d.ts +0 -6
- package/dist/types/internal/test-environment/index.d.ts +1 -1
- package/dist/types/playwright.d.ts +1 -0
- package/dist/types/types.d.ts +6 -0
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/runtime/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
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 /** Get tracked browser context/page ids */\n getTrackedResources(): { contexts: string[]; pages: string[] };\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, { type: 'isolate.callback' })\n : callback\n );\n let __customFn_nextCallbackId = 1;\n const __customFn_callbacks = new Map();\n let __customFn_nextAsyncRefId = 1;\n const __customFn_promises = new Map();\n const __customFn_iterators = new Map();\n\n function __customFn_attachAsyncIterator(resultPromise, label) {\n resultPromise[Symbol.asyncIterator] = async function* () {\n const iterable = await resultPromise;\n if (iterable && typeof iterable[Symbol.asyncIterator] === 'function') {\n yield* iterable;\n return;\n }\n if (iterable && typeof iterable[Symbol.iterator] === 'function') {\n yield* iterable;\n return;\n }\n throw new TypeError(label + '(...) is not async iterable');\n };\n return resultPromise;\n }\n\n async function __customFn_waitForTurn() {\n for (let index = 0; index < 3; index += 1) {\n await Promise.resolve();\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\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 {\n __type: 'CallbackRef',\n callbackId: __customFn_registerCallback(value),\n callbackKind:\n value.__isolateCallbackKind === 'asyncGenerator' ||\n (value.constructor && value.constructor.name === 'AsyncGeneratorFunction')\n ? 'asyncGenerator'\n : undefined,\n };\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 AbortSignal !== 'undefined' && value instanceof AbortSignal) {\n return { __type: 'AbortSignalRef', aborted: value.aborted };\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 marshalForHostAsync(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null || value === undefined) {\n return marshalForHost(value, depth);\n }\n\n const type = typeof value;\n if (\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'bigint' ||\n type === 'function'\n ) {\n return marshalForHost(value, depth);\n }\n if (type === 'symbol') {\n throw new Error('Cannot marshal Symbol values');\n }\n\n if (value && typeof value.then === 'function') {\n return await marshalForHostAsync(await value, depth);\n }\n\n if (value && typeof value[Symbol.asyncIterator] === 'function') {\n const iteratorId = __customFn_nextAsyncRefId++;\n const iterator = value[Symbol.asyncIterator]();\n __customFn_iterators.set(iteratorId, iterator);\n\n const nextCallbackId = __customFn_registerCallback(async (id) => {\n const target = __customFn_iterators.get(id);\n if (!target) {\n throw new Error('Iterator ' + id + ' not found');\n }\n const result = await target.next();\n if (result.done) {\n __customFn_iterators.delete(id);\n }\n return {\n done: result.done,\n value: await marshalForHostAsync(result.value, depth + 1),\n };\n });\n\n const returnCallbackId = __customFn_registerCallback(async (id, returnValue) => {\n const target = __customFn_iterators.get(id);\n __customFn_iterators.delete(id);\n if (!target || typeof target.return !== 'function') {\n return {\n done: true,\n value: marshalForHost(undefined, depth + 1),\n };\n }\n const result = await target.return(returnValue);\n return {\n done: result.done ?? true,\n value: await marshalForHostAsync(result.value, depth + 1),\n };\n });\n\n const throwCallbackId = __customFn_registerCallback(async (id, errorValue) => {\n const target = __customFn_iterators.get(id);\n if (!target) {\n throw new Error('Iterator ' + id + ' not found');\n }\n if (typeof target.throw !== 'function') {\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\n try {\n const thrown = Object.assign(\n new Error(errorValue?.message ?? 'Iterator throw()'),\n { name: errorValue?.name ?? 'Error', stack: errorValue?.stack }\n );\n const result = await target.throw(thrown);\n if (result.done) {\n __customFn_iterators.delete(id);\n }\n return {\n done: result.done,\n value: await marshalForHostAsync(result.value, depth + 1),\n };\n } catch (error) {\n __customFn_iterators.delete(id);\n throw error;\n }\n });\n\n return {\n __type: 'AsyncIteratorRef',\n iteratorId,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n __throwCallbackId: throwCallbackId,\n };\n }\n\n if (value instanceof Date || value instanceof RegExp || value instanceof URL) {\n return marshalForHost(value, depth);\n }\n if (typeof AbortSignal !== 'undefined' && value instanceof AbortSignal) {\n return marshalForHost(value, depth);\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n return marshalForHost(value, depth);\n }\n if (value instanceof Uint8Array || value instanceof ArrayBuffer) {\n return marshalForHost(value, depth);\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n const headers = [];\n value.headers.forEach((headerValue, key) => headers.push([key, headerValue]));\n const body = value.body\n ? Array.from(new Uint8Array(await value.clone().arrayBuffer()))\n : null;\n return {\n __type: 'RequestRef',\n url: value.url,\n method: value.method,\n headers,\n body,\n mode: value.mode,\n credentials: value.credentials,\n cache: value.cache,\n redirect: value.redirect,\n referrer: value.referrer,\n referrerPolicy: value.referrerPolicy,\n integrity: value.integrity,\n };\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n const headers = [];\n value.headers.forEach((headerValue, key) => headers.push([key, headerValue]));\n const body = value.body\n ? Array.from(new Uint8Array(await value.clone().arrayBuffer()))\n : null;\n return {\n __type: 'ResponseRef',\n status: value.status,\n statusText: value.statusText,\n headers,\n body,\n };\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n return {\n __type: 'FileRef',\n name: value.name,\n type: value.type,\n lastModified: value.lastModified,\n data: Array.from(new Uint8Array(await value.arrayBuffer())),\n };\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n return {\n __type: 'FileRef',\n type: value.type,\n data: Array.from(new Uint8Array(await value.arrayBuffer())),\n };\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n const entries = [];\n for (const [key, entry] of value.entries()) {\n if (typeof entry === 'string') {\n entries.push([key, entry]);\n } else {\n entries.push([key, await marshalForHostAsync(entry, depth + 1)]);\n }\n }\n return { __type: 'FormDataRef', entries };\n }\n if (Array.isArray(value)) {\n return await Promise.all(value.map((item) => marshalForHostAsync(item, depth + 1)));\n }\n\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = await marshalForHostAsync(value[key], depth + 1);\n }\n return result;\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 = callback(...args);\n return JSON.stringify({ ok: true, value: await marshalForHostAsync(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 'AbortSignalRef': {\n if (value.aborted) {\n return AbortSignal.abort();\n }\n return new AbortController().signal;\n }\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 await __customFn_waitForTurn();\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 await __customFn_waitForTurn();\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 await __customFn_waitForTurn();\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 globalThis.__customFn_attachAsyncIterator = __customFn_attachAsyncIterator;\n globalThis.__customFn_waitForTurn = __customFn_waitForTurn;\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 const normalizeIsolateCallbackResult = async (\n value: unknown,\n ): Promise<unknown> => {\n if (typeof Response !== \"undefined\" && value instanceof Response) {\n const headers: Array<[string, string]> = [];\n value.headers.forEach((headerValue, key) => {\n headers.push([key, headerValue]);\n });\n const body = value.body\n ? Array.from(new Uint8Array(await value.clone().arrayBuffer()))\n : null;\n return {\n __type: \"ResponseRef\",\n status: value.status,\n statusText: value.statusText,\n headers,\n body,\n };\n }\n\n return value;\n };\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 const unmarshalled = unmarshalValue(result.value, isolateUnmarshalContext);\n return await normalizeIsolateCallbackResult(unmarshalled);\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 isolateUnmarshalContext.createPromiseProxy = (\n promiseId: number,\n ref?: { __resolveCallbackId?: number },\n ) => {\n const resolveCallbackId = ref?.__resolveCallbackId;\n if (typeof resolveCallbackId !== \"number\") {\n throw new Error(`Promise ${promiseId} is missing a resolve callback`);\n }\n\n return (async () => {\n const resultJson = await invokeIsolateCallbackRef.apply(\n undefined,\n [resolveCallbackId, JSON.stringify([promiseId])],\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(\n result.error?.message ?? `Promise ${promiseId} failed`,\n );\n error.name = result.error?.name ?? \"Error\";\n throw error;\n })();\n };\n\n isolateUnmarshalContext.createIteratorProxy = (\n iteratorId: number,\n ref?: {\n __nextCallbackId?: number;\n __returnCallbackId?: number;\n __throwCallbackId?: number;\n },\n ) => {\n const nextCallbackId = ref?.__nextCallbackId;\n const returnCallbackId = ref?.__returnCallbackId;\n const throwCallbackId = ref?.__throwCallbackId;\n\n if (typeof nextCallbackId !== \"number\") {\n throw new Error(`Iterator ${iteratorId} is missing a next callback`);\n }\n\n const invokeIteratorCallback = async (\n callbackId: number,\n args: unknown[],\n label: string,\n ) => {\n const resultJson = await invokeIsolateCallbackRef.apply(\n undefined,\n [callbackId, JSON.stringify(args)],\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 result.value as { done?: boolean; value?: unknown };\n }\n\n const error = new Error(\n result.error?.message ?? `${label} failed for iterator ${iteratorId}`,\n );\n error.name = result.error?.name ?? \"Error\";\n throw error;\n };\n\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n async next() {\n const result = await invokeIteratorCallback(\n nextCallbackId,\n [iteratorId],\n \"Iterator next()\",\n );\n return {\n done: Boolean(result.done),\n value: unmarshalValue(result.value, isolateUnmarshalContext),\n };\n },\n async return(value?: unknown) {\n if (typeof returnCallbackId !== \"number\") {\n return { done: true, value };\n }\n\n const result = await invokeIteratorCallback(\n returnCallbackId,\n [iteratorId, value],\n \"Iterator return()\",\n );\n return {\n done: result.done ?? true,\n value: unmarshalValue(result.value, isolateUnmarshalContext),\n };\n },\n async throw(errorValue?: unknown) {\n if (typeof throwCallbackId !== \"number\") {\n throw errorValue;\n }\n\n const serializedError = errorValue && typeof errorValue === \"object\"\n ? {\n message: (errorValue as { message?: unknown }).message,\n name: (errorValue as { name?: unknown }).name,\n stack: (errorValue as { stack?: unknown }).stack,\n }\n : {\n message: String(errorValue ?? \"Iterator throw()\"),\n name: \"Error\",\n };\n const result = await invokeIteratorCallback(\n throwCallbackId,\n [iteratorId, serializedError],\n \"Iterator throw()\",\n );\n return {\n done: Boolean(result.done),\n value: unmarshalValue(result.value, isolateUnmarshalContext),\n };\n },\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} = function(...args) {\n const resultPromise = (async () => {\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 await __customFn_waitForTurn();\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 return __customFn_attachAsyncIterator(resultPromise, \"${name}\");\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 let iteratorRef;\n const getIterator = async () => {\n if (!iteratorRef) {\n let iterator = await iteratorPromise;\n for (let depth = 0; depth < 4; depth += 1) {\n if (iterator && typeof iterator.next === 'function') {\n break;\n }\n if (!iterator || typeof iterator[Symbol.asyncIterator] !== 'function') {\n break;\n }\n iterator = iterator[Symbol.asyncIterator]();\n }\n iteratorRef = iterator;\n }\n return iteratorRef;\n };\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const iterator = await getIterator();\n if (!iterator || typeof iterator.next !== 'function') {\n throw new TypeError('Custom async iterator resolved to a non-iterator');\n }\n return iterator.next();\n },\n async return(v) {\n const iterator = await getIterator();\n return iterator.return ? iterator.return(v) : { done: true, value: v };\n },\n async throw(e) {\n const iterator = await getIterator();\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 hasDefaultPage: opts.playwright.hasDefaultPage,\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 getTrackedResources() {\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 state.handles.playwright.getTrackedResources();\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 { invokeBestEffortEventHandler } from \"../event-callback.mjs\";\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 /** Get tracked browser context/page ids */\n getTrackedResources(): { contexts: string[]; pages: string[] };\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 /** 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 /** 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.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, { type: 'isolate.callback' })\n : callback\n );\n let __customFn_nextCallbackId = 1;\n const __customFn_callbacks = new Map();\n let __customFn_nextAsyncRefId = 1;\n const __customFn_promises = new Map();\n const __customFn_iterators = new Map();\n\n function __customFn_attachAsyncIterator(resultPromise, label) {\n resultPromise[Symbol.asyncIterator] = async function* () {\n const iterable = await resultPromise;\n if (iterable && typeof iterable[Symbol.asyncIterator] === 'function') {\n yield* iterable;\n return;\n }\n if (iterable && typeof iterable[Symbol.iterator] === 'function') {\n yield* iterable;\n return;\n }\n throw new TypeError(label + '(...) is not async iterable');\n };\n return resultPromise;\n }\n\n async function __customFn_waitForTurn() {\n for (let index = 0; index < 3; index += 1) {\n await Promise.resolve();\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\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 {\n __type: 'CallbackRef',\n callbackId: __customFn_registerCallback(value),\n callbackKind:\n value.__isolateCallbackKind === 'asyncGenerator' ||\n (value.constructor && value.constructor.name === 'AsyncGeneratorFunction')\n ? 'asyncGenerator'\n : undefined,\n };\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 AbortSignal !== 'undefined' && value instanceof AbortSignal) {\n return { __type: 'AbortSignalRef', aborted: value.aborted };\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 marshalForHostAsync(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null || value === undefined) {\n return marshalForHost(value, depth);\n }\n\n const type = typeof value;\n if (\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'bigint' ||\n type === 'function'\n ) {\n return marshalForHost(value, depth);\n }\n if (type === 'symbol') {\n throw new Error('Cannot marshal Symbol values');\n }\n\n if (value && typeof value.then === 'function') {\n return await marshalForHostAsync(await value, depth);\n }\n\n if (value && typeof value[Symbol.asyncIterator] === 'function') {\n const iteratorId = __customFn_nextAsyncRefId++;\n const iterator = value[Symbol.asyncIterator]();\n __customFn_iterators.set(iteratorId, iterator);\n\n const nextCallbackId = __customFn_registerCallback(async (id) => {\n const target = __customFn_iterators.get(id);\n if (!target) {\n throw new Error('Iterator ' + id + ' not found');\n }\n const result = await target.next();\n if (result.done) {\n __customFn_iterators.delete(id);\n }\n return {\n done: result.done,\n value: await marshalForHostAsync(result.value, depth + 1),\n };\n });\n\n const returnCallbackId = __customFn_registerCallback(async (id, returnValue) => {\n const target = __customFn_iterators.get(id);\n __customFn_iterators.delete(id);\n if (!target || typeof target.return !== 'function') {\n return {\n done: true,\n value: marshalForHost(undefined, depth + 1),\n };\n }\n const result = await target.return(returnValue);\n return {\n done: result.done ?? true,\n value: await marshalForHostAsync(result.value, depth + 1),\n };\n });\n\n const throwCallbackId = __customFn_registerCallback(async (id, errorValue) => {\n const target = __customFn_iterators.get(id);\n if (!target) {\n throw new Error('Iterator ' + id + ' not found');\n }\n if (typeof target.throw !== 'function') {\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\n try {\n const thrown = Object.assign(\n new Error(errorValue?.message ?? 'Iterator throw()'),\n { name: errorValue?.name ?? 'Error', stack: errorValue?.stack }\n );\n const result = await target.throw(thrown);\n if (result.done) {\n __customFn_iterators.delete(id);\n }\n return {\n done: result.done,\n value: await marshalForHostAsync(result.value, depth + 1),\n };\n } catch (error) {\n __customFn_iterators.delete(id);\n throw error;\n }\n });\n\n return {\n __type: 'AsyncIteratorRef',\n iteratorId,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n __throwCallbackId: throwCallbackId,\n };\n }\n\n if (value instanceof Date || value instanceof RegExp || value instanceof URL) {\n return marshalForHost(value, depth);\n }\n if (typeof AbortSignal !== 'undefined' && value instanceof AbortSignal) {\n return marshalForHost(value, depth);\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n return marshalForHost(value, depth);\n }\n if (value instanceof Uint8Array || value instanceof ArrayBuffer) {\n return marshalForHost(value, depth);\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n const headers = [];\n value.headers.forEach((headerValue, key) => headers.push([key, headerValue]));\n const body = value.body\n ? Array.from(new Uint8Array(await value.clone().arrayBuffer()))\n : null;\n return {\n __type: 'RequestRef',\n url: value.url,\n method: value.method,\n headers,\n body,\n mode: value.mode,\n credentials: value.credentials,\n cache: value.cache,\n redirect: value.redirect,\n referrer: value.referrer,\n referrerPolicy: value.referrerPolicy,\n integrity: value.integrity,\n };\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n const headers = [];\n value.headers.forEach((headerValue, key) => headers.push([key, headerValue]));\n const body = value.body\n ? Array.from(new Uint8Array(await value.clone().arrayBuffer()))\n : null;\n return {\n __type: 'ResponseRef',\n status: value.status,\n statusText: value.statusText,\n headers,\n body,\n };\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n return {\n __type: 'FileRef',\n name: value.name,\n type: value.type,\n lastModified: value.lastModified,\n data: Array.from(new Uint8Array(await value.arrayBuffer())),\n };\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n return {\n __type: 'FileRef',\n type: value.type,\n data: Array.from(new Uint8Array(await value.arrayBuffer())),\n };\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n const entries = [];\n for (const [key, entry] of value.entries()) {\n if (typeof entry === 'string') {\n entries.push([key, entry]);\n } else {\n entries.push([key, await marshalForHostAsync(entry, depth + 1)]);\n }\n }\n return { __type: 'FormDataRef', entries };\n }\n if (Array.isArray(value)) {\n return await Promise.all(value.map((item) => marshalForHostAsync(item, depth + 1)));\n }\n\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = await marshalForHostAsync(value[key], depth + 1);\n }\n return result;\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 = callback(...args);\n return JSON.stringify({ ok: true, value: await marshalForHostAsync(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 'AbortSignalRef': {\n if (value.aborted) {\n return AbortSignal.abort();\n }\n return new AbortController().signal;\n }\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 await __customFn_waitForTurn();\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 await __customFn_waitForTurn();\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 await __customFn_waitForTurn();\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 globalThis.__customFn_attachAsyncIterator = __customFn_attachAsyncIterator;\n globalThis.__customFn_waitForTurn = __customFn_waitForTurn;\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 const normalizeIsolateCallbackResult = async (\n value: unknown,\n ): Promise<unknown> => {\n if (typeof Response !== \"undefined\" && value instanceof Response) {\n const headers: Array<[string, string]> = [];\n value.headers.forEach((headerValue, key) => {\n headers.push([key, headerValue]);\n });\n const body = value.body\n ? Array.from(new Uint8Array(await value.clone().arrayBuffer()))\n : null;\n return {\n __type: \"ResponseRef\",\n status: value.status,\n statusText: value.statusText,\n headers,\n body,\n };\n }\n\n return value;\n };\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 const unmarshalled = unmarshalValue(result.value, isolateUnmarshalContext);\n return await normalizeIsolateCallbackResult(unmarshalled);\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 isolateUnmarshalContext.createPromiseProxy = (\n promiseId: number,\n ref?: { __resolveCallbackId?: number },\n ) => {\n const resolveCallbackId = ref?.__resolveCallbackId;\n if (typeof resolveCallbackId !== \"number\") {\n throw new Error(`Promise ${promiseId} is missing a resolve callback`);\n }\n\n return (async () => {\n const resultJson = await invokeIsolateCallbackRef.apply(\n undefined,\n [resolveCallbackId, JSON.stringify([promiseId])],\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(\n result.error?.message ?? `Promise ${promiseId} failed`,\n );\n error.name = result.error?.name ?? \"Error\";\n throw error;\n })();\n };\n\n isolateUnmarshalContext.createIteratorProxy = (\n iteratorId: number,\n ref?: {\n __nextCallbackId?: number;\n __returnCallbackId?: number;\n __throwCallbackId?: number;\n },\n ) => {\n const nextCallbackId = ref?.__nextCallbackId;\n const returnCallbackId = ref?.__returnCallbackId;\n const throwCallbackId = ref?.__throwCallbackId;\n\n if (typeof nextCallbackId !== \"number\") {\n throw new Error(`Iterator ${iteratorId} is missing a next callback`);\n }\n\n const invokeIteratorCallback = async (\n callbackId: number,\n args: unknown[],\n label: string,\n ) => {\n const resultJson = await invokeIsolateCallbackRef.apply(\n undefined,\n [callbackId, JSON.stringify(args)],\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 result.value as { done?: boolean; value?: unknown };\n }\n\n const error = new Error(\n result.error?.message ?? `${label} failed for iterator ${iteratorId}`,\n );\n error.name = result.error?.name ?? \"Error\";\n throw error;\n };\n\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n async next() {\n const result = await invokeIteratorCallback(\n nextCallbackId,\n [iteratorId],\n \"Iterator next()\",\n );\n return {\n done: Boolean(result.done),\n value: unmarshalValue(result.value, isolateUnmarshalContext),\n };\n },\n async return(value?: unknown) {\n if (typeof returnCallbackId !== \"number\") {\n return { done: true, value };\n }\n\n const result = await invokeIteratorCallback(\n returnCallbackId,\n [iteratorId, value],\n \"Iterator return()\",\n );\n return {\n done: result.done ?? true,\n value: unmarshalValue(result.value, isolateUnmarshalContext),\n };\n },\n async throw(errorValue?: unknown) {\n if (typeof throwCallbackId !== \"number\") {\n throw errorValue;\n }\n\n const serializedError = errorValue && typeof errorValue === \"object\"\n ? {\n message: (errorValue as { message?: unknown }).message,\n name: (errorValue as { name?: unknown }).name,\n stack: (errorValue as { stack?: unknown }).stack,\n }\n : {\n message: String(errorValue ?? \"Iterator throw()\"),\n name: \"Error\",\n };\n const result = await invokeIteratorCallback(\n throwCallbackId,\n [iteratorId, serializedError],\n \"Iterator throw()\",\n );\n return {\n done: Boolean(result.done),\n value: unmarshalValue(result.value, isolateUnmarshalContext),\n };\n },\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} = function(...args) {\n const resultPromise = (async () => {\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 await __customFn_waitForTurn();\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 return __customFn_attachAsyncIterator(resultPromise, \"${name}\");\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 let iteratorRef;\n const getIterator = async () => {\n if (!iteratorRef) {\n let iterator = await iteratorPromise;\n for (let depth = 0; depth < 4; depth += 1) {\n if (iterator && typeof iterator.next === 'function') {\n break;\n }\n if (!iterator || typeof iterator[Symbol.asyncIterator] !== 'function') {\n break;\n }\n iterator = iterator[Symbol.asyncIterator]();\n }\n iteratorRef = iterator;\n }\n return iteratorRef;\n };\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const iterator = await getIterator();\n if (!iterator || typeof iterator.next !== 'function') {\n throw new TypeError('Custom async iterator resolved to a non-iterator');\n }\n return iterator.next();\n },\n async return(v) {\n const iterator = await getIterator();\n return iterator.return ? iterator.return(v) : { done: true, value: v };\n },\n async throw(e) {\n const iterator = await getIterator();\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 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 invokeBestEffortEventHandler(\"playwright.onEvent\", originalCallback, event);\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n invokeBestEffortEventHandler(\"console.onEntry\", 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 hasDefaultPage: opts.playwright.hasDefaultPage,\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 getTrackedResources() {\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 state.handles.playwright.getTrackedResources();\n },\n clearCollectedData() {\n ensureRuntimeUsable();\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\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 },\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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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
|
|
8
|
+
"debugId": "FEF2A9EC5E55842A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/internal/test-environment/index.ts
|
|
2
2
|
import IsolatedVM from "@ricsam/isolated-vm";
|
|
3
|
+
import { invokeBestEffortEventHandler } from "../event-callback.mjs";
|
|
3
4
|
var testEnvironmentCode = `
|
|
4
5
|
(function() {
|
|
5
6
|
// ============================================================
|
|
@@ -1312,7 +1313,7 @@ async function setupTestEnvironment(context, options) {
|
|
|
1312
1313
|
const eventCallbackRef = new IsolatedVM.Reference((eventJson) => {
|
|
1313
1314
|
try {
|
|
1314
1315
|
const event = JSON.parse(eventJson);
|
|
1315
|
-
options.onEvent
|
|
1316
|
+
invokeBestEffortEventHandler("testEnvironment.onEvent", options.onEvent, event);
|
|
1316
1317
|
} catch {}
|
|
1317
1318
|
});
|
|
1318
1319
|
const global = context.global;
|
|
@@ -1348,4 +1349,4 @@ export {
|
|
|
1348
1349
|
getTestCount
|
|
1349
1350
|
};
|
|
1350
1351
|
|
|
1351
|
-
//# debugId=
|
|
1352
|
+
//# debugId=F21D13604C6AE15C64756E2164756E21
|