@ricsam/isolate-runtime 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -122,7 +122,6 @@ interface RuntimeOptions {
122
122
  interface PlaywrightOptions {
123
123
  page: import("playwright").Page;
124
124
  timeout?: number;
125
- baseUrl?: string;
126
125
  /** Print browser console logs to stdout */
127
126
  console?: boolean;
128
127
  /** Browser console log callback (from the page, not sandbox) */
@@ -324,7 +323,6 @@ const page = await browser.newPage();
324
323
  const runtime = await createRuntime({
325
324
  playwright: {
326
325
  page,
327
- baseUrl: "https://example.com",
328
326
  console: true, // Print browser console to stdout
329
327
  },
330
328
  });
@@ -359,7 +357,6 @@ const runtime = await createRuntime({
359
357
  testEnvironment: true, // Provides describe, it, expect
360
358
  playwright: {
361
359
  page,
362
- baseUrl: "https://example.com",
363
360
  onBrowserConsoleLog: (entry) => console.log("[browser]", entry.stdout),
364
361
  },
365
362
  });
@@ -575,7 +575,6 @@ async function createRuntime(options) {
575
575
  state.handles.playwright = await import_isolate_playwright.setupPlaywright(context, {
576
576
  page: opts.playwright.page,
577
577
  timeout: opts.playwright.timeout,
578
- baseUrl: opts.playwright.baseUrl,
579
578
  console: opts.playwright.console && !opts.console?.onEntry,
580
579
  onEvent: eventCallback
581
580
  });
@@ -754,4 +753,4 @@ async function createRuntime(options) {
754
753
  };
755
754
  }
756
755
 
757
- //# debugId=9F9E12C10DE91D2864756E2164756E21
756
+ //# debugId=230C5D24BE3157C264756E2164756E21
@@ -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} 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 { setupPlaywright } 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} 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 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} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types with local aliases for backward compatibility\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\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\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}\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\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 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}\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 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/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\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 const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\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 const result =\n def.type === \"async\" ? await def.fn(...args) : def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\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 const marshalledValue = await marshalValue(result.value);\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 const marshalledValue = await marshalValue(result?.value);\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 const marshalledValue = await marshalValue(result?.value);\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 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 // Check cache first by specifier (fast path - avoids calling module loader)\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 - now always returns { code, resolveDir }\n const { code, resolveDir } = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\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 module code (strip types)\n const transformed = await transformModuleCode(code, specifier);\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 // Cache by both specifier (fast lookup) and specifier:hash (content-based invalidation)\n state.moduleCache.set(specifier, mod);\n state.moduleCache.set(cacheKey, mod);\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 (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\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 moduleToFilename: new Map(),\n sourceMaps: new Map(),\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)\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 state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>\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 (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\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 state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\n timeout: opts.playwright.timeout,\n baseUrl: opts.playwright.baseUrl,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n });\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 };\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 // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\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.page 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\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 } 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 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} 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} 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\nexport * from \"./internal.cjs\";\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} 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 { setupPlaywright } 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} 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 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} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types with local aliases for backward compatibility\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\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\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}\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\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 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}\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 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/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\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 const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\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 const result =\n def.type === \"async\" ? await def.fn(...args) : def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\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 const marshalledValue = await marshalValue(result.value);\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 const marshalledValue = await marshalValue(result?.value);\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 const marshalledValue = await marshalValue(result?.value);\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 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 // Check cache first by specifier (fast path - avoids calling module loader)\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 - now always returns { code, resolveDir }\n const { code, resolveDir } = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\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 module code (strip types)\n const transformed = await transformModuleCode(code, specifier);\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 // Cache by both specifier (fast lookup) and specifier:hash (content-based invalidation)\n state.moduleCache.set(specifier, mod);\n state.moduleCache.set(cacheKey, mod);\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 (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\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 moduleToFilename: new Map(),\n sourceMaps: new Map(),\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)\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 state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>\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 (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\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 state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\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\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 };\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 // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\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.page 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\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 } 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 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} 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} 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\nexport * from \"./internal.cjs\";\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "9F9E12C10DE91D2864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "230C5D24BE3157C264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-runtime",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "type": "commonjs"
5
5
  }
