@ricsam/isolate-runtime 0.1.15 → 0.1.17
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/index.cjs +185 -59
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/index.mjs +185 -59
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/index.d.ts +4 -0
- package/package.json +1 -1
package/dist/mjs/index.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import ivm from \"isolated-vm\";\nimport path from \"node:path\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { normalizeEntryFilename } from \"@ricsam/isolate-protocol\";\nimport {\n transformEntryCode,\n transformModuleCode,\n contentHash,\n mapErrorStack,\n type SourceMap,\n type TransformResult,\n} from \"@ricsam/isolate-transform\";\n\n// Re-export for convenience\nexport { normalizeEntryFilename } from \"@ricsam/isolate-protocol\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type PlaywrightSetupOptions,\n} from \"@ricsam/isolate-playwright\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n ClientWebSocketCommand,\n} from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"@ricsam/isolate-test-environment\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightEvent,\n} from \"@ricsam/isolate-playwright\";\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 \"@ricsam/isolate-protocol\";\nimport {\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\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 \"@ricsam/isolate-protocol\";\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}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n * Timers fire automatically based on real time.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\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 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 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 /** Pending callbacks to await after eval (for daemon IPC fire-and-forget pattern) */\n pendingCallbacks: Promise<unknown>[];\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') throw new Error('Cannot marshal functions from isolate');\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n // Create a proxy function that invokes the callback\n const callbackId = value.callbackId;\n return function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [callbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n }\n case 'PromiseRef': {\n // Create a proxy Promise that resolves via callback\n const promiseId = value.promiseId;\n return new Promise((resolve, reject) => {\n try {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [value.__resolveCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n resolve(unmarshalFromHost(result.value));\n } else {\n reject(new Error(result.error.message));\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [nextCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [returnCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n return { done: true, value: result.ok ? unmarshalFromHost(result.value) : undefined };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n // Expose as globals\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n})();\n`;\n\n// CustomFunctionsMarshalOptions is exported at the top of the file\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n *\n * When marshalOptions is provided, returned values are marshalled with a MarshalContext,\n * enabling proper proxying of callbacks/promises/iterators across boundaries.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions,\n marshalOptions?: CustomFunctionsMarshalOptions,\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result.\n // The first argument can be a string function name (for custom functions) or a\n // numeric callback ID (for returned callbacks/promises/iterators from marshal).\n const invokeCallbackRef = new ivm.Reference(\n async (nameOrId: string | number, argsJson: string): Promise<string> => {\n // Check if this is a local callback ID (numeric, used by returned callbacks/promises/iterators)\n if (typeof nameOrId === \"number\" && marshalOptions) {\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n const result = await marshalOptions.invokeCallback(nameOrId, args);\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n\n const name = String(nameOrId);\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n // Unmarshal args from isolate (converts Refs back to JavaScript types)\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n // Always await the result: for daemon-bridged functions, even \"sync\" custom functions\n // are async due to IPC, so we need to resolve the promise.\n const result = await def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n }\n const marshalledResult = await marshalValue(result);\n return JSON.stringify({ ok: true, value: marshalledResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Iterator start: creates iterator, stores in session, returns iteratorId\n const iterStartRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def || def.type !== \"asyncIterator\") {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Async iterator function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n try {\n // Unmarshal args from isolate\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n const fn = def.fn as CustomAsyncGeneratorFunction;\n const iterator = fn(...args);\n const iteratorId = nextIteratorId++;\n iteratorSessions.set(iteratorId, { iterator });\n return JSON.stringify({ ok: true, iteratorId });\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(\"__iter_start\", iterStartRef);\n\n // Iterator next: calls iterator.next(), returns {done, value}\n const iterNextRef = new ivm.Reference(\n async (iteratorId: number): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n iteratorSessions.delete(iteratorId);\n }\n // Marshal value for isolate\n let marshalledValue: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledValue = await marshalValue(result.value, ctx);\n marshalledValue = marshalOptions.addCallbackIdsToRefs(marshalledValue);\n } else {\n marshalledValue = await marshalValue(result.value);\n }\n return JSON.stringify({\n ok: true,\n done: result.done,\n value: marshalledValue,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_next\", iterNextRef);\n\n // Iterator return: calls iterator.return(), cleans up session\n const iterReturnRef = new ivm.Reference(\n async (iteratorId: number, valueJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({ ok: true, done: true, value: undefined });\n }\n try {\n // Unmarshal value from isolate\n const rawValue = valueJson ? JSON.parse(valueJson) : undefined;\n const value = unmarshalValue(rawValue);\n const result = await session.iterator.return?.(value);\n iteratorSessions.delete(iteratorId);\n // Marshal value for isolate\n let marshalledValue: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledValue = await marshalValue(result?.value, ctx);\n marshalledValue = marshalOptions.addCallbackIdsToRefs(marshalledValue);\n } else {\n marshalledValue = await marshalValue(result?.value);\n }\n return JSON.stringify({ ok: true, done: true, value: marshalledValue });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_return\", iterReturnRef);\n\n // Iterator throw: calls iterator.throw(), cleans up session\n const iterThrowRef = new ivm.Reference(\n async (iteratorId: number, errorJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const errorData = JSON.parse(errorJson) as {\n message: string;\n name: string;\n };\n const error = Object.assign(new Error(errorData.message), {\n name: errorData.name,\n });\n const result = await session.iterator.throw?.(error);\n iteratorSessions.delete(iteratorId);\n // Marshal value for isolate\n let marshalledValue: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledValue = await marshalValue(result?.value, ctx);\n marshalledValue = marshalOptions.addCallbackIdsToRefs(marshalledValue);\n } else {\n marshalledValue = await marshalValue(result?.value);\n }\n return JSON.stringify({\n ok: true,\n done: result?.done ?? true,\n value: marshalledValue,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_throw\", iterThrowRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"sync\") {\n // Sync function: use applySyncPromise (to await the host) but wrap in regular function\n // The function blocks until the host responds, but returns the value directly (not a Promise)\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n // Async iterator function: returns an async iterable object\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const startResult = JSON.parse(__iter_start.applySyncPromise(undefined, [\"${name}\", JSON.stringify(marshalledArgs)]));\n if (!startResult.ok) {\n throw Object.assign(new Error(startResult.error.message), { name: startResult.error.name });\n }\n const iteratorId = startResult.iteratorId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const result = JSON.parse(__iter_next.applySyncPromise(undefined, [iteratorId]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: __unmarshalFromHost(result.value) };\n },\n async return(v) {\n const result = JSON.parse(__iter_return.applySyncPromise(undefined, [iteratorId, JSON.stringify(__marshalForHost(v))]));\n return { done: true, value: __unmarshalFromHost(result.value) };\n },\n async throw(e) {\n const result = JSON.parse(__iter_throw.applySyncPromise(undefined, [iteratorId, JSON.stringify({ message: e.message, name: e.name })]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: __unmarshalFromHost(result.value) };\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 return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\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 // Static cache first\n const staticCached = state.staticModuleCache.get(specifier);\n if (staticCached) return staticCached;\n\n // Specifier-only fast path is safe here: each local runtime gets a fresh cache,\n // so there's no cross-lifecycle staleness (unlike the daemon where caches persist across namespace reuse).\n const cached = state.moduleCache.get(specifier);\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 // Get importer info\n const importerPath = state.moduleToFilename.get(referrer) ?? \"<unknown>\";\n const importerResolveDir = path.posix.dirname(importerPath);\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 // Cache by specifier + content hash (allows invalidation when content changes)\n const hash = contentHash(code);\n const cacheKey = `${specifier}:${hash}`;\n const hashCached = state.moduleCache.get(cacheKey);\n if (hashCached) return hashCached;\n\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, specifier);\n state.transformCache.set(hash, transformed);\n }\n\n if (transformed.sourceMap) {\n state.sourceMaps.set(specifier, transformed.sourceMap);\n }\n\n // Compile the module\n const mod = await state.isolate.compileModule(transformed.code, {\n filename: specifier,\n });\n\n // Construct resolved path and track for nested imports\n const resolvedPath = path.posix.join(resolveDir, path.posix.basename(specifier));\n state.moduleToFilename.set(mod, resolvedPath);\n\n // Cache before instantiation (for circular dependencies)\n if (result.static) {\n state.staticModuleCache.set(specifier, mod);\n } else {\n state.moduleCache.set(specifier, mod);\n state.moduleCache.set(cacheKey, mod);\n }\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n return mod;\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (url: string, init: FetchRequestInit): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(url, init));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\n */\nexport async function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n options?: RuntimeOptions<T>\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n staticModuleCache: new Map(),\n transformCache: new Map(),\n moduleToFilename: new Map(),\n sourceMaps: new Map(),\n pendingCallbacks: [],\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob) and Buffer\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n const customMarshalOptions =\n opts.customFunctionsMarshalOptions ??\n createLocalCustomFunctionsMarshalOptions();\n\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n customMarshalOptions,\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright - AFTER test environment so expect can be extended\n if (opts.playwright) {\n if (!opts.playwright.handler) {\n throw new Error(\n \"Playwright configured without handler. Provide playwright.handler in createRuntime options.\"\n );\n }\n\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n stdout: event.stdout,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n const playwrightSetupOptions: PlaywrightSetupOptions = {\n handler: opts.playwright.handler,\n timeout: opts.playwright.timeout,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n };\n\n state.handles.playwright = await setupPlaywright(context, playwrightSetupOptions);\n }\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\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 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 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 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 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 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 if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\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 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 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 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 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 if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onClientWebSocketCommand(callback);\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n state.handles.console?.reset();\n },\n getTimers() {\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\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 if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n\n if (timeout === undefined) {\n return runTestsInContext(state.context);\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(\"Test timeout\")), timeout);\n });\n\n try {\n return await Promise.race([\n runTestsInContext(state.context),\n timeoutPromise,\n ]);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n },\n hasTests(): boolean {\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 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 state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\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 networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n };\n },\n clearCollectedData() {\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 // Parse options\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n\n // Normalize filename to absolute path for module resolution\n const filename = normalizeEntryFilename(options?.filename);\n\n try {\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 for nested imports\n state.moduleToFilename.set(mod, filename);\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n // Evaluate - only resolves imports and defines the default function (no timeout needed)\n await mod.evaluate();\n\n // Get the default export and run it with timeout\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 ...(options?.maxExecutionMs\n ? { timeout: options.maxExecutionMs }\n : {}),\n });\n } finally {\n runRef.release();\n }\n\n // Await pending callbacks (no-op for local use, enables daemon IPC flush)\n if (state.pendingCallbacks.length > 0) {\n await Promise.all(state.pendingCallbacks);\n state.pendingCallbacks.length = 0;\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 clearModuleCache() {\n state.moduleCache.clear();\n state.moduleToFilename.clear();\n state.sourceMaps.clear();\n // staticModuleCache and transformCache intentionally preserved\n },\n\n async dispose(): Promise<void> {\n // Dispose custom function reference\n if (state.customFnInvokeRef) {\n state.customFnInvokeRef.release();\n }\n\n // Dispose all handles (in reverse order of setup)\n state.handles.playwright?.dispose();\n state.handles.testEnvironment?.dispose();\n state.handles.fs?.dispose();\n state.handles.fetch?.dispose();\n state.handles.crypto?.dispose();\n state.handles.path?.dispose();\n state.handles.timers?.dispose();\n state.handles.encoding?.dispose();\n state.handles.console?.dispose();\n state.handles.core?.dispose();\n\n // Clear module cache\n state.moduleCache.clear();\n\n // Release context and dispose isolate\n state.context.release();\n state.isolate.dispose();\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"@ricsam/isolate-core\";\nexport type { CoreHandle, SetupCoreOptions } from \"@ricsam/isolate-core\";\n\nexport { setupConsole } from \"@ricsam/isolate-console\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"@ricsam/isolate-console/utils\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"@ricsam/isolate-console\";\n\nexport { setupCrypto } from \"@ricsam/isolate-crypto\";\nexport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\nexport { setupEncoding } from \"@ricsam/isolate-encoding\";\nexport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\n\nexport { setupFetch } from \"@ricsam/isolate-fetch\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n ClientWebSocketCommand,\n} from \"@ricsam/isolate-fetch\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"@ricsam/isolate-fs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"@ricsam/isolate-fs\";\n\nexport { setupPath } from \"@ricsam/isolate-path\";\nexport type { PathHandle, PathOptions } from \"@ricsam/isolate-path\";\n\nexport { setupTimers } from \"@ricsam/isolate-timers\";\nexport type { TimersHandle } from \"@ricsam/isolate-timers\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"@ricsam/isolate-test-environment\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"@ricsam/isolate-test-environment\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"@ricsam/isolate-playwright\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n} from \"@ricsam/isolate-playwright\";\n"
|
|
5
|
+
"import ivm from \"isolated-vm\";\nimport path from \"node:path\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { normalizeEntryFilename } from \"@ricsam/isolate-protocol\";\nimport {\n transformEntryCode,\n transformModuleCode,\n contentHash,\n mapErrorStack,\n type SourceMap,\n type TransformResult,\n} from \"@ricsam/isolate-transform\";\n\n// Re-export for convenience\nexport { normalizeEntryFilename } from \"@ricsam/isolate-protocol\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type PlaywrightSetupOptions,\n} from \"@ricsam/isolate-playwright\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n ClientWebSocketCommand,\n} from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"@ricsam/isolate-test-environment\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightEvent,\n} from \"@ricsam/isolate-playwright\";\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 \"@ricsam/isolate-protocol\";\nimport {\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\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 \"@ricsam/isolate-protocol\";\n\n// Re-export shared protocol option types\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\n\n/**\n * Options for customizing how custom function return values are marshalled.\n * Used by the daemon to support returned callbacks/promises/iterators via IPC.\n */\nexport interface CustomFunctionsMarshalOptions {\n /** Factory to create a MarshalContext for registering returned callbacks/promises/iterators */\n createMarshalContext: () => MarshalContext;\n /** Post-processor to add callback IDs to PromiseRef/AsyncIteratorRef values */\n addCallbackIdsToRefs: (value: unknown) => unknown;\n /** Handler for numeric callback IDs from marshalled refs (CallbackRef, PromiseRef, AsyncIteratorRef) */\n invokeCallback: (callbackId: number, args: unknown[]) => Promise<unknown>;\n}\n\n/**\n * Options for creating a runtime.\n * Extends BaseRuntimeOptions and adds runtime-specific fs type.\n */\nexport interface RuntimeOptions<T extends Record<string, any[]> = Record<string, unknown[]>>\n extends BaseRuntimeOptions<T> {\n /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /**\n * Optional marshal options for custom functions.\n * When provided, enables MarshalContext-based marshalling for returned values.\n * Used by the daemon for IPC proxying of callbacks/promises/iterators.\n */\n customFunctionsMarshalOptions?: CustomFunctionsMarshalOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(\n connectionId: string,\n code: number,\n reason: string\n ): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n /** Dispatch open event to a client WebSocket in the isolate */\n dispatchClientWebSocketOpen(socketId: string, protocol: string, extensions: string): void;\n /** Dispatch message event to a client WebSocket in the isolate */\n dispatchClientWebSocketMessage(socketId: string, data: string | ArrayBuffer): void;\n /** Dispatch close event to a client WebSocket in the isolate */\n dispatchClientWebSocketClose(socketId: string, code: number, reason: string, wasClean: boolean): void;\n /** Dispatch error event to a client WebSocket in the isolate */\n dispatchClientWebSocketError(socketId: string): void;\n /** Register callback for client WebSocket commands from isolate */\n onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void): () => void;\n /** Register callback for events emitted from isolate code */\n onEvent(callback: (event: string, payload: unknown) => void): () => void;\n /** Dispatch an event into the isolate (calls __on listeners) */\n dispatchEvent(event: string, payload: unknown): void;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n * Timers fire automatically based on real time.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\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 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}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') throw new Error('Cannot marshal functions from isolate');\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n // Create a proxy function that invokes the callback\n const callbackId = value.callbackId;\n return function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [callbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n }\n case 'PromiseRef': {\n // Create a proxy Promise that resolves via callback\n const promiseId = value.promiseId;\n return new Promise((resolve, reject) => {\n try {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [value.__resolveCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n resolve(unmarshalFromHost(result.value));\n } else {\n reject(new Error(result.error.message));\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [nextCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [returnCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n return { done: true, value: result.ok ? unmarshalFromHost(result.value) : undefined };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n // Expose as globals\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n})();\n`;\n\n// CustomFunctionsMarshalOptions is exported at the top of the file\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n *\n * When marshalOptions is provided, returned values are marshalled with a MarshalContext,\n * enabling proper proxying of callbacks/promises/iterators across boundaries.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions,\n marshalOptions?: CustomFunctionsMarshalOptions,\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result.\n // The first argument can be a string function name (for custom functions) or a\n // numeric callback ID (for returned callbacks/promises/iterators from marshal).\n const invokeCallbackRef = new ivm.Reference(\n async (nameOrId: string | number, argsJson: string): Promise<string> => {\n // Check if this is a local callback ID (numeric, used by returned callbacks/promises/iterators)\n if (typeof nameOrId === \"number\" && marshalOptions) {\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n const result = await marshalOptions.invokeCallback(nameOrId, args);\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n\n const name = String(nameOrId);\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n // Unmarshal args from isolate (converts Refs back to JavaScript types)\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n try {\n // Always await the result: for daemon-bridged functions, even \"sync\" custom functions\n // are async due to IPC, so we need to resolve the promise.\n const result = await def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n const marshalledResult = await marshalValue(result, ctx);\n const processedResult = marshalOptions.addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify({ ok: true, value: processedResult });\n }\n const marshalledResult = await marshalValue(result);\n return JSON.stringify({ ok: true, value: marshalledResult });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Iterator start: creates iterator, stores in session, returns iteratorId\n const iterStartRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def || def.type !== \"asyncIterator\") {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Async iterator function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n try {\n // Unmarshal args from isolate\n const rawArgs = JSON.parse(argsJson) as unknown[];\n const args = unmarshalValue(rawArgs) as unknown[];\n const fn = def.fn as CustomAsyncGeneratorFunction;\n const iterator = fn(...args);\n const iteratorId = nextIteratorId++;\n iteratorSessions.set(iteratorId, { iterator });\n return JSON.stringify({ ok: true, iteratorId });\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(\"__iter_start\", iterStartRef);\n\n // Iterator next: calls iterator.next(), returns {done, value}\n const iterNextRef = new ivm.Reference(\n async (iteratorId: number): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n iteratorSessions.delete(iteratorId);\n }\n // Marshal value for isolate\n let marshalledValue: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledValue = await marshalValue(result.value, ctx);\n marshalledValue = marshalOptions.addCallbackIdsToRefs(marshalledValue);\n } else {\n marshalledValue = await marshalValue(result.value);\n }\n return JSON.stringify({\n ok: true,\n done: result.done,\n value: marshalledValue,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_next\", iterNextRef);\n\n // Iterator return: calls iterator.return(), cleans up session\n const iterReturnRef = new ivm.Reference(\n async (iteratorId: number, valueJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({ ok: true, done: true, value: undefined });\n }\n try {\n // Unmarshal value from isolate\n const rawValue = valueJson ? JSON.parse(valueJson) : undefined;\n const value = unmarshalValue(rawValue);\n const result = await session.iterator.return?.(value);\n iteratorSessions.delete(iteratorId);\n // Marshal value for isolate\n let marshalledValue: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledValue = await marshalValue(result?.value, ctx);\n marshalledValue = marshalOptions.addCallbackIdsToRefs(marshalledValue);\n } else {\n marshalledValue = await marshalValue(result?.value);\n }\n return JSON.stringify({ ok: true, done: true, value: marshalledValue });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_return\", iterReturnRef);\n\n // Iterator throw: calls iterator.throw(), cleans up session\n const iterThrowRef = new ivm.Reference(\n async (iteratorId: number, errorJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const errorData = JSON.parse(errorJson) as {\n message: string;\n name: string;\n };\n const error = Object.assign(new Error(errorData.message), {\n name: errorData.name,\n });\n const result = await session.iterator.throw?.(error);\n iteratorSessions.delete(iteratorId);\n // Marshal value for isolate\n let marshalledValue: unknown;\n if (marshalOptions) {\n const ctx = marshalOptions.createMarshalContext();\n marshalledValue = await marshalValue(result?.value, ctx);\n marshalledValue = marshalOptions.addCallbackIdsToRefs(marshalledValue);\n } else {\n marshalledValue = await marshalValue(result?.value);\n }\n return JSON.stringify({\n ok: true,\n done: result?.done ?? true,\n value: marshalledValue,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_throw\", iterThrowRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"sync\") {\n // Sync function: use applySyncPromise (to await the host) but wrap in regular function\n // The function blocks until the host responds, but returns the value directly (not a Promise)\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(marshalledArgs)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return __unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n // Async iterator function: returns an async iterable object\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const marshalledArgs = __marshalForHost(args);\n const startResult = JSON.parse(__iter_start.applySyncPromise(undefined, [\"${name}\", JSON.stringify(marshalledArgs)]));\n if (!startResult.ok) {\n throw Object.assign(new Error(startResult.error.message), { name: startResult.error.name });\n }\n const iteratorId = startResult.iteratorId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const result = JSON.parse(__iter_next.applySyncPromise(undefined, [iteratorId]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: __unmarshalFromHost(result.value) };\n },\n async return(v) {\n const result = JSON.parse(__iter_return.applySyncPromise(undefined, [iteratorId, JSON.stringify(__marshalForHost(v))]));\n return { done: true, value: __unmarshalFromHost(result.value) };\n },\n async throw(e) {\n const result = JSON.parse(__iter_throw.applySyncPromise(undefined, [iteratorId, JSON.stringify({ message: e.message, name: e.name })]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: __unmarshalFromHost(result.value) };\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 return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n };\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => addCallbackIdsToRefs(item));\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = addCallbackIdsToRefs(\n (value as Record<string, unknown>)[key]\n );\n }\n return result;\n };\n\n const invokeCallback = async (\n callbackId: number,\n args: unknown[]\n ): Promise<unknown> => {\n const callback = returnedCallbacks.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n return await callback(...args);\n };\n\n return { createMarshalContext, addCallbackIdsToRefs, invokeCallback };\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Get importer info\n const importerPath = state.moduleToFilename.get(referrer) ?? \"<unknown>\";\n const importerResolveDir = path.posix.dirname(importerPath);\n const importerStack = state.moduleImportChain.get(importerPath) ?? [];\n\n // Resolve relative specifiers to absolute-like paths for cache key uniqueness.\n // This prevents cross-package collisions (e.g. two different packages both importing \"./utils.js\").\n const resolvedSpecifier = specifier.startsWith('.')\n ? path.posix.normalize(path.posix.join(importerResolveDir, specifier))\n : specifier;\n\n // Track who imports this specifier (for error diagnostics)\n state.specifierToImporter.set(resolvedSpecifier, importerPath);\n\n // Static cache first\n const staticCached = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCached) return staticCached;\n\n const cached = state.moduleCache.get(resolvedSpecifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n }\n\n // Invoke module loader - capture full result including static flag\n const result = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\n const { code, resolveDir } = result;\n\n // Validate filename: must be a basename (no slashes)\n if (result.filename.includes('/')) {\n throw new Error(\n `moduleLoader returned a filename with slashes: \"${result.filename}\". ` +\n `filename must be a basename (e.g. \"utils.js\"), not a path.`\n );\n }\n\n // Construct resolved filename using result.filename\n const resolvedFilename = path.posix.join(resolveDir, result.filename);\n\n // Cache by specifier + content hash (allows invalidation when content changes)\n const hash = contentHash(code);\n const cacheKey = `${resolvedSpecifier}:${hash}`;\n const inFlightKey = `${result.static ? \"static\" : \"dynamic\"}:${cacheKey}`;\n\n // Cache checks again after await in case another resolver call won the race\n const staticCachedAfterLoad = state.staticModuleCache.get(resolvedSpecifier);\n if (staticCachedAfterLoad) return staticCachedAfterLoad;\n\n const cachedAfterLoad = state.moduleCache.get(resolvedSpecifier);\n if (cachedAfterLoad) return cachedAfterLoad;\n\n const hashCached = state.moduleCache.get(cacheKey);\n if (hashCached) return hashCached;\n\n const inFlight = state.moduleLoadsInFlight.get(inFlightKey);\n if (inFlight) return inFlight;\n\n const loadPromise = (async (): Promise<ivm.Module> => {\n let mod: ivm.Module | undefined;\n try {\n // Transform cache — check transform cache first (survives reuse in daemon)\n let transformed: TransformResult | undefined = state.transformCache.get(hash);\n if (!transformed) {\n transformed = await transformModuleCode(code, resolvedSpecifier);\n state.transformCache.set(hash, transformed);\n }\n\n if (transformed.sourceMap) {\n state.sourceMaps.set(resolvedSpecifier, transformed.sourceMap);\n }\n\n // Compile the module using resolvedSpecifier as filename\n mod = await state.isolate.compileModule(transformed.code, {\n filename: resolvedSpecifier,\n });\n\n // Track resolved filename for nested imports\n state.moduleToFilename.set(mod, resolvedFilename);\n\n // Track import chain for error diagnostics\n state.moduleImportChain.set(resolvedFilename, [...importerStack, importerPath]);\n\n // Cache the compiled module before linker uses it (supports circular deps)\n if (result.static) {\n state.staticModuleCache.set(resolvedSpecifier, mod);\n } else {\n state.moduleCache.set(resolvedSpecifier, mod);\n state.moduleCache.set(cacheKey, mod);\n }\n\n return mod;\n } catch (err) {\n // Annotate error with module resolution context\n const error = err instanceof Error ? err : new Error(String(err));\n error.message = `Failed to compile module \"${resolvedSpecifier}\" (imported by \"${importerPath}\"):\\n${error.message}`;\n if (importerStack.length > 0) {\n error.message += `\\n\\nImport chain:\\n ${[...importerStack, importerPath].join('\\n -> ')}`;\n }\n\n // Remove partial cache state to avoid returning poisoned module entries later.\n if (mod) {\n state.moduleToFilename.delete(mod);\n if (result.static) {\n if (state.staticModuleCache.get(resolvedSpecifier) === mod) {\n state.staticModuleCache.delete(resolvedSpecifier);\n }\n } else {\n if (state.moduleCache.get(resolvedSpecifier) === mod) {\n state.moduleCache.delete(resolvedSpecifier);\n }\n if (state.moduleCache.get(cacheKey) === mod) {\n state.moduleCache.delete(cacheKey);\n }\n }\n }\n throw error;\n }\n })();\n\n state.moduleLoadsInFlight.set(inFlightKey, loadPromise);\n try {\n return await loadPromise;\n } finally {\n state.moduleLoadsInFlight.delete(inFlightKey);\n }\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (url: string, init: FetchRequestInit): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(url, init));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\n */\nexport async function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n options?: RuntimeOptions<T>\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n 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 moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob) and Buffer\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n const customMarshalOptions =\n opts.customFunctionsMarshalOptions ??\n createLocalCustomFunctionsMarshalOptions();\n\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>,\n customMarshalOptions,\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright - AFTER test environment so expect can be extended\n if (opts.playwright) {\n if (!opts.playwright.handler) {\n throw new Error(\n \"Playwright configured without handler. Provide playwright.handler in createRuntime options.\"\n );\n }\n\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n stdout: event.stdout,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n const playwrightSetupOptions: PlaywrightSetupOptions = {\n handler: opts.playwright.handler,\n timeout: opts.playwright.timeout,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n };\n\n state.handles.playwright = await setupPlaywright(context, playwrightSetupOptions);\n }\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\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 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 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 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 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 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 if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\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 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 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 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 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 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 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 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 state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n state.handles.console?.reset();\n },\n getTimers() {\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\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 if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n\n if (timeout === undefined) {\n return runTestsInContext(state.context);\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(\"Test timeout\")), timeout);\n });\n\n try {\n return await Promise.race([\n runTestsInContext(state.context),\n timeoutPromise,\n ]);\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n },\n hasTests(): boolean {\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 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 state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\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 networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n };\n },\n clearCollectedData() {\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 runEval = async (): Promise<void> => {\n // Parse options\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n\n // Normalize filename to absolute path for module resolution\n const filename = normalizeEntryFilename(options?.filename);\n\n try {\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 // Evaluate - only resolves imports and defines the default function (no timeout needed)\n await mod.evaluate();\n\n // Get the default export and run it with timeout\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 // Await pending callbacks (no-op for local use, enables daemon IPC flush)\n if (state.pendingCallbacks.length > 0) {\n await Promise.all(state.pendingCallbacks);\n state.pendingCallbacks.length = 0;\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 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 // Dispose custom function reference\n if (state.customFnInvokeRef) {\n state.customFnInvokeRef.release();\n }\n\n // Dispose all handles (in reverse order of setup)\n state.handles.playwright?.dispose();\n state.handles.testEnvironment?.dispose();\n state.handles.fs?.dispose();\n state.handles.fetch?.dispose();\n state.handles.crypto?.dispose();\n state.handles.path?.dispose();\n state.handles.timers?.dispose();\n state.handles.encoding?.dispose();\n state.handles.console?.dispose();\n state.handles.core?.dispose();\n\n // Clear module cache\n state.moduleCache.clear();\n state.moduleLoadsInFlight.clear();\n\n // Release context and dispose isolate\n state.context.release();\n state.isolate.dispose();\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"@ricsam/isolate-core\";\nexport type { CoreHandle, SetupCoreOptions } from \"@ricsam/isolate-core\";\n\nexport { setupConsole } from \"@ricsam/isolate-console\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"@ricsam/isolate-console/utils\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"@ricsam/isolate-console\";\n\nexport { setupCrypto } from \"@ricsam/isolate-crypto\";\nexport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\nexport { setupEncoding } from \"@ricsam/isolate-encoding\";\nexport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\n\nexport { setupFetch } from \"@ricsam/isolate-fetch\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n ClientWebSocketCommand,\n} from \"@ricsam/isolate-fetch\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"@ricsam/isolate-fs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"@ricsam/isolate-fs\";\n\nexport { setupPath } from \"@ricsam/isolate-path\";\nexport type { PathHandle, PathOptions } from \"@ricsam/isolate-path\";\n\nexport { setupTimers } from \"@ricsam/isolate-timers\";\nexport type { TimersHandle } from \"@ricsam/isolate-timers\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"@ricsam/isolate-test-environment\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"@ricsam/isolate-test-environment\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"@ricsam/isolate-playwright\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n} from \"@ricsam/isolate-playwright\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "30C3A0A75715847864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -70,6 +70,10 @@ export interface RuntimeFetchHandle {
|
|
|
70
70
|
dispatchClientWebSocketError(socketId: string): void;
|
|
71
71
|
/** Register callback for client WebSocket commands from isolate */
|
|
72
72
|
onClientWebSocketCommand(callback: (cmd: ClientWebSocketCommand) => void): () => void;
|
|
73
|
+
/** Register callback for events emitted from isolate code */
|
|
74
|
+
onEvent(callback: (event: string, payload: unknown) => void): () => void;
|
|
75
|
+
/** Dispatch an event into the isolate (calls __on listeners) */
|
|
76
|
+
dispatchEvent(event: string, payload: unknown): void;
|
|
73
77
|
}
|
|
74
78
|
/**
|
|
75
79
|
* Runtime timers handle - provides access to timer operations.
|