@@ -519,7 +519,6 @@ async function createRuntime(options) {
519
519
  state.handles.playwright = await setupPlaywright(context, {
520
520
  page: opts.playwright.page,
521
521
  timeout: opts.playwright.timeout,
522
- baseUrl: opts.playwright.baseUrl,
523
522
  console: opts.playwright.console && !opts.console?.onEntry,
524
523
  onEvent: eventCallback
525
524
  });
@@ -718,4 +717,4 @@ export {
718
717
  createNodeFileSystemHandler
719
718
  };
720
719
 
721
- //# debugId=F9EB26C7D1E4C4FF64756E2164756E21
720
+ //# debugId=5B1C4DA72893C8FA64756E2164756E21
@@ -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} 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 { setupPlaywright } 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} 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 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} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types with local aliases for backward compatibility\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\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\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}\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\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 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}\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 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/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\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 const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\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 const result =\n def.type === \"async\" ? await def.fn(...args) : def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\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 const marshalledValue = await marshalValue(result.value);\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 const marshalledValue = await marshalValue(result?.value);\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 const marshalledValue = await marshalValue(result?.value);\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 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 // Check cache first by specifier (fast path - avoids calling module loader)\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 - now always returns { code, resolveDir }\n const { code, resolveDir } = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\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 module code (strip types)\n const transformed = await transformModuleCode(code, specifier);\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 // Cache by both specifier (fast lookup) and specifier:hash (content-based invalidation)\n state.moduleCache.set(specifier, mod);\n state.moduleCache.set(cacheKey, mod);\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 (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\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 moduleToFilename: new Map(),\n sourceMaps: new Map(),\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)\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 state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>\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 (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\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 state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\n timeout: opts.playwright.timeout,\n baseUrl: opts.playwright.baseUrl,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n });\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 };\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 // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\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.page 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\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 } 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 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} 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} 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\nexport * from \"./internal.mjs\";\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} 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 { setupPlaywright } 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} 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 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} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types with local aliases for backward compatibility\nexport type EvalOptions = ProtocolEvalOptions;\nexport type PlaywrightOptions = ProtocolPlaywrightOptions;\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\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}\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\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 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}\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 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/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\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 const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\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 const result =\n def.type === \"async\" ? await def.fn(...args) : def.fn(...args);\n // Marshal result for isolate (converts JavaScript types to Refs)\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 const marshalledValue = await marshalValue(result.value);\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 const marshalledValue = await marshalValue(result?.value);\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 const marshalledValue = await marshalValue(result?.value);\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 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 // Check cache first by specifier (fast path - avoids calling module loader)\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 - now always returns { code, resolveDir }\n const { code, resolveDir } = await state.moduleLoader(specifier, {\n path: importerPath,\n resolveDir: importerResolveDir,\n });\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 module code (strip types)\n const transformed = await transformModuleCode(code, specifier);\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 // Cache by both specifier (fast lookup) and specifier:hash (content-based invalidation)\n state.moduleCache.set(specifier, mod);\n state.moduleCache.set(cacheKey, mod);\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 (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\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 moduleToFilename: new Map(),\n sourceMaps: new Map(),\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)\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 state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions as CustomFunctions<Record<string, unknown[]>>\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 (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\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 state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\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\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 };\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 // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\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.page 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\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 } 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 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} 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} 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\nexport * from \"./internal.mjs\";\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "F9EB26C7D1E4C4FF64756E2164756E21",
7
+ "mappings": ";AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,mCAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA,cAEE;AAAA,cACA;AAAA,kBACA;AAAA;AAEF;AA+CA;AAAA;AAAA;AAAA;AAyhCA,sBAAS;AAGT,yBAAS;AACT;AAAA;AAAA;AAUA,wBAAS;AAGT,0BAAS;AAGT,uBAAS;AAQT,oBAAS;AAQT,sBAAS;AAGT,wBAAS;AAGT;AAAA,0BACE;AAAA;AAAA;AAAA;AAAA;AAiBF;AAAA,qBACE;AAAA;AAAA;AAAA;AAaF;AA/6BA,IAAM,mBAAmB,IAAI;AAC7B,IAAI,iBAAiB;AAMrB,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuJ7B,eAAe,oBAAoB,CACjC,SACA,iBAC6E;AAAA,EAC7E,MAAM,SAAS,QAAQ;AAAA,EAGvB,MAAM,oBAAoB,IAAI,IAAI,UAChC,OAAO,MAAc,aAAsC;AAAA,IACzD,MAAM,MAAM,gBAAgB;AAAA,IAC5B,IAAI,CAAC,KAAK;AAAA,MACR,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,SAAS,oBAAoB;AAAA,UAC7B,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,UAAU,KAAK,MAAM,QAAQ;AAAA,IACnC,MAAM,OAAO,eAAe,OAAO;AAAA,IACnC,IAAI;AAAA,MACF,MAAM,SACJ,IAAI,SAAS,UAAU,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI;AAAA,MAE/D,MAAM,mBAAmB,MAAM,aAAa,MAAM;AAAA,MAClD,OAAO,KAAK,UAAU,EAAE,IAAI,MAAM,OAAO,iBAAiB,CAAC;AAAA,MAC3D,OAAO,OAAgB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK;AAAA,MAChD,CAAC;AAAA;AAAA,GAGP;AAAA,EAEA,OAAO,QAAQ,qBAAqB,iBAAiB;AAAA,EAGrD,MAAM,eAAe,IAAI,IAAI,UAC3B,OAAO,MAAc,aAAsC;AAAA,IACzD,MAAM,MAAM,gBAAgB;AAAA,IAC5B,IAAI,CAAC,OAAO,IAAI,SAAS,iBAAiB;AAAA,MACxC,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,SAAS,4BAA4B;AAAA,UACrC,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,IAAI;AAAA,MAEF,MAAM,UAAU,KAAK,MAAM,QAAQ;AAAA,MACnC,MAAM,OAAO,eAAe,OAAO;AAAA,MACnC,MAAM,KAAK,IAAI;AAAA,MACf,MAAM,WAAW,GAAG,GAAG,IAAI;AAAA,MAC3B,MAAM,aAAa;AAAA,MACnB,iBAAiB,IAAI,YAAY,EAAE,SAAS,CAAC;AAAA,MAC7C,OAAO,KAAK,UAAU,EAAE,IAAI,MAAM,WAAW,CAAC;AAAA,MAC9C,OAAO,OAAgB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK;AAAA,MAChD,CAAC;AAAA;AAAA,GAGP;AAAA,EAEA,OAAO,QAAQ,gBAAgB,YAAY;AAAA,EAG3C,MAAM,cAAc,IAAI,IAAI,UAC1B,OAAO,eAAwC;AAAA,IAC7C,MAAM,UAAU,iBAAiB,IAAI,UAAU;AAAA,IAC/C,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,SAAS,oBAAoB;AAAA,UAC7B,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,QAAQ,SAAS,KAAK;AAAA,MAC3C,IAAI,OAAO,MAAM;AAAA,QACf,iBAAiB,OAAO,UAAU;AAAA,MACpC;AAAA,MAEA,MAAM,kBAAkB,MAAM,aAAa,OAAO,KAAK;AAAA,MACvD,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,MACD,OAAO,OAAgB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,iBAAiB,OAAO,UAAU;AAAA,MAClC,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK;AAAA,MAChD,CAAC;AAAA;AAAA,GAGP;AAAA,EAEA,OAAO,QAAQ,eAAe,WAAW;AAAA,EAGzC,MAAM,gBAAgB,IAAI,IAAI,UAC5B,OAAO,YAAoB,cAAuC;AAAA,IAChE,MAAM,UAAU,iBAAiB,IAAI,UAAU;AAAA,IAC/C,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO,KAAK,UAAU,EAAE,IAAI,MAAM,MAAM,MAAM,OAAO,UAAU,CAAC;AAAA,IAClE;AAAA,IACA,IAAI;AAAA,MAEF,MAAM,WAAW,YAAY,KAAK,MAAM,SAAS,IAAI;AAAA,MACrD,MAAM,QAAQ,eAAe,QAAQ;AAAA,MACrC,MAAM,SAAS,MAAM,QAAQ,SAAS,SAAS,KAAK;AAAA,MACpD,iBAAiB,OAAO,UAAU;AAAA,MAElC,MAAM,kBAAkB,MAAM,aAAa,QAAQ,KAAK;AAAA,MACxD,OAAO,KAAK,UAAU,EAAE,IAAI,MAAM,MAAM,MAAM,OAAO,gBAAgB,CAAC;AAAA,MACtE,OAAO,OAAgB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,iBAAiB,OAAO,UAAU;AAAA,MAClC,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK;AAAA,MAChD,CAAC;AAAA;AAAA,GAGP;AAAA,EAEA,OAAO,QAAQ,iBAAiB,aAAa;AAAA,EAG7C,MAAM,eAAe,IAAI,IAAI,UAC3B,OAAO,YAAoB,cAAuC;AAAA,IAChE,MAAM,UAAU,iBAAiB,IAAI,UAAU;AAAA,IAC/C,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,SAAS,oBAAoB;AAAA,UAC7B,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,IAAI;AAAA,MACF,MAAM,YAAY,KAAK,MAAM,SAAS;AAAA,MAItC,MAAM,QAAQ,OAAO,OAAO,IAAI,MAAM,UAAU,OAAO,GAAG;AAAA,QACxD,MAAM,UAAU;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA,MACnD,iBAAiB,OAAO,UAAU;AAAA,MAElC,MAAM,kBAAkB,MAAM,aAAa,QAAQ,KAAK;AAAA,MACxD,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,MAAM,QAAQ,QAAQ;AAAA,QACtB,OAAO;AAAA,MACT,CAAC;AAAA,MACD,OAAO,OAAgB;AAAA,MACvB,MAAM,MAAM;AAAA,MACZ,iBAAiB,OAAO,UAAU;AAAA,MAClC,OAAO,KAAK,UAAU;AAAA,QACpB,IAAI;AAAA,QACJ,OAAO,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK;AAAA,MAChD,CAAC;AAAA;AAAA,GAGP;AAAA,EAEA,OAAO,QAAQ,gBAAgB,YAAY;AAAA,EAG3C,QAAQ,SAAS,oBAAoB;AAAA,EAGrC,WAAW,QAAQ,OAAO,KAAK,eAAe,GAAG;AAAA,IAC/C,MAAM,MAAM,gBAAgB;AAAA,IAE5B,IAAI,IAAI,SAAS,SAAS;AAAA,MAExB,QAAQ,SAAS;AAAA,qBACF;AAAA;AAAA;AAAA;AAAA,gBAIL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWT;AAAA,IACH,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAG9B,QAAQ,SAAS;AAAA,qBACF;AAAA;AAAA;AAAA;AAAA,gBAIL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWT;AAAA,IACH,EAAO,SAAI,IAAI,SAAS,iBAAiB;AAAA,MAEvC,QAAQ,SAAS;AAAA,qBACF;AAAA;AAAA,sFAEiE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA2B/E;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,oBAAoB,CAC3B,OACkE;AAAA,EAClE,OAAO,OACL,WACA,aACwB;AAAA,IAExB,MAAM,SAAS,MAAM,YAAY,IAAI,SAAS;AAAA,IAC9C,IAAI;AAAA,MAAQ,OAAO;AAAA,IAEnB,IAAI,CAAC,MAAM,cAAc;AAAA,MACvB,MAAM,IAAI,MACR,+CAA+C,WACjD;AAAA,IACF;AAAA,IAGA,MAAM,eAAe,MAAM,iBAAiB,IAAI,QAAQ,KAAK;AAAA,IAC7D,MAAM,qBAAqB,KAAK,MAAM,QAAQ,YAAY;AAAA,IAG1D,QAAQ,MAAM,eAAe,MAAM,MAAM,aAAa,WAAW;AAAA,MAC/D,MAAM;AAAA,MACN,YAAY;AAAA,IACd,CAAC;AAAA,IAGD,MAAM,OAAO,YAAY,IAAI;AAAA,IAC7B,MAAM,WAAW,GAAG,aAAa;AAAA,IACjC,MAAM,aAAa,MAAM,YAAY,IAAI,QAAQ;AAAA,IACjD,IAAI;AAAA,MAAY,OAAO;AAAA,IAGvB,MAAM,cAAc,MAAM,oBAAoB,MAAM,SAAS;AAAA,IAC7D,IAAI,YAAY,WAAW;AAAA,MACzB,MAAM,WAAW,IAAI,WAAW,YAAY,SAAS;AAAA,IACvD;AAAA,IAGA,MAAM,MAAM,MAAM,MAAM,QAAQ,cAAc,YAAY,MAAM;AAAA,MAC9D,UAAU;AAAA,IACZ,CAAC;AAAA,IAGD,MAAM,eAAe,KAAK,MAAM,KAAK,YAAY,KAAK,MAAM,SAAS,SAAS,CAAC;AAAA,IAC/E,MAAM,iBAAiB,IAAI,KAAK,YAAY;AAAA,IAI5C,MAAM,YAAY,IAAI,WAAW,GAAG;AAAA,IACpC,MAAM,YAAY,IAAI,UAAU,GAAG;AAAA,IAGnC,MAAM,WAAW,qBAAqB,KAAK;AAAA,IAC3C,MAAM,IAAI,YAAY,MAAM,SAAS,QAAQ;AAAA,IAE7C,OAAO;AAAA;AAAA;AAOX,SAAS,oBAAoB,CAAC,UAAwC;AAAA,EACpE,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,SAAS,OAAO,YAAwC;AAAA,MAEtD,OAAO,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAAA;AAAA,EAE5C;AAAA;AAqBF,eAAsB,aAA0E,CAC9F,SACwB;AAAA,EACxB,MAAM,OAAO,WAAW,CAAC;AAAA,EAGzB,MAAM,KAAK,OAAO,WAAW;AAAA,EAG7B,MAAM,UAAU,IAAI,IAAI,QAAQ;AAAA,IAC9B,aAAa,KAAK;AAAA,EACpB,CAAC;AAAA,EACD,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,EAG5C,MAAM,QAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV,aAAa,IAAI;AAAA,IACjB,kBAAkB,IAAI;AAAA,IACtB,YAAY,IAAI;AAAA,IAChB,cAAc,KAAK;AAAA,IACnB,iBAAiB,KAAK;AAAA,EACxB;AAAA,EAIA,MAAM,QAAQ,OAAO,MAAM,UAAU,OAAO;AAAA,EAG5C,MAAM,QAAQ,UAAU,MAAM,aAAa,SAAS,KAAK,OAAO;AAAA,EAGhE,MAAM,QAAQ,WAAW,MAAM,cAAc,OAAO;AAAA,EAGpD,MAAM,QAAQ,SAAS,MAAM,YAAY,OAAO;AAAA,EAGhD,MAAM,QAAQ,OAAO,MAAM,UAAU,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,EAG/D,MAAM,QAAQ,SAAS,MAAM,YAAY,OAAO;AAAA,EAGhD,MAAM,QAAQ,QAAQ,MAAM,WAC1B,SACA,qBAAqB,KAAK,KAAK,CACjC;AAAA,EAGA,IAAI,KAAK,IAAI;AAAA,IACX,MAAM,QAAQ,KAAK,MAAM,QAAQ,SAAS,KAAK,EAAE;AAAA,EACnD;AAAA,EAGA,IAAI,KAAK,iBAAiB;AAAA,IACxB,MAAM,oBAAoB,MAAM,qBAC9B,SACA,KAAK,eACP;AAAA,EACF;AAAA,EAGA,IAAI,KAAK,iBAAiB;AAAA,IACxB,MAAM,iBACJ,OAAO,KAAK,oBAAoB,WAC5B,KAAK,kBACL;AAAA,IACN,MAAM,QAAQ,kBAAkB,MAAM,qBACpC,SACA,cACF;AAAA,EACF;AAAA,EAGA,IAAI,KAAK,YAAY;AAAA,IAGnB,IAAI,gBAAgB,KAAK,WAAW;AAAA,IAEpC,IAAI,KAAK,WAAW,WAAW,KAAK,SAAS,SAAS;AAAA,MACpD,MAAM,mBAAmB;AAAA,MACzB,MAAM,iBAAiB,KAAK,QAAQ;AAAA,MACpC,gBAAgB,CAAC,UAAU;AAAA,QAEzB,IAAI,kBAAkB;AAAA,UACpB,iBAAiB,KAAK;AAAA,QACxB;AAAA,QAEA,IAAI,MAAM,SAAS,qBAAqB;AAAA,UACtC,eAAe;AAAA,YACb,MAAM;AAAA,YACN,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,WAAW,MAAM;AAAA,UACnB,CAAC;AAAA,QACH;AAAA;AAAA,IAEJ;AAAA,IAEA,MAAM,QAAQ,aAAa,MAAM,gBAAgB,SAAS;AAAA,MACxD,MAAM,KAAK,WAAW;AAAA,MACtB,SAAS,KAAK,WAAW;AAAA,MAEzB,SAAS,KAAK,WAAW,WAAW,CAAC,KAAK,SAAS;AAAA,MACnD,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAGA,MAAM,cAAkC;AAAA,SAChC,gBAAe,CACnB,SACA,UACmB;AAAA,MACnB,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,QAAQ,MAAM,gBAAgB,SAAS,QAAO;AAAA;AAAA,IAE7D,iBAAiB,GAAG;AAAA,MAClB,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,QAAQ,MAAM,kBAAkB;AAAA;AAAA,IAE/C,qBAAqB,CAAC,cAAsB;AAAA,MAC1C,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,MAAM,QAAQ,MAAM,sBAAsB,YAAY;AAAA;AAAA,IAExD,wBAAwB,CACtB,cACA,SACA;AAAA,MACA,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,MAAM,QAAQ,MAAM,yBAAyB,cAAc,OAAO;AAAA;AAAA,IAEpE,sBAAsB,CAAC,cAAsB,MAAc,QAAgB;AAAA,MACzE,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,MAAM,QAAQ,MAAM,uBAAuB,cAAc,MAAM,MAAM;AAAA;AAAA,IAEvE,sBAAsB,CAAC,cAAsB,OAAc;AAAA,MACzD,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,MAAM,QAAQ,MAAM,uBAAuB,cAAc,KAAK;AAAA;AAAA,IAEhE,kBAAkB,CAAC,UAA2C;AAAA,MAC5D,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,QAAQ,MAAM,mBAAmB,QAAQ;AAAA;AAAA,IAExD,eAAe,GAAG;AAAA,MAChB,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,QAAQ,MAAM,gBAAgB;AAAA;AAAA,IAE7C,oBAAoB,GAAG;AAAA,MACrB,IAAI,CAAC,MAAM,QAAQ,OAAO;AAAA,QACxB,MAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,QAAQ,MAAM,qBAAqB;AAAA;AAAA,EAEpD;AAAA,EAGA,MAAM,eAAoC;AAAA,IACxC,QAAQ,GAAG;AAAA,MACT,MAAM,QAAQ,QAAQ,SAAS;AAAA;AAAA,EAEnC;AAAA,EAGA,MAAM,gBAAsC;AAAA,IAC1C,KAAK,GAAG;AAAA,MACN,MAAM,QAAQ,SAAS,MAAM;AAAA;AAAA,IAE/B,SAAS,GAAG;AAAA,MACV,OAAO,MAAM,QAAQ,SAAS,UAAU,KAAK,IAAI;AAAA;AAAA,IAEnD,WAAW,GAAG;AAAA,MACZ,OAAO,MAAM,QAAQ,SAAS,YAAY,KAAK,IAAI;AAAA;AAAA,IAErD,aAAa,GAAG;AAAA,MACd,OAAO,MAAM,QAAQ,SAAS,cAAc,KAAK;AAAA;AAAA,EAErD;AAAA,EAGA,MAAM,wBAAsD;AAAA,SACpD,SAAQ,CAAC,UAAwC;AAAA,MACrD,IAAI,CAAC,MAAM,QAAQ,iBAAiB;AAAA,QAClC,MAAM,IAAI,MACR,mFACF;AAAA,MACF;AAAA,MAEA,OAAO,kBAAkB,MAAM,OAAO;AAAA;AAAA,IAExC,QAAQ,GAAY;AAAA,MAClB,IAAI,CAAC,MAAM,QAAQ,iBAAiB;AAAA,QAClC,MAAM,IAAI,MACR,mFACF;AAAA,MACF;AAAA,MACA,OAAO,kBAAkB,MAAM,OAAO;AAAA;AAAA,IAExC,YAAY,GAAW;AAAA,MACrB,IAAI,CAAC,MAAM,QAAQ,iBAAiB;AAAA,QAClC,MAAM,IAAI,MACR,mFACF;AAAA,MACF;AAAA,MACA,OAAO,sBAAsB,MAAM,OAAO;AAAA;AAAA,IAE5C,KAAK,GAAG;AAAA,MACN,MAAM,QAAQ,iBAAiB,QAAQ;AAAA;AAAA,EAE3C;AAAA,EAGA,MAAM,mBAA4C;AAAA,IAChD,gBAAgB,GAAkB;AAAA,MAChC,IAAI,CAAC,MAAM,QAAQ,YAAY;AAAA,QAC7B,MAAM,IAAI,MACR,8EACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,oBAAoB,MAAM,QAAQ,WAAW,sBAAsB;AAAA,QACnE,iBAAiB,MAAM,QAAQ,WAAW,mBAAmB;AAAA,QAC7D,kBAAkB,MAAM,QAAQ,WAAW,oBAAoB;AAAA,MACjE;AAAA;AAAA,IAEF,kBAAkB,GAAG;AAAA,MACnB,MAAM,QAAQ,YAAY,eAAe;AAAA;AAAA,EAE7C;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IAGA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,YAAY;AAAA,SAEN,KAAI,CACR,MACA,mBACe;AAAA,MAEf,MAAM,WACJ,OAAO,sBAAsB,WACzB,EAAE,UAAU,kBAAkB,IAC9B;AAAA,MAGN,MAAM,WAAW,uBAAuB,UAAS,QAAQ;AAAA,MAEzD,IAAI;AAAA,QAEF,MAAM,cAAc,MAAM,mBAAmB,MAAM,QAAQ;AAAA,QAC3D,IAAI,YAAY,WAAW;AAAA,UACzB,MAAM,WAAW,IAAI,UAAU,YAAY,SAAS;AAAA,QACtD;AAAA,QAGA,MAAM,MAAM,MAAM,MAAM,QAAQ,cAAc,YAAY,MAAM;AAAA,UAC9D;AAAA,QACF,CAAC;AAAA,QAGD,MAAM,iBAAiB,IAAI,KAAK,QAAQ;AAAA,QAGxC,MAAM,WAAW,qBAAqB,KAAK;AAAA,QAC3C,MAAM,IAAI,YAAY,MAAM,SAAS,QAAQ;AAAA,QAG7C,MAAM,IAAI,SAAS;AAAA,QAGnB,MAAM,KAAK,IAAI;AAAA,QACf,MAAM,SAAS,MAAM,GAAG,IAAI,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,QAC1D,IAAI;AAAA,UACF,MAAM,OAAO,MAAM,WAAW,CAAC,GAAG;AAAA,YAChC,QAAQ,EAAE,SAAS,KAAK;AAAA,eACpB,UAAS,iBACT,EAAE,SAAS,SAAQ,eAAe,IAClC,CAAC;AAAA,UACP,CAAC;AAAA,kBACD;AAAA,UACA,OAAO,QAAQ;AAAA;AAAA,QAEjB,OAAO,KAAK;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,IAAI,MAAM,SAAS,MAAM,WAAW,OAAO,GAAG;AAAA,UAC5C,MAAM,QAAQ,cAAc,MAAM,OAAO,MAAM,UAAU;AAAA,QAC3D;AAAA,QACA,MAAM;AAAA;AAAA;AAAA,SAIJ,QAAO,GAAkB;AAAA,MAE7B,IAAI,MAAM,mBAAmB;AAAA,QAC3B,MAAM,kBAAkB,QAAQ;AAAA,MAClC;AAAA,MAGA,MAAM,QAAQ,YAAY,QAAQ;AAAA,MAClC,MAAM,QAAQ,iBAAiB,QAAQ;AAAA,MACvC,MAAM,QAAQ,IAAI,QAAQ;AAAA,MAC1B,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAC7B,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MAC9B,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAC5B,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MAC9B,MAAM,QAAQ,UAAU,QAAQ;AAAA,MAChC,MAAM,QAAQ,SAAS,QAAQ;AAAA,MAC/B,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAG5B,MAAM,YAAY,MAAM;AAAA,MAGxB,MAAM,QAAQ,QAAQ;AAAA,MACtB,MAAM,QAAQ,QAAQ;AAAA;AAAA,EAE1B;AAAA;",
8
+ "debugId": "5B1C4DA72893C8FA64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-runtime",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "type": "module"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-runtime",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {