@ricsam/isolate-daemon 0.1.5 → 0.1.6
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 +27 -0
- package/dist/cjs/callback-fs-handler.cjs +68 -37
- package/dist/cjs/callback-fs-handler.cjs.map +3 -3
- package/dist/cjs/connection.cjs +255 -69
- package/dist/cjs/connection.cjs.map +3 -3
- package/dist/cjs/index.cjs +4 -2
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/callback-fs-handler.mjs +68 -37
- package/dist/mjs/callback-fs-handler.mjs.map +3 -3
- package/dist/mjs/connection.mjs +255 -70
- package/dist/mjs/connection.mjs.map +3 -3
- package/dist/mjs/index.mjs +4 -2
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/callback-fs-handler.d.ts +3 -3
- package/dist/types/types.d.ts +37 -1
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/connection.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Connection handling for the isolate daemon.\n */\n\nimport type { Socket } from \"node:net\";\nimport { randomUUID } from \"node:crypto\";\nimport ivm from \"isolated-vm\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n ErrorCode,\n STREAM_THRESHOLD,\n STREAM_CHUNK_SIZE,\n STREAM_DEFAULT_CREDIT,\n type Message,\n type ResponseOk,\n type ResponseError,\n type CreateRuntimeRequest,\n type DisposeRuntimeRequest,\n type EvalRequest,\n type DispatchRequestRequest,\n type CallbackResponseMsg,\n type CallbackInvoke,\n type RunTestsRequest,\n type HasTestsRequest,\n type GetTestCountRequest,\n type RunPlaywrightTestsRequest,\n type ResetPlaywrightTestsRequest,\n type GetCollectedDataRequest,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\n type FsCallbackRegistrations,\n type CustomFunctionRegistrations,\n type CallbackRegistration,\n type PlaywrightOperation,\n type PlaywrightResult,\n type WsOpenRequest,\n type WsMessageRequest,\n type WsCloseRequest,\n type FetchGetUpgradeRequestRequest,\n type FetchHasServeHandlerRequest,\n type FetchHasActiveConnectionsRequest,\n type FetchWsErrorRequest,\n type TimersClearAllRequest,\n type ConsoleResetRequest,\n type ConsoleGetTimersRequest,\n type ConsoleGetCountersRequest,\n type ConsoleGetGroupDepthRequest,\n type WsCommandMessage,\n type ResponseStreamStart,\n type ResponseStreamChunk,\n type ResponseStreamEnd,\n type StreamPush,\n type StreamPull,\n type StreamClose,\n type StreamError,\n encodeValue,\n decodeValue,\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n type UnmarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createCallbackFileSystemHandler } from \"./callback-fs-handler.mjs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type BrowserConsoleLogEntry,\n type NetworkRequestInfo,\n type NetworkResponseInfo,\n} from \"@ricsam/isolate-playwright\";\nimport {\n createInternalRuntime,\n type InternalRuntimeHandle,\n} from \"@ricsam/isolate-runtime\";\nimport type {\n DaemonState,\n ConnectionState,\n IsolateInstance,\n PendingRequest,\n} from \"./types.mjs\";\n\n/**\n * Handle a new client connection.\n */\nexport function handleConnection(socket: Socket, state: DaemonState): void {\n const connection: ConnectionState = {\n socket,\n isolates: new Set(),\n pendingRequests: new Map(),\n pendingCallbacks: new Map(),\n nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n activeStreams: new Map(),\n streamReceivers: new Map(),\n };\n\n state.connections.set(socket, connection);\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, connection, state).catch((err) => {\n console.error(\"Error handling message:\", err);\n });\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n socket.destroy();\n }\n });\n\n socket.on(\"close\", () => {\n // Dispose all isolates owned by this connection\n for (const isolateId of connection.isolates) {\n const instance = state.isolates.get(isolateId);\n if (instance) {\n try {\n // Clean up Playwright resources if present\n if (instance.playwrightHandle) {\n instance.playwrightHandle.dispose();\n }\n instance.runtime.dispose();\n } catch {\n // Ignore disposal errors\n }\n state.isolates.delete(isolateId);\n }\n }\n\n // Reject pending callbacks\n for (const [, pending] of connection.pendingCallbacks) {\n pending.reject(new Error(\"Connection closed\"));\n }\n\n state.connections.delete(socket);\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n}\n\n/**\n * Send a message to a client.\n */\nfunction sendMessage(socket: Socket, message: Message): void {\n const frame = buildFrame(message);\n socket.write(frame);\n}\n\n/**\n * Send an error response.\n */\nfunction sendError(\n socket: Socket,\n requestId: number,\n code: ErrorCode,\n message: string,\n details?: { name: string; stack?: string }\n): void {\n const response: ResponseError = {\n type: MessageType.RESPONSE_ERROR,\n requestId,\n code,\n message,\n details,\n };\n sendMessage(socket, response);\n}\n\n/**\n * Send a success response.\n */\nfunction sendOk(socket: Socket, requestId: number, data?: unknown): void {\n const response: ResponseOk = {\n type: MessageType.RESPONSE_OK,\n requestId,\n data,\n };\n sendMessage(socket, response);\n}\n\n/**\n * Handle an incoming message.\n */\nasync function handleMessage(\n message: Message,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n state.stats.totalRequestsProcessed++;\n\n switch (message.type) {\n case MessageType.CREATE_RUNTIME:\n await handleCreateRuntime(\n message as CreateRuntimeRequest,\n connection,\n state\n );\n break;\n\n case MessageType.DISPOSE_RUNTIME:\n await handleDisposeRuntime(\n message as DisposeRuntimeRequest,\n connection,\n state\n );\n break;\n\n case MessageType.EVAL:\n await handleEval(message as EvalRequest, connection, state);\n break;\n\n case MessageType.DISPATCH_REQUEST:\n await handleDispatchRequest(\n message as DispatchRequestRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CALLBACK_RESPONSE:\n handleCallbackResponse(message as CallbackResponseMsg, connection);\n break;\n\n // WebSocket operations\n case MessageType.WS_OPEN:\n await handleWsOpen(message as WsOpenRequest, connection, state);\n break;\n\n case MessageType.WS_MESSAGE:\n await handleWsMessage(message as WsMessageRequest, connection, state);\n break;\n\n case MessageType.WS_CLOSE:\n await handleWsClose(message as WsCloseRequest, connection, state);\n break;\n\n // Handle operations\n case MessageType.FETCH_GET_UPGRADE_REQUEST:\n await handleFetchGetUpgradeRequest(\n message as FetchGetUpgradeRequestRequest,\n connection,\n state\n );\n break;\n\n case MessageType.FETCH_HAS_SERVE_HANDLER:\n await handleFetchHasServeHandler(\n message as FetchHasServeHandlerRequest,\n connection,\n state\n );\n break;\n\n case MessageType.FETCH_HAS_ACTIVE_CONNECTIONS:\n await handleFetchHasActiveConnections(\n message as FetchHasActiveConnectionsRequest,\n connection,\n state\n );\n break;\n\n case MessageType.FETCH_WS_ERROR:\n await handleFetchWsError(message as FetchWsErrorRequest, connection, state);\n break;\n\n case MessageType.TIMERS_CLEAR_ALL:\n await handleTimersClearAll(\n message as TimersClearAllRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CONSOLE_RESET:\n await handleConsoleReset(message as ConsoleResetRequest, connection, state);\n break;\n\n case MessageType.CONSOLE_GET_TIMERS:\n await handleConsoleGetTimers(\n message as ConsoleGetTimersRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CONSOLE_GET_COUNTERS:\n await handleConsoleGetCounters(\n message as ConsoleGetCountersRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CONSOLE_GET_GROUP_DEPTH:\n await handleConsoleGetGroupDepth(\n message as ConsoleGetGroupDepthRequest,\n connection,\n state\n );\n break;\n\n case MessageType.RUN_TESTS:\n await handleRunTests(message as RunTestsRequest, connection, state);\n break;\n\n case MessageType.RESET_TEST_ENV:\n await handleResetTestEnv(\n message as ResetTestEnvRequest,\n connection,\n state\n );\n break;\n\n case MessageType.HAS_TESTS:\n await handleHasTests(message as HasTestsRequest, connection, state);\n break;\n\n case MessageType.GET_TEST_COUNT:\n await handleGetTestCount(\n message as GetTestCountRequest,\n connection,\n state\n );\n break;\n\n case MessageType.RUN_PLAYWRIGHT_TESTS:\n await handleRunPlaywrightTests(\n message as RunPlaywrightTestsRequest,\n connection,\n state\n );\n break;\n\n case MessageType.RESET_PLAYWRIGHT_TESTS:\n await handleResetPlaywrightTests(\n message as ResetPlaywrightTestsRequest,\n connection,\n state\n );\n break;\n\n case MessageType.GET_COLLECTED_DATA:\n await handleGetCollectedData(\n message as GetCollectedDataRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CLEAR_COLLECTED_DATA:\n await handleClearCollectedData(\n message as ClearCollectedDataRequest,\n connection,\n state\n );\n break;\n\n case MessageType.PING:\n sendMessage(connection.socket, { type: MessageType.PONG });\n break;\n\n // Stream operations (for request body streaming)\n case MessageType.STREAM_PUSH:\n handleStreamPush(message as StreamPush, connection);\n break;\n\n case MessageType.STREAM_PULL:\n handleStreamPull(message as StreamPull, connection);\n break;\n\n case MessageType.STREAM_CLOSE:\n handleStreamClose(message as StreamClose, connection);\n break;\n\n case MessageType.STREAM_ERROR:\n handleStreamError(message as StreamError, connection);\n break;\n\n default:\n sendError(\n connection.socket,\n (message as { requestId?: number }).requestId ?? 0,\n ErrorCode.UNKNOWN_MESSAGE_TYPE,\n `Unknown message type: ${message.type}`\n );\n }\n}\n\n/**\n * Handle CREATE_RUNTIME message.\n */\nasync function handleCreateRuntime(\n message: CreateRuntimeRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n // Check limits\n if (state.isolates.size >= state.options.maxIsolates) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_MEMORY_LIMIT,\n `Maximum isolates (${state.options.maxIsolates}) reached`\n );\n return;\n }\n\n try {\n const isolateId = randomUUID();\n\n // Create bridged callbacks that invoke the client\n const consoleCallbacks = message.options.callbacks?.console;\n const fetchCallback = message.options.callbacks?.fetch;\n const fsCallbacks = message.options.callbacks?.fs;\n const moduleLoaderCallback = message.options.callbacks?.moduleLoader;\n const customCallbacks = message.options.callbacks?.custom;\n\n // Track pending callbacks so eval can wait for them\n const pendingCallbacks: Promise<unknown>[] = [];\n\n const runtime = await createInternalRuntime({\n memoryLimitMB: message.options.memoryLimitMB ?? state.options.defaultMemoryLimitMB,\n cwd: message.options.cwd,\n console: consoleCallbacks?.onEntry\n ? {\n onEntry: (entry) => {\n // Track this callback so eval waits for it to complete\n const promise = invokeClientCallback(\n connection,\n consoleCallbacks.onEntry!.callbackId,\n [entry]\n ).catch(() => {}); // Ignore errors, just track completion\n pendingCallbacks.push(promise);\n },\n }\n : undefined,\n fetch: fetchCallback\n ? {\n onFetch: async (request) => {\n const serialized = await serializeRequest(request);\n const result = await invokeClientCallback(\n connection,\n fetchCallback.callbackId,\n [serialized]\n );\n return deserializeResponse(result as SerializedResponseData);\n },\n }\n : undefined,\n fs: fsCallbacks\n ? {\n getDirectory: async (path: string) => {\n return createCallbackFileSystemHandler({\n connection,\n callbacks: fsCallbacks,\n invokeClientCallback,\n basePath: path,\n });\n },\n }\n : undefined,\n });\n\n const instance: IsolateInstance = {\n isolateId,\n runtime,\n ownerConnection: connection.socket,\n callbacks: new Map(),\n createdAt: Date.now(),\n lastActivity: Date.now(),\n pendingCallbacks,\n // Initialize registries for returned callbacks/promises/iterators\n returnedCallbacks: new Map(),\n returnedPromises: new Map(),\n returnedIterators: new Map(),\n // Start at 1,000,000 to avoid conflicts with client callback IDs\n nextLocalCallbackId: 1_000_000,\n };\n\n // Setup module loader\n if (moduleLoaderCallback) {\n instance.moduleLoaderCallbackId = moduleLoaderCallback.callbackId;\n instance.moduleCache = new Map();\n }\n\n // Setup custom functions as globals in the isolate\n if (customCallbacks) {\n await setupCustomFunctions(runtime.context, customCallbacks, connection, instance);\n }\n\n // Store callback registrations\n if (consoleCallbacks?.onEntry) {\n instance.callbacks.set(consoleCallbacks.onEntry.callbackId, {\n ...consoleCallbacks.onEntry,\n name: \"onEntry\",\n });\n }\n if (fetchCallback) {\n instance.callbacks.set(fetchCallback.callbackId, fetchCallback);\n }\n if (fsCallbacks) {\n for (const [name, reg] of Object.entries(fsCallbacks)) {\n if (reg) {\n instance.callbacks.set(reg.callbackId, { ...reg, name });\n }\n }\n }\n if (moduleLoaderCallback) {\n instance.callbacks.set(moduleLoaderCallback.callbackId, moduleLoaderCallback);\n }\n if (customCallbacks) {\n for (const [name, reg] of Object.entries(customCallbacks)) {\n if (reg) {\n instance.callbacks.set(reg.callbackId, { ...reg, name });\n }\n }\n }\n\n // Setup test environment if requested\n if (message.options.testEnvironment) {\n const testEnvOption = message.options.testEnvironment;\n const testEnvOptions = typeof testEnvOption === \"object\" ? testEnvOption : undefined;\n\n // Create event callback if provided\n const onEventCallback = testEnvOptions?.callbacks?.onEvent;\n\n await setupTestEnvironment(runtime.context, {\n onEvent: onEventCallback\n ? (event) => {\n // Forward event to client callback\n const promise = invokeClientCallback(\n connection,\n onEventCallback.callbackId,\n [JSON.stringify(event)]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n }\n : undefined,\n testTimeout: testEnvOptions?.testTimeout,\n });\n\n instance.testEnvironmentEnabled = true;\n\n // Store callback registration\n if (onEventCallback) {\n instance.callbacks.set(onEventCallback.callbackId, {\n ...onEventCallback,\n name: \"testEnvironment.onEvent\",\n });\n }\n }\n\n // Setup playwright if callbacks are provided (client owns the browser)\n const playwrightCallbacks = message.options.callbacks?.playwright;\n if (playwrightCallbacks) {\n // Create handler that invokes client callback\n const handler: PlaywrightCallback = async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n const resultJson = await invokeClientCallback(\n connection,\n playwrightCallbacks.handlerCallbackId,\n [JSON.stringify(op)]\n );\n return JSON.parse(resultJson as string) as PlaywrightResult;\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n\n instance.playwrightHandle = await setupPlaywright(runtime.context, {\n handler,\n // If console is true, browser logs are printed to stdout\n console: playwrightCallbacks.console,\n // Unified event callback\n onEvent: (event) => {\n // Route events to appropriate client callbacks\n if (event.type === \"browserConsoleLog\" && playwrightCallbacks.onBrowserConsoleLogCallbackId) {\n const promise = invokeClientCallback(\n connection,\n playwrightCallbacks.onBrowserConsoleLogCallbackId,\n [{ level: event.level, args: event.args, timestamp: event.timestamp }]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n } else if (event.type === \"networkRequest\" && playwrightCallbacks.onNetworkRequestCallbackId) {\n const promise = invokeClientCallback(\n connection,\n playwrightCallbacks.onNetworkRequestCallbackId,\n [event]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n } else if (event.type === \"networkResponse\" && playwrightCallbacks.onNetworkResponseCallbackId) {\n const promise = invokeClientCallback(\n connection,\n playwrightCallbacks.onNetworkResponseCallbackId,\n [event]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n }\n },\n });\n }\n\n state.isolates.set(isolateId, instance);\n connection.isolates.add(isolateId);\n state.stats.totalIsolatesCreated++;\n\n // Forward WebSocket commands from isolate to client\n instance.runtime.fetch.onWebSocketCommand((cmd) => {\n // Convert ArrayBuffer to Uint8Array if needed for protocol\n let data: string | Uint8Array | undefined;\n if (cmd.data instanceof ArrayBuffer) {\n data = new Uint8Array(cmd.data);\n } else {\n data = cmd.data as string | undefined;\n }\n const wsCommandMsg: WsCommandMessage = {\n type: MessageType.WS_COMMAND,\n isolateId,\n command: {\n type: cmd.type,\n connectionId: cmd.connectionId,\n data,\n code: cmd.code,\n reason: cmd.reason,\n },\n };\n sendMessage(connection.socket, wsCommandMsg);\n });\n\n sendOk(connection.socket, message.requestId, { isolateId });\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle DISPOSE_RUNTIME message.\n */\nasync function handleDisposeRuntime(\n message: DisposeRuntimeRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (instance.ownerConnection !== connection.socket) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not owned by this connection`\n );\n return;\n }\n\n try {\n // Clean up Playwright resources if present\n if (instance.playwrightHandle) {\n instance.playwrightHandle.dispose();\n }\n\n instance.runtime.dispose();\n state.isolates.delete(message.isolateId);\n connection.isolates.delete(message.isolateId);\n\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle EVAL message.\n */\nasync function handleEval(\n message: EvalRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Always use module mode - supports top-level await and ES module syntax\n const mod = await instance.runtime.isolate.compileModule(message.code, {\n filename: message.filename ?? \"<eval>\",\n });\n\n // Instantiate with module resolver if available\n if (instance.moduleLoaderCallbackId) {\n const resolver = createModuleResolver(instance, connection);\n await mod.instantiate(instance.runtime.context, resolver);\n } else {\n // No module loader - instantiate with a resolver that always throws\n await mod.instantiate(instance.runtime.context, (specifier) => {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n });\n }\n\n // Evaluate the module with optional timeout\n const timeout = message.maxExecutionMs;\n await mod.evaluate(timeout ? { timeout } : undefined);\n\n // Wait for all pending callbacks (e.g., console.log) to complete\n // This ensures the client receives all callbacks before eval resolves\n await Promise.all(instance.pendingCallbacks);\n instance.pendingCallbacks.length = 0; // Clear for next eval\n\n // Return undefined for module evaluation\n sendOk(connection.socket, message.requestId, { value: undefined });\n } catch (err) {\n const error = err as Error;\n // Check if this is a timeout error from isolated-vm\n const isTimeoutError = error.message?.includes('Script execution timed out');\n sendError(\n connection.socket,\n message.requestId,\n isTimeoutError ? ErrorCode.ISOLATE_TIMEOUT : ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle DISPATCH_REQUEST message.\n */\nasync function handleDispatchRequest(\n message: DispatchRequestRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Handle request body (inline or streamed)\n let requestBody: BodyInit | null = null;\n\n if (message.request.bodyStreamId !== undefined) {\n // Streaming body - wait for all chunks to arrive\n requestBody = await receiveStreamedBody(connection, message.request.bodyStreamId) as BodyInit;\n } else if (message.request.body) {\n requestBody = message.request.body as unknown as BodyInit;\n }\n\n // Deserialize the request\n const request = new Request(message.request.url, {\n method: message.request.method,\n headers: message.request.headers,\n body: requestBody,\n });\n\n // Dispatch to isolate\n const response = await instance.runtime.fetch.dispatchRequest(request);\n\n // Check response size before serializing\n const contentLength = response.headers.get(\"content-length\");\n const knownSize = contentLength ? parseInt(contentLength, 10) : null;\n\n if (knownSize !== null && knownSize > STREAM_THRESHOLD) {\n // Large response - stream it\n await sendStreamedResponse(connection, message.requestId, response);\n } else {\n // Try inline serialization\n const clonedResponse = response.clone();\n try {\n const serialized = await serializeResponse(response);\n\n if (serialized.body && serialized.body.length > STREAM_THRESHOLD) {\n // Ended up being large - stream the clone\n await sendStreamedResponse(connection, message.requestId, clonedResponse);\n } else {\n sendOk(connection.socket, message.requestId, { response: serialized });\n }\n } catch {\n // Likely too large - stream instead\n await sendStreamedResponse(connection, message.requestId, clonedResponse);\n }\n }\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Receive a streamed body from the client.\n * Sets up a receiver and waits for all chunks to arrive.\n */\nfunction receiveStreamedBody(\n connection: ConnectionState,\n streamId: number\n): Promise<Uint8Array> {\n return new Promise((resolve, reject) => {\n const receiver: import(\"./types.mjs\").StreamReceiver = {\n streamId,\n requestId: 0,\n chunks: [],\n totalBytes: 0,\n resolve,\n reject,\n };\n connection.streamReceivers.set(streamId, receiver);\n\n // Send initial credit to allow client to start sending\n sendMessage(connection.socket, {\n type: MessageType.STREAM_PULL,\n streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\n });\n}\n\n// ============================================================================\n// WebSocket Operation Handlers\n// ============================================================================\n\n/**\n * Handle WS_OPEN message.\n */\nasync function handleWsOpen(\n message: WsOpenRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.fetch.dispatchWebSocketOpen(message.connectionId);\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle WS_MESSAGE message.\n */\nasync function handleWsMessage(\n message: WsMessageRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Convert Uint8Array to ArrayBuffer if needed\n const data = message.data instanceof Uint8Array\n ? message.data.buffer.slice(message.data.byteOffset, message.data.byteOffset + message.data.byteLength) as ArrayBuffer\n : message.data;\n instance.runtime.fetch.dispatchWebSocketMessage(message.connectionId, data);\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle WS_CLOSE message.\n */\nasync function handleWsClose(\n message: WsCloseRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.fetch.dispatchWebSocketClose(message.connectionId, message.code, message.reason);\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n// ============================================================================\n// Handle Operation Handlers\n// ============================================================================\n\n/**\n * Handle FETCH_GET_UPGRADE_REQUEST message.\n */\nasync function handleFetchGetUpgradeRequest(\n message: FetchGetUpgradeRequestRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const upgradeRequest = instance.runtime.fetch.getUpgradeRequest();\n sendOk(connection.socket, message.requestId, upgradeRequest);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle FETCH_HAS_SERVE_HANDLER message.\n */\nasync function handleFetchHasServeHandler(\n message: FetchHasServeHandlerRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const hasHandler = instance.runtime.fetch.hasServeHandler();\n sendOk(connection.socket, message.requestId, hasHandler);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle FETCH_HAS_ACTIVE_CONNECTIONS message.\n */\nasync function handleFetchHasActiveConnections(\n message: FetchHasActiveConnectionsRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const hasConnections = instance.runtime.fetch.hasActiveConnections();\n sendOk(connection.socket, message.requestId, hasConnections);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle FETCH_WS_ERROR message.\n */\nasync function handleFetchWsError(\n message: FetchWsErrorRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.fetch.dispatchWebSocketError(message.connectionId, new Error(message.error));\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle TIMERS_CLEAR_ALL message.\n */\nasync function handleTimersClearAll(\n message: TimersClearAllRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.timers.clearAll();\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_RESET message.\n */\nasync function handleConsoleReset(\n message: ConsoleResetRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.console.reset();\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_GET_TIMERS message.\n */\nasync function handleConsoleGetTimers(\n message: ConsoleGetTimersRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const timers = instance.runtime.console.getTimers();\n // Convert Map to object for serialization\n sendOk(connection.socket, message.requestId, Object.fromEntries(timers));\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_GET_COUNTERS message.\n */\nasync function handleConsoleGetCounters(\n message: ConsoleGetCountersRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const counters = instance.runtime.console.getCounters();\n // Convert Map to object for serialization\n sendOk(connection.socket, message.requestId, Object.fromEntries(counters));\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_GET_GROUP_DEPTH message.\n */\nasync function handleConsoleGetGroupDepth(\n message: ConsoleGetGroupDepthRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const depth = instance.runtime.console.getGroupDepth();\n sendOk(connection.socket, message.requestId, depth);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CALLBACK_RESPONSE message (client responding to a callback invocation).\n */\nfunction handleCallbackResponse(\n message: CallbackResponseMsg,\n connection: ConnectionState\n): void {\n const pending = connection.pendingCallbacks.get(message.requestId);\n\n if (!pending) {\n console.warn(`No pending callback for requestId: ${message.requestId}`);\n return;\n }\n\n connection.pendingCallbacks.delete(message.requestId);\n\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n if (message.error) {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n if (message.error.stack) {\n error.stack = message.error.stack;\n }\n pending.reject(error);\n } else {\n pending.resolve(message.result);\n }\n}\n\n/**\n * Invoke a callback on the client side and wait for response.\n */\nasync function invokeClientCallback(\n connection: ConnectionState,\n callbackId: number,\n args: unknown[],\n timeout = 10000\n): Promise<unknown> {\n const requestId = connection.nextCallbackId++;\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n connection.pendingCallbacks.delete(requestId);\n reject(new Error(\"Callback timeout\"));\n }, timeout);\n\n const pending: PendingRequest = {\n resolve,\n reject,\n timeoutId,\n };\n\n connection.pendingCallbacks.set(requestId, pending);\n\n const invoke: CallbackInvoke = {\n type: MessageType.CALLBACK_INVOKE,\n requestId,\n callbackId,\n args,\n };\n\n sendMessage(connection.socket, invoke);\n });\n}\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') throw new Error('Cannot marshal functions from isolate');\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n // Create a proxy function that invokes the callback\n const callbackId = value.callbackId;\n return function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [callbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n }\n case 'PromiseRef': {\n // Create a proxy Promise that resolves via callback\n const promiseId = value.promiseId;\n return new Promise((resolve, reject) => {\n try {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [value.__resolveCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n resolve(unmarshalFromHost(result.value));\n } else {\n reject(new Error(result.error.message));\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [nextCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [returnCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n return { done: true, value: result.ok ? unmarshalFromHost(result.value) : undefined };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n})();\n`;\n\n// Threshold for daemon-local callback IDs (returned callbacks/promises/iterators)\nconst LOCAL_CALLBACK_THRESHOLD = 1_000_000;\n\n/**\n * Type guard for PromiseRef\n */\nfunction isPromiseRef(value: unknown): value is { __type: \"PromiseRef\"; promiseId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'PromiseRef'\n );\n}\n\n/**\n * Type guard for AsyncIteratorRef\n */\nfunction isAsyncIteratorRef(value: unknown): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'AsyncIteratorRef'\n );\n}\n\n/**\n * Type guard for CallbackRef\n */\nfunction isCallbackRef(value: unknown): value is { __type: \"CallbackRef\"; callbackId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'CallbackRef'\n );\n}\n\n/**\n * Check if a callback ID is for a daemon-local callback (returned from custom function)\n */\nfunction isLocalCallbackId(callbackId: number): boolean {\n return callbackId >= LOCAL_CALLBACK_THRESHOLD;\n}\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function invokes the client callback when called.\n * Results are marshalled/unmarshalled to preserve type fidelity across isolate boundary.\n *\n * Custom functions return Promises that resolve when the host callback completes.\n * Users should use `await` when calling these functions.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customCallbacks: CustomFunctionRegistrations,\n connection: ConnectionState,\n instance: IsolateInstance\n): Promise<void> {\n const global = context.global;\n\n /**\n * Create a MarshalContext for registering returned callbacks/promises/iterators.\n * These are registered on the instance so they can be invoked when the isolate calls back.\n */\n function createMarshalContext(): MarshalContext {\n return {\n registerCallback: (fn: Function): number => {\n const callbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(callbackId, fn);\n return callbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = instance.nextLocalCallbackId!++;\n instance.returnedPromises!.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = instance.nextLocalCallbackId!++;\n instance.returnedIterators!.set(iteratorId, iterator);\n return iteratorId;\n },\n };\n }\n\n /**\n * Post-process marshalled value to add callback IDs for PromiseRef and AsyncIteratorRef.\n * This recursively walks the value and adds __resolveCallbackId, __nextCallbackId, etc.\n */\n function addCallbackIdsToRefs(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check for PromiseRef - skip if already has callback ID (came from client)\n if (isPromiseRef(value)) {\n if ('__resolveCallbackId' in value) {\n // Already has callback ID from client, pass through\n return value;\n }\n // Create a resolve callback that waits for the promise\n const resolveCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(resolveCallbackId, async (promiseId: number) => {\n const promise = instance.returnedPromises!.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const result = await promise;\n // Clean up\n instance.returnedPromises!.delete(promiseId);\n // Marshal the result recursively\n const ctx = createMarshalContext();\n const marshalled = await marshalValue(result, ctx);\n return addCallbackIdsToRefs(marshalled);\n });\n return {\n ...value,\n __resolveCallbackId: resolveCallbackId,\n };\n }\n\n // Check for AsyncIteratorRef - skip if already has callback IDs (came from client)\n if (isAsyncIteratorRef(value)) {\n if ('__nextCallbackId' in value) {\n // Already has callback IDs from client, pass through\n return value;\n }\n // Create next callback\n const nextCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(nextCallbackId, async (iteratorId: number) => {\n const iterator = instance.returnedIterators!.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const result = await iterator.next();\n if (result.done) {\n instance.returnedIterators!.delete(iteratorId);\n }\n // Marshal the value recursively\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n // Create return callback\n const returnCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(returnCallbackId, async (iteratorId: number, returnValue?: unknown) => {\n const iterator = instance.returnedIterators!.get(iteratorId);\n instance.returnedIterators!.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const result = await iterator.return(returnValue);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n };\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(item => addCallbackIdsToRefs(item));\n }\n\n // Handle plain objects (recursively process values)\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = addCallbackIdsToRefs((value as Record<string, unknown>)[key]);\n }\n return result;\n }\n\n // Reference that invokes the callback and returns the result\n // Uses applySyncPromise which works in async contexts (serve handlers, etc.)\n // Args are JSON-encoded marshalled values, result is JSON-encoded marshalled value\n const invokeCallbackRef = new ivm.Reference(\n async (callbackId: number, argsJson: string) => {\n // Parse the JSON and unmarshal refs back to real types\n const marshalledArgs = JSON.parse(argsJson);\n const args = unmarshalValue(marshalledArgs) as unknown[];\n try {\n let result: unknown;\n\n if (isLocalCallbackId(callbackId)) {\n // Local callback (returned from a previous custom function call)\n const callback = instance.returnedCallbacks!.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n result = await callback(...args);\n } else {\n // Client callback\n result = await invokeClientCallback(connection, callbackId, args);\n }\n\n // Marshal the result with context for registering returned callbacks/promises/iterators\n const ctx = createMarshalContext();\n const marshalledResult = await marshalValue({ ok: true, value: result }, ctx);\n // Add callback IDs to any PromiseRef/AsyncIteratorRef in the result\n const processedResult = addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify(processedResult);\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n\n // Create wrapper functions for each custom function\n for (const [name, registration] of Object.entries(customCallbacks)) {\n // Skip companion callbacks (name:start, name:next, etc.) - they are used internally by asyncIterator\n if (name.includes(':')) {\n continue;\n }\n\n if (registration.type === 'sync') {\n // Sync function: use applySyncPromise (to await the host response) 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 argsJson = JSON.stringify(__marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [${registration.callbackId}, argsJson]\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 (registration.type === 'asyncIterator') {\n // AsyncIterator function: look up companion callbacks and create async iterator wrapper\n const startReg = customCallbacks[`${name}:start`];\n const nextReg = customCallbacks[`${name}:next`];\n const returnReg = customCallbacks[`${name}:return`];\n const throwReg = customCallbacks[`${name}:throw`];\n\n if (!startReg || !nextReg || !returnReg || !throwReg) {\n throw new Error(`Missing companion callbacks for asyncIterator function \"${name}\"`);\n }\n\n context.evalSync(`\n globalThis.${name} = function(...args) {\n // Start the iterator and get the iteratorId\n const argsJson = JSON.stringify(__marshalForHost(args));\n const startResultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [${startReg.callbackId}, argsJson]\n );\n const startResult = JSON.parse(startResultJson);\n if (!startResult.ok) {\n const error = new Error(startResult.error.message);\n error.name = startResult.error.name;\n throw error;\n }\n const iteratorId = __unmarshalFromHost(startResult.value).iteratorId;\n\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify(__marshalForHost([iteratorId]));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [${nextReg.callbackId}, argsJson]\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n const val = __unmarshalFromHost(result.value);\n return { done: val.done, value: val.value };\n },\n async return(v) {\n const argsJson = JSON.stringify(__marshalForHost([iteratorId, v]));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [${returnReg.callbackId}, argsJson]\n );\n const result = JSON.parse(resultJson);\n return { done: true, value: result.ok ? __unmarshalFromHost(result.value) : undefined };\n },\n async throw(e) {\n const argsJson = JSON.stringify(__marshalForHost([iteratorId, { message: e?.message, name: e?.name }]));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [${throwReg.callbackId}, argsJson]\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n const val = __unmarshalFromHost(result.value);\n return { done: val.done, value: val.value };\n }\n };\n };\n `);\n } else if (registration.type === 'async') {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const argsJson = JSON.stringify(__marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [${registration.callbackId}, argsJson]\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 }\n }\n}\n\n/**\n * Create a module resolver function that invokes the client's module loader.\n */\nfunction createModuleResolver(\n instance: IsolateInstance,\n connection: ConnectionState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (specifier: string, _referrer: ivm.Module): Promise<ivm.Module> => {\n // Check cache first\n const cached = instance.moduleCache?.get(specifier);\n if (cached) return cached;\n\n if (!instance.moduleLoaderCallbackId) {\n throw new Error(`Module not found: ${specifier}`);\n }\n\n // Invoke client callback to get source code\n const code = (await invokeClientCallback(\n connection,\n instance.moduleLoaderCallbackId,\n [specifier]\n )) as string;\n\n // Compile the module\n const mod = await instance.runtime.isolate.compileModule(code, {\n filename: specifier,\n });\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(instance, connection);\n await mod.instantiate(instance.runtime.context, resolver);\n\n // Cache and return\n instance.moduleCache?.set(specifier, mod);\n return mod;\n };\n}\n\n// ============================================================================\n// Request/Response Serialization\n// ============================================================================\n\ninterface SerializedRequestData {\n method: string;\n url: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\ninterface SerializedResponseData {\n status: number;\n statusText: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\nasync function serializeRequest(request: Request): Promise<SerializedRequestData> {\n const headers: [string, string][] = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (request.body) {\n body = new Uint8Array(await request.arrayBuffer());\n }\n\n return {\n method: request.method,\n url: request.url,\n headers,\n body,\n };\n}\n\nasync function serializeResponse(response: Response): Promise<SerializedResponseData> {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (response.body) {\n body = new Uint8Array(await response.arrayBuffer());\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n}\n\nfunction deserializeResponse(data: SerializedResponseData): Response {\n return new Response(data.body as any, {\n status: data.status,\n statusText: data.statusText,\n headers: data.headers,\n });\n}\n\n// ============================================================================\n// Stream Handlers\n// ============================================================================\n\n/**\n * Handle STREAM_PUSH message (client uploading body chunks).\n */\nfunction handleStreamPush(message: StreamPush, connection: ConnectionState): void {\n const receiver = connection.streamReceivers.get(message.streamId);\n if (!receiver) {\n sendMessage(connection.socket, {\n type: MessageType.STREAM_ERROR,\n streamId: message.streamId,\n error: \"Stream not found\",\n });\n return;\n }\n\n receiver.chunks.push(message.chunk);\n receiver.totalBytes += message.chunk.length;\n\n // Send credit back to allow more chunks\n sendMessage(connection.socket, {\n type: MessageType.STREAM_PULL,\n streamId: message.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\n}\n\n/**\n * Handle STREAM_PULL message (client granting credit for response streaming).\n */\nfunction handleStreamPull(message: StreamPull, connection: ConnectionState): void {\n const session = connection.activeStreams.get(message.streamId);\n if (!session) {\n return; // Stream may have completed\n }\n\n session.credit += message.maxBytes;\n\n // Wake up waiting sender if there's a credit resolver\n if (session.creditResolver) {\n session.creditResolver();\n session.creditResolver = undefined;\n }\n}\n\n/**\n * Handle STREAM_CLOSE message (client signaling end of upload).\n */\nfunction handleStreamClose(message: StreamClose, connection: ConnectionState): void {\n const receiver = connection.streamReceivers.get(message.streamId);\n if (!receiver) {\n return;\n }\n\n // Concatenate all chunks and resolve\n const totalLength = receiver.chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const body = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of receiver.chunks) {\n body.set(chunk, offset);\n offset += chunk.length;\n }\n\n receiver.resolve(body);\n connection.streamReceivers.delete(message.streamId);\n}\n\n/**\n * Handle STREAM_ERROR message (client signaling upload error).\n */\nfunction handleStreamError(message: StreamError, connection: ConnectionState): void {\n const receiver = connection.streamReceivers.get(message.streamId);\n if (receiver) {\n receiver.reject(new Error(message.error));\n connection.streamReceivers.delete(message.streamId);\n }\n\n const session = connection.activeStreams.get(message.streamId);\n if (session) {\n session.state = \"closed\";\n connection.activeStreams.delete(message.streamId);\n }\n}\n\n/**\n * Helper to concatenate Uint8Arrays.\n */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\n/**\n * Wait for credit to become available on a stream session.\n */\nfunction waitForCredit(session: import(\"./types.mjs\").StreamSession): Promise<void> {\n return new Promise((resolve) => {\n session.creditResolver = resolve;\n });\n}\n\n/**\n * Send a response body as a stream.\n */\nasync function sendStreamedResponse(\n connection: ConnectionState,\n requestId: number,\n response: Response\n): Promise<void> {\n const streamId = connection.nextStreamId++;\n\n // Collect headers\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n // Send stream start with metadata\n const startMsg: ResponseStreamStart = {\n type: MessageType.RESPONSE_STREAM_START,\n requestId,\n streamId,\n metadata: {\n status: response.status,\n statusText: response.statusText,\n headers,\n },\n };\n sendMessage(connection.socket, startMsg);\n\n if (!response.body) {\n // No body, just end\n const endMsg: ResponseStreamEnd = {\n type: MessageType.RESPONSE_STREAM_END,\n requestId,\n streamId,\n };\n sendMessage(connection.socket, endMsg);\n return;\n }\n\n // Create stream session for tracking\n const session: import(\"./types.mjs\").StreamSession = {\n streamId,\n direction: \"download\",\n requestId,\n state: \"active\",\n bytesTransferred: 0,\n credit: STREAM_DEFAULT_CREDIT,\n };\n connection.activeStreams.set(streamId, session);\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n // Check credit (backpressure)\n while (session.credit < STREAM_CHUNK_SIZE && session.state === \"active\") {\n await waitForCredit(session);\n }\n\n if (session.state !== \"active\") {\n throw new Error(\"Stream cancelled\");\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n const endMsg: ResponseStreamEnd = {\n type: MessageType.RESPONSE_STREAM_END,\n requestId,\n streamId,\n };\n sendMessage(connection.socket, endMsg);\n break;\n }\n\n // Send chunk(s)\n for (let offset = 0; offset < value.length; offset += STREAM_CHUNK_SIZE) {\n const chunk = value.slice(offset, offset + STREAM_CHUNK_SIZE);\n\n const chunkMsg: ResponseStreamChunk = {\n type: MessageType.RESPONSE_STREAM_CHUNK,\n requestId,\n streamId,\n chunk,\n };\n sendMessage(connection.socket, chunkMsg);\n\n session.credit -= chunk.length;\n session.bytesTransferred += chunk.length;\n }\n }\n } catch (err) {\n const errorMsg: StreamError = {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n };\n sendMessage(connection.socket, errorMsg);\n } finally {\n reader.releaseLock();\n connection.activeStreams.delete(streamId);\n }\n}\n\n// ============================================================================\n// Test Environment Handlers\n// ============================================================================\n\n/**\n * Handle RUN_TESTS message.\n */\nasync function handleRunTests(\n message: RunTestsRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Run tests with optional timeout\n const timeout = message.timeout ?? 30000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"Test timeout\")), timeout);\n });\n\n const results = await Promise.race([\n runTestsInContext(instance.runtime.context),\n timeoutPromise,\n ]);\n\n sendOk(connection.socket, message.requestId, results);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle RESET_TEST_ENV message.\n */\nasync function handleResetTestEnv(\n message: ResetTestEnvRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Reset test environment state\n await instance.runtime.context.eval(\"__resetTestEnvironment()\", { promise: true });\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle HAS_TESTS message.\n */\nasync function handleHasTests(\n message: HasTestsRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const result = hasTestsInContext(instance.runtime.context);\n sendOk(connection.socket, message.requestId, result);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle GET_TEST_COUNT message.\n */\nasync function handleGetTestCount(\n message: GetTestCountRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const result = getTestCountInContext(instance.runtime.context);\n sendOk(connection.socket, message.requestId, result);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n// ============================================================================\n// Playwright Handlers\n// ============================================================================\n\n/**\n * Handle RUN_PLAYWRIGHT_TESTS message.\n * @deprecated Use testEnvironment.runTests() instead\n */\nasync function handleRunPlaywrightTests(\n message: RunPlaywrightTestsRequest,\n connection: ConnectionState,\n _state: DaemonState\n): Promise<void> {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"playwright.runTests() has been removed. Use testEnvironment.runTests() instead.\"\n );\n}\n\n/**\n * Handle RESET_PLAYWRIGHT_TESTS message.\n * @deprecated Use testEnvironment.reset() instead\n */\nasync function handleResetPlaywrightTests(\n message: ResetPlaywrightTestsRequest,\n connection: ConnectionState,\n _state: DaemonState\n): Promise<void> {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"playwright.reset() has been removed. Use testEnvironment.reset() instead.\"\n );\n}\n\n/**\n * Handle GET_COLLECTED_DATA message.\n */\nasync function handleGetCollectedData(\n message: GetCollectedDataRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.playwrightHandle) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Playwright not configured. Provide playwright.page in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const data = {\n browserConsoleLogs: instance.playwrightHandle.getBrowserConsoleLogs(),\n networkRequests: instance.playwrightHandle.getNetworkRequests(),\n networkResponses: instance.playwrightHandle.getNetworkResponses(),\n };\n\n sendOk(connection.socket, message.requestId, data);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CLEAR_COLLECTED_DATA message.\n */\nasync function handleClearCollectedData(\n message: ClearCollectedDataRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.playwrightHandle) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Playwright not configured. Provide playwright.page in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.playwrightHandle.clearCollected();\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n"
|
|
5
|
+
"/**\n * Connection handling for the isolate daemon.\n */\n\nimport type { Socket } from \"node:net\";\nimport { randomUUID } from \"node:crypto\";\nimport ivm from \"isolated-vm\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n ErrorCode,\n STREAM_THRESHOLD,\n STREAM_CHUNK_SIZE,\n STREAM_DEFAULT_CREDIT,\n type Message,\n type ResponseOk,\n type ResponseError,\n type CreateRuntimeRequest,\n type DisposeRuntimeRequest,\n type EvalRequest,\n type DispatchRequestRequest,\n type CallbackResponseMsg,\n type CallbackInvoke,\n type RunTestsRequest,\n type HasTestsRequest,\n type GetTestCountRequest,\n type RunPlaywrightTestsRequest,\n type ResetPlaywrightTestsRequest,\n type GetCollectedDataRequest,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\n type FsCallbackRegistrations,\n type CustomFunctionRegistrations,\n type CallbackRegistration,\n type PlaywrightOperation,\n type PlaywrightResult,\n type WsOpenRequest,\n type WsMessageRequest,\n type WsCloseRequest,\n type FetchGetUpgradeRequestRequest,\n type FetchHasServeHandlerRequest,\n type FetchHasActiveConnectionsRequest,\n type FetchWsErrorRequest,\n type TimersClearAllRequest,\n type ConsoleResetRequest,\n type ConsoleGetTimersRequest,\n type ConsoleGetCountersRequest,\n type ConsoleGetGroupDepthRequest,\n type WsCommandMessage,\n type ResponseStreamStart,\n type ResponseStreamChunk,\n type ResponseStreamEnd,\n type StreamPush,\n type StreamPull,\n type StreamClose,\n type StreamError,\n encodeValue,\n decodeValue,\n marshalValue,\n unmarshalValue,\n type MarshalContext,\n type UnmarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createCallbackFileSystemHandler } from \"./callback-fs-handler.mjs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightCallback,\n type BrowserConsoleLogEntry,\n type NetworkRequestInfo,\n type NetworkResponseInfo,\n} from \"@ricsam/isolate-playwright\";\nimport {\n createInternalRuntime,\n type InternalRuntimeHandle,\n} from \"@ricsam/isolate-runtime\";\nimport type {\n DaemonState,\n ConnectionState,\n IsolateInstance,\n PendingRequest,\n CallbackContext,\n} from \"./types.mjs\";\n\n/**\n * Handle a new client connection.\n */\nexport function handleConnection(socket: Socket, state: DaemonState): void {\n const connection: ConnectionState = {\n socket,\n isolates: new Set(),\n pendingRequests: new Map(),\n pendingCallbacks: new Map(),\n nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n activeStreams: new Map(),\n streamReceivers: new Map(),\n };\n\n state.connections.set(socket, connection);\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, connection, state).catch((err) => {\n console.error(\"Error handling message:\", err);\n });\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n socket.destroy();\n }\n });\n\n socket.on(\"close\", () => {\n // Dispose or soft-delete isolates owned by this connection\n for (const isolateId of connection.isolates) {\n const instance = state.isolates.get(isolateId);\n if (instance) {\n if (instance.namespaceId != null && !instance.isDisposed) {\n // Namespaced runtime: soft-delete (keep cached for reuse)\n softDeleteRuntime(instance, state);\n } else if (!instance.isDisposed) {\n // Non-namespaced runtime: hard delete\n try {\n // Clean up Playwright resources if present\n if (instance.playwrightHandle) {\n instance.playwrightHandle.dispose();\n }\n instance.runtime.dispose();\n } catch {\n // Ignore disposal errors\n }\n state.isolates.delete(isolateId);\n }\n }\n }\n\n // Reject pending callbacks and clear their timeouts\n for (const [, pending] of connection.pendingCallbacks) {\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n pending.reject(new Error(\"Connection closed\"));\n }\n connection.pendingCallbacks.clear();\n\n state.connections.delete(socket);\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n}\n\n/**\n * Send a message to a client.\n */\nfunction sendMessage(socket: Socket, message: Message): void {\n const frame = buildFrame(message);\n socket.write(frame);\n}\n\n/**\n * Send an error response.\n */\nfunction sendError(\n socket: Socket,\n requestId: number,\n code: ErrorCode,\n message: string,\n details?: { name: string; stack?: string }\n): void {\n const response: ResponseError = {\n type: MessageType.RESPONSE_ERROR,\n requestId,\n code,\n message,\n details,\n };\n sendMessage(socket, response);\n}\n\n/**\n * Send a success response.\n */\nfunction sendOk(socket: Socket, requestId: number, data?: unknown): void {\n const response: ResponseOk = {\n type: MessageType.RESPONSE_OK,\n requestId,\n data,\n };\n sendMessage(socket, response);\n}\n\n/**\n * Handle an incoming message.\n */\nasync function handleMessage(\n message: Message,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n state.stats.totalRequestsProcessed++;\n\n switch (message.type) {\n case MessageType.CREATE_RUNTIME:\n await handleCreateRuntime(\n message as CreateRuntimeRequest,\n connection,\n state\n );\n break;\n\n case MessageType.DISPOSE_RUNTIME:\n await handleDisposeRuntime(\n message as DisposeRuntimeRequest,\n connection,\n state\n );\n break;\n\n case MessageType.EVAL:\n await handleEval(message as EvalRequest, connection, state);\n break;\n\n case MessageType.DISPATCH_REQUEST:\n await handleDispatchRequest(\n message as DispatchRequestRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CALLBACK_RESPONSE:\n handleCallbackResponse(message as CallbackResponseMsg, connection);\n break;\n\n // WebSocket operations\n case MessageType.WS_OPEN:\n await handleWsOpen(message as WsOpenRequest, connection, state);\n break;\n\n case MessageType.WS_MESSAGE:\n await handleWsMessage(message as WsMessageRequest, connection, state);\n break;\n\n case MessageType.WS_CLOSE:\n await handleWsClose(message as WsCloseRequest, connection, state);\n break;\n\n // Handle operations\n case MessageType.FETCH_GET_UPGRADE_REQUEST:\n await handleFetchGetUpgradeRequest(\n message as FetchGetUpgradeRequestRequest,\n connection,\n state\n );\n break;\n\n case MessageType.FETCH_HAS_SERVE_HANDLER:\n await handleFetchHasServeHandler(\n message as FetchHasServeHandlerRequest,\n connection,\n state\n );\n break;\n\n case MessageType.FETCH_HAS_ACTIVE_CONNECTIONS:\n await handleFetchHasActiveConnections(\n message as FetchHasActiveConnectionsRequest,\n connection,\n state\n );\n break;\n\n case MessageType.FETCH_WS_ERROR:\n await handleFetchWsError(message as FetchWsErrorRequest, connection, state);\n break;\n\n case MessageType.TIMERS_CLEAR_ALL:\n await handleTimersClearAll(\n message as TimersClearAllRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CONSOLE_RESET:\n await handleConsoleReset(message as ConsoleResetRequest, connection, state);\n break;\n\n case MessageType.CONSOLE_GET_TIMERS:\n await handleConsoleGetTimers(\n message as ConsoleGetTimersRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CONSOLE_GET_COUNTERS:\n await handleConsoleGetCounters(\n message as ConsoleGetCountersRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CONSOLE_GET_GROUP_DEPTH:\n await handleConsoleGetGroupDepth(\n message as ConsoleGetGroupDepthRequest,\n connection,\n state\n );\n break;\n\n case MessageType.RUN_TESTS:\n await handleRunTests(message as RunTestsRequest, connection, state);\n break;\n\n case MessageType.RESET_TEST_ENV:\n await handleResetTestEnv(\n message as ResetTestEnvRequest,\n connection,\n state\n );\n break;\n\n case MessageType.HAS_TESTS:\n await handleHasTests(message as HasTestsRequest, connection, state);\n break;\n\n case MessageType.GET_TEST_COUNT:\n await handleGetTestCount(\n message as GetTestCountRequest,\n connection,\n state\n );\n break;\n\n case MessageType.RUN_PLAYWRIGHT_TESTS:\n await handleRunPlaywrightTests(\n message as RunPlaywrightTestsRequest,\n connection,\n state\n );\n break;\n\n case MessageType.RESET_PLAYWRIGHT_TESTS:\n await handleResetPlaywrightTests(\n message as ResetPlaywrightTestsRequest,\n connection,\n state\n );\n break;\n\n case MessageType.GET_COLLECTED_DATA:\n await handleGetCollectedData(\n message as GetCollectedDataRequest,\n connection,\n state\n );\n break;\n\n case MessageType.CLEAR_COLLECTED_DATA:\n await handleClearCollectedData(\n message as ClearCollectedDataRequest,\n connection,\n state\n );\n break;\n\n case MessageType.PING:\n sendMessage(connection.socket, { type: MessageType.PONG });\n break;\n\n // Stream operations (for request body streaming)\n case MessageType.STREAM_PUSH:\n handleStreamPush(message as StreamPush, connection);\n break;\n\n case MessageType.STREAM_PULL:\n handleStreamPull(message as StreamPull, connection);\n break;\n\n case MessageType.STREAM_CLOSE:\n handleStreamClose(message as StreamClose, connection);\n break;\n\n case MessageType.STREAM_ERROR:\n handleStreamError(message as StreamError, connection);\n break;\n\n default:\n sendError(\n connection.socket,\n (message as { requestId?: number }).requestId ?? 0,\n ErrorCode.UNKNOWN_MESSAGE_TYPE,\n `Unknown message type: ${message.type}`\n );\n }\n}\n\n// ============================================================================\n// Namespace Runtime Management\n// ============================================================================\n\n/**\n * Soft-delete a namespaced runtime (keep cached for reuse).\n * Clears owner connection and callbacks but preserves isolate/context/module cache.\n */\nfunction softDeleteRuntime(instance: IsolateInstance, state: DaemonState): void {\n instance.isDisposed = true;\n instance.disposedAt = Date.now();\n instance.ownerConnection = null;\n instance.callbacks.clear();\n\n // Clear timers\n instance.runtime.timers.clearAll();\n\n // Reset console state\n instance.runtime.console.reset();\n\n // Clear pending callbacks\n instance.pendingCallbacks.length = 0;\n\n // Clear returned callback/promise/iterator registries\n instance.returnedCallbacks?.clear();\n instance.returnedPromises?.clear();\n instance.returnedIterators?.clear();\n\n // Note: We preserve the module cache (moduleCache) for performance benefit\n}\n\n/**\n * Reuse a cached namespaced runtime for a new connection.\n * Resets state that should be fresh but preserves isolate/context/module cache.\n */\nfunction reuseNamespacedRuntime(\n instance: IsolateInstance,\n connection: ConnectionState,\n message: CreateRuntimeRequest,\n state: DaemonState\n): void {\n // Update ownership\n instance.ownerConnection = connection.socket;\n instance.isDisposed = false;\n instance.disposedAt = undefined;\n instance.lastActivity = Date.now();\n\n // Track in connection\n connection.isolates.add(instance.isolateId);\n\n // Re-register callbacks from the new request\n const callbacks = message.options.callbacks;\n\n // Update the mutable callback context (closures reference this object)\n if (instance.callbackContext) {\n // Update connection reference\n instance.callbackContext.connection = connection;\n\n // Update callback IDs\n instance.callbackContext.consoleOnEntry = callbacks?.console?.onEntry?.callbackId;\n instance.callbackContext.fetch = callbacks?.fetch?.callbackId;\n instance.callbackContext.moduleLoader = callbacks?.moduleLoader?.callbackId;\n\n // Update FS callback IDs\n instance.callbackContext.fs = {\n readFile: callbacks?.fs?.readFile?.callbackId,\n writeFile: callbacks?.fs?.writeFile?.callbackId,\n stat: callbacks?.fs?.stat?.callbackId,\n readdir: callbacks?.fs?.readdir?.callbackId,\n unlink: callbacks?.fs?.unlink?.callbackId,\n mkdir: callbacks?.fs?.mkdir?.callbackId,\n rmdir: callbacks?.fs?.rmdir?.callbackId,\n };\n\n // Update custom function callback IDs\n instance.callbackContext.custom.clear();\n if (callbacks?.custom) {\n for (const [name, reg] of Object.entries(callbacks.custom)) {\n if (reg) {\n instance.callbackContext.custom.set(name, reg.callbackId);\n }\n }\n }\n }\n\n // Also update the callbacks map for registration tracking\n instance.callbacks.clear();\n\n if (callbacks?.console?.onEntry) {\n instance.callbacks.set(callbacks.console.onEntry.callbackId, {\n ...callbacks.console.onEntry,\n name: \"onEntry\",\n });\n }\n\n if (callbacks?.fetch) {\n instance.callbacks.set(callbacks.fetch.callbackId, callbacks.fetch);\n }\n\n if (callbacks?.fs) {\n for (const [name, reg] of Object.entries(callbacks.fs)) {\n if (reg) {\n instance.callbacks.set(reg.callbackId, { ...reg, name });\n }\n }\n }\n\n if (callbacks?.moduleLoader) {\n instance.moduleLoaderCallbackId = callbacks.moduleLoader.callbackId;\n instance.callbacks.set(callbacks.moduleLoader.callbackId, callbacks.moduleLoader);\n }\n\n if (callbacks?.custom) {\n for (const [name, reg] of Object.entries(callbacks.custom)) {\n if (reg) {\n instance.callbacks.set(reg.callbackId, { ...reg, name });\n }\n }\n }\n\n // Re-initialize registries for new callbacks\n instance.returnedCallbacks = new Map();\n instance.returnedPromises = new Map();\n instance.returnedIterators = new Map();\n instance.nextLocalCallbackId = 1_000_000;\n\n // Update the __customFnCallbackIds global in the V8 context with new callback IDs\n // This allows custom functions to use the new client's callback IDs\n if (callbacks?.custom) {\n const newCallbackIdMap: Record<string, number> = {};\n for (const [name, reg] of Object.entries(callbacks.custom)) {\n if (reg) {\n newCallbackIdMap[name] = reg.callbackId;\n }\n }\n try {\n instance.runtime.context.global.setSync(\n \"__customFnCallbackIds\",\n new ivm.ExternalCopy(newCallbackIdMap).copyInto()\n );\n } catch {\n // Ignore errors if context is not available\n }\n }\n}\n\n/**\n * Evict the oldest disposed runtime to make room for a new one.\n * Returns true if a runtime was evicted, false if no disposed runtimes available.\n */\nfunction evictOldestDisposedRuntime(state: DaemonState): boolean {\n let oldest: IsolateInstance | null = null;\n let oldestTime = Infinity;\n\n for (const [, instance] of state.isolates) {\n if (instance.isDisposed && instance.disposedAt !== undefined) {\n if (instance.disposedAt < oldestTime) {\n oldestTime = instance.disposedAt;\n oldest = instance;\n }\n }\n }\n\n if (oldest) {\n // Hard delete the oldest disposed runtime\n try {\n if (oldest.playwrightHandle) {\n oldest.playwrightHandle.dispose();\n }\n oldest.runtime.dispose();\n } catch {\n // Ignore disposal errors\n }\n state.isolates.delete(oldest.isolateId);\n if (oldest.namespaceId != null) {\n state.namespacedRuntimes.delete(oldest.namespaceId);\n }\n return true;\n }\n\n return false;\n}\n\n// ============================================================================\n// Message Handlers\n// ============================================================================\n\n/**\n * Handle CREATE_RUNTIME message.\n */\nasync function handleCreateRuntime(\n message: CreateRuntimeRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const namespaceId = message.options.namespaceId;\n\n // Check if we're trying to reuse a namespaced runtime\n // Note: use != null to allow empty string namespace IDs but exclude undefined/null\n // (MessagePack converts undefined to null during encoding)\n if (namespaceId != null) {\n const existing = state.namespacedRuntimes.get(namespaceId);\n\n if (existing) {\n if (!existing.isDisposed) {\n // Check if same connection already owns this runtime (idempotent case)\n if (existing.ownerConnection === connection.socket) {\n sendOk(connection.socket, message.requestId, {\n isolateId: existing.isolateId,\n reused: true,\n });\n return;\n }\n\n // Different connection - still error\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n `Namespace \"${namespaceId}\" already has an active runtime`\n );\n return;\n }\n\n // Reuse the cached runtime\n reuseNamespacedRuntime(existing, connection, message, state);\n\n sendOk(connection.socket, message.requestId, {\n isolateId: existing.isolateId,\n reused: true,\n });\n return;\n }\n }\n\n // Check limits - try LRU eviction if at limit\n if (state.isolates.size >= state.options.maxIsolates) {\n // Try to evict an old disposed runtime\n if (!evictOldestDisposedRuntime(state)) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_MEMORY_LIMIT,\n `Maximum isolates (${state.options.maxIsolates}) reached`\n );\n return;\n }\n }\n\n try {\n const isolateId = randomUUID();\n\n // Create bridged callbacks that invoke the client\n const consoleCallbacks = message.options.callbacks?.console;\n const fetchCallback = message.options.callbacks?.fetch;\n const fsCallbacks = message.options.callbacks?.fs;\n const moduleLoaderCallback = message.options.callbacks?.moduleLoader;\n const customCallbacks = message.options.callbacks?.custom;\n\n // Track pending callbacks so eval can wait for them\n const pendingCallbacks: Promise<unknown>[] = [];\n\n // Create mutable callback context that closures can reference\n // This allows updating callback IDs on runtime reuse\n const callbackContext: CallbackContext = {\n connection,\n consoleOnEntry: consoleCallbacks?.onEntry?.callbackId,\n fetch: fetchCallback?.callbackId,\n moduleLoader: moduleLoaderCallback?.callbackId,\n fs: {\n readFile: fsCallbacks?.readFile?.callbackId,\n writeFile: fsCallbacks?.writeFile?.callbackId,\n stat: fsCallbacks?.stat?.callbackId,\n readdir: fsCallbacks?.readdir?.callbackId,\n unlink: fsCallbacks?.unlink?.callbackId,\n mkdir: fsCallbacks?.mkdir?.callbackId,\n rmdir: fsCallbacks?.rmdir?.callbackId,\n },\n custom: new Map(\n customCallbacks\n ? Object.entries(customCallbacks).map(([name, reg]) => [name, reg.callbackId])\n : []\n ),\n };\n\n const runtime = await createInternalRuntime({\n memoryLimitMB: message.options.memoryLimitMB ?? state.options.defaultMemoryLimitMB,\n cwd: message.options.cwd,\n // Always create console handler to support adding callbacks on reuse\n console: {\n onEntry: (entry) => {\n // Use callback context for dynamic lookup (supports runtime reuse)\n const conn = callbackContext.connection;\n const callbackId = callbackContext.consoleOnEntry;\n // Only invoke if callback is registered\n if (!conn || callbackId === undefined) return;\n\n // Track this callback so eval waits for it to complete\n const promise = invokeClientCallback(\n conn,\n callbackId,\n [entry]\n ).catch(() => {}); // Ignore errors, just track completion\n pendingCallbacks.push(promise);\n },\n },\n // Always create fetch handler to support adding callbacks on reuse\n fetch: {\n onFetch: async (request) => {\n // Use callback context for dynamic lookup (supports runtime reuse)\n const conn = callbackContext.connection;\n const callbackId = callbackContext.fetch;\n if (!conn || callbackId === undefined) {\n throw new Error(\"Fetch callback not available\");\n }\n\n const serialized = await serializeRequest(request);\n const result = await invokeClientCallback(\n conn,\n callbackId,\n [serialized]\n );\n return deserializeResponse(result as SerializedResponseData);\n },\n },\n // Always create fs handler to support adding callbacks on reuse\n fs: {\n getDirectory: async (path: string) => {\n // Use callback context for dynamic lookup (supports runtime reuse)\n const conn = callbackContext.connection;\n if (!conn) {\n throw new Error(\"FS callbacks not available\");\n }\n\n return createCallbackFileSystemHandler({\n connection: conn,\n callbackContext,\n invokeClientCallback,\n basePath: path,\n });\n },\n },\n });\n\n const instance: IsolateInstance = {\n isolateId,\n runtime,\n ownerConnection: connection.socket,\n callbacks: new Map(),\n createdAt: Date.now(),\n lastActivity: Date.now(),\n pendingCallbacks,\n // Initialize registries for returned callbacks/promises/iterators\n returnedCallbacks: new Map(),\n returnedPromises: new Map(),\n returnedIterators: new Map(),\n // Start at 1,000,000 to avoid conflicts with client callback IDs\n nextLocalCallbackId: 1_000_000,\n // Namespace pooling fields\n namespaceId,\n isDisposed: false,\n // Mutable callback context for runtime reuse\n callbackContext,\n };\n\n // Setup module loader\n if (moduleLoaderCallback) {\n instance.moduleLoaderCallbackId = moduleLoaderCallback.callbackId;\n instance.moduleCache = new Map();\n }\n\n // Setup custom functions as globals in the isolate\n if (customCallbacks) {\n await setupCustomFunctions(runtime.context, customCallbacks, connection, instance);\n }\n\n // Store callback registrations\n if (consoleCallbacks?.onEntry) {\n instance.callbacks.set(consoleCallbacks.onEntry.callbackId, {\n ...consoleCallbacks.onEntry,\n name: \"onEntry\",\n });\n }\n if (fetchCallback) {\n instance.callbacks.set(fetchCallback.callbackId, fetchCallback);\n }\n if (fsCallbacks) {\n for (const [name, reg] of Object.entries(fsCallbacks)) {\n if (reg) {\n instance.callbacks.set(reg.callbackId, { ...reg, name });\n }\n }\n }\n if (moduleLoaderCallback) {\n instance.callbacks.set(moduleLoaderCallback.callbackId, moduleLoaderCallback);\n }\n if (customCallbacks) {\n for (const [name, reg] of Object.entries(customCallbacks)) {\n if (reg) {\n instance.callbacks.set(reg.callbackId, { ...reg, name });\n }\n }\n }\n\n // Setup test environment if requested\n if (message.options.testEnvironment) {\n const testEnvOption = message.options.testEnvironment;\n const testEnvOptions = typeof testEnvOption === \"object\" ? testEnvOption : undefined;\n\n // Create event callback if provided\n const onEventCallback = testEnvOptions?.callbacks?.onEvent;\n\n await setupTestEnvironment(runtime.context, {\n onEvent: onEventCallback\n ? (event) => {\n // Forward event to client callback\n const promise = invokeClientCallback(\n connection,\n onEventCallback.callbackId,\n [JSON.stringify(event)]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n }\n : undefined,\n testTimeout: testEnvOptions?.testTimeout,\n });\n\n instance.testEnvironmentEnabled = true;\n\n // Store callback registration\n if (onEventCallback) {\n instance.callbacks.set(onEventCallback.callbackId, {\n ...onEventCallback,\n name: \"testEnvironment.onEvent\",\n });\n }\n }\n\n // Setup playwright if callbacks are provided (client owns the browser)\n const playwrightCallbacks = message.options.callbacks?.playwright;\n if (playwrightCallbacks) {\n // Create handler that invokes client callback\n const handler: PlaywrightCallback = async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n const resultJson = await invokeClientCallback(\n connection,\n playwrightCallbacks.handlerCallbackId,\n [JSON.stringify(op)]\n );\n return JSON.parse(resultJson as string) as PlaywrightResult;\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n\n instance.playwrightHandle = await setupPlaywright(runtime.context, {\n handler,\n // If console is true, browser logs are printed to stdout\n console: playwrightCallbacks.console,\n // Unified event callback\n onEvent: (event) => {\n // Route events to appropriate client callbacks\n if (event.type === \"browserConsoleLog\" && playwrightCallbacks.onBrowserConsoleLogCallbackId) {\n const promise = invokeClientCallback(\n connection,\n playwrightCallbacks.onBrowserConsoleLogCallbackId,\n [{ level: event.level, args: event.args, timestamp: event.timestamp }]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n } else if (event.type === \"networkRequest\" && playwrightCallbacks.onNetworkRequestCallbackId) {\n const promise = invokeClientCallback(\n connection,\n playwrightCallbacks.onNetworkRequestCallbackId,\n [event]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n } else if (event.type === \"networkResponse\" && playwrightCallbacks.onNetworkResponseCallbackId) {\n const promise = invokeClientCallback(\n connection,\n playwrightCallbacks.onNetworkResponseCallbackId,\n [event]\n ).catch(() => {});\n pendingCallbacks.push(promise);\n }\n },\n });\n }\n\n state.isolates.set(isolateId, instance);\n connection.isolates.add(isolateId);\n state.stats.totalIsolatesCreated++;\n\n // Add to namespace index if this is a namespaced runtime\n if (namespaceId != null) {\n state.namespacedRuntimes.set(namespaceId, instance);\n }\n\n // Forward WebSocket commands from isolate to client\n instance.runtime.fetch.onWebSocketCommand((cmd) => {\n // Convert ArrayBuffer to Uint8Array if needed for protocol\n let data: string | Uint8Array | undefined;\n if (cmd.data instanceof ArrayBuffer) {\n data = new Uint8Array(cmd.data);\n } else {\n data = cmd.data as string | undefined;\n }\n const wsCommandMsg: WsCommandMessage = {\n type: MessageType.WS_COMMAND,\n isolateId,\n command: {\n type: cmd.type,\n connectionId: cmd.connectionId,\n data,\n code: cmd.code,\n reason: cmd.reason,\n },\n };\n sendMessage(connection.socket, wsCommandMsg);\n });\n\n sendOk(connection.socket, message.requestId, { isolateId, reused: false });\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle DISPOSE_RUNTIME message.\n */\nasync function handleDisposeRuntime(\n message: DisposeRuntimeRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (instance.ownerConnection !== connection.socket) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not owned by this connection`\n );\n return;\n }\n\n try {\n // Remove from connection's tracking\n connection.isolates.delete(message.isolateId);\n\n if (instance.namespaceId != null) {\n // Namespaced runtime: soft-delete (keep cached for reuse)\n softDeleteRuntime(instance, state);\n } else {\n // Non-namespaced runtime: hard delete\n // Clean up Playwright resources if present\n if (instance.playwrightHandle) {\n instance.playwrightHandle.dispose();\n }\n\n instance.runtime.dispose();\n state.isolates.delete(message.isolateId);\n }\n\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle EVAL message.\n */\nasync function handleEval(\n message: EvalRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Always use module mode - supports top-level await and ES module syntax\n const mod = await instance.runtime.isolate.compileModule(message.code, {\n filename: message.filename ?? \"<eval>\",\n });\n\n // Instantiate with module resolver if available\n if (instance.moduleLoaderCallbackId) {\n const resolver = createModuleResolver(instance, connection);\n await mod.instantiate(instance.runtime.context, resolver);\n } else {\n // No module loader - instantiate with a resolver that always throws\n await mod.instantiate(instance.runtime.context, (specifier) => {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n });\n }\n\n // Evaluate the module with optional timeout\n const timeout = message.maxExecutionMs;\n await mod.evaluate(timeout ? { timeout } : undefined);\n\n // Wait for all pending callbacks (e.g., console.log) to complete\n // This ensures the client receives all callbacks before eval resolves\n await Promise.all(instance.pendingCallbacks);\n instance.pendingCallbacks.length = 0; // Clear for next eval\n\n // Return undefined for module evaluation\n sendOk(connection.socket, message.requestId, { value: undefined });\n } catch (err) {\n const error = err as Error;\n // Check if this is a timeout error from isolated-vm\n const isTimeoutError = error.message?.includes('Script execution timed out');\n sendError(\n connection.socket,\n message.requestId,\n isTimeoutError ? ErrorCode.ISOLATE_TIMEOUT : ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle DISPATCH_REQUEST message.\n */\nasync function handleDispatchRequest(\n message: DispatchRequestRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Handle request body (inline or streamed)\n let requestBody: BodyInit | null = null;\n\n if (message.request.bodyStreamId !== undefined) {\n // Streaming body - wait for all chunks to arrive\n requestBody = await receiveStreamedBody(connection, message.request.bodyStreamId) as BodyInit;\n } else if (message.request.body) {\n requestBody = message.request.body as unknown as BodyInit;\n }\n\n // Deserialize the request\n const request = new Request(message.request.url, {\n method: message.request.method,\n headers: message.request.headers,\n body: requestBody,\n });\n\n // Dispatch to isolate\n const response = await instance.runtime.fetch.dispatchRequest(request);\n\n // Always stream responses with a body to preserve chunk boundaries\n // Only inline responses without a body (e.g., 204 No Content)\n if (response.body) {\n await sendStreamedResponse(connection, message.requestId, response);\n } else {\n // No body - send inline response with just headers\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n sendOk(connection.socket, message.requestId, {\n response: {\n status: response.status,\n statusText: response.statusText,\n headers,\n body: null,\n },\n });\n }\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Receive a streamed body from the client.\n * Sets up a receiver and waits for all chunks to arrive.\n */\nfunction receiveStreamedBody(\n connection: ConnectionState,\n streamId: number\n): Promise<Uint8Array> {\n return new Promise((resolve, reject) => {\n const receiver: import(\"./types.mjs\").StreamReceiver = {\n streamId,\n requestId: 0,\n chunks: [],\n totalBytes: 0,\n resolve,\n reject,\n };\n connection.streamReceivers.set(streamId, receiver);\n\n // Send initial credit to allow client to start sending\n sendMessage(connection.socket, {\n type: MessageType.STREAM_PULL,\n streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\n });\n}\n\n// ============================================================================\n// WebSocket Operation Handlers\n// ============================================================================\n\n/**\n * Handle WS_OPEN message.\n */\nasync function handleWsOpen(\n message: WsOpenRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.fetch.dispatchWebSocketOpen(message.connectionId);\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle WS_MESSAGE message.\n */\nasync function handleWsMessage(\n message: WsMessageRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Convert Uint8Array to ArrayBuffer if needed\n const data = message.data instanceof Uint8Array\n ? message.data.buffer.slice(message.data.byteOffset, message.data.byteOffset + message.data.byteLength) as ArrayBuffer\n : message.data;\n instance.runtime.fetch.dispatchWebSocketMessage(message.connectionId, data);\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle WS_CLOSE message.\n */\nasync function handleWsClose(\n message: WsCloseRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.fetch.dispatchWebSocketClose(message.connectionId, message.code, message.reason);\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n// ============================================================================\n// Handle Operation Handlers\n// ============================================================================\n\n/**\n * Handle FETCH_GET_UPGRADE_REQUEST message.\n */\nasync function handleFetchGetUpgradeRequest(\n message: FetchGetUpgradeRequestRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const upgradeRequest = instance.runtime.fetch.getUpgradeRequest();\n sendOk(connection.socket, message.requestId, upgradeRequest);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle FETCH_HAS_SERVE_HANDLER message.\n */\nasync function handleFetchHasServeHandler(\n message: FetchHasServeHandlerRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const hasHandler = instance.runtime.fetch.hasServeHandler();\n sendOk(connection.socket, message.requestId, hasHandler);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle FETCH_HAS_ACTIVE_CONNECTIONS message.\n */\nasync function handleFetchHasActiveConnections(\n message: FetchHasActiveConnectionsRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const hasConnections = instance.runtime.fetch.hasActiveConnections();\n sendOk(connection.socket, message.requestId, hasConnections);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle FETCH_WS_ERROR message.\n */\nasync function handleFetchWsError(\n message: FetchWsErrorRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.fetch.dispatchWebSocketError(message.connectionId, new Error(message.error));\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle TIMERS_CLEAR_ALL message.\n */\nasync function handleTimersClearAll(\n message: TimersClearAllRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.timers.clearAll();\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_RESET message.\n */\nasync function handleConsoleReset(\n message: ConsoleResetRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.runtime.console.reset();\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_GET_TIMERS message.\n */\nasync function handleConsoleGetTimers(\n message: ConsoleGetTimersRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const timers = instance.runtime.console.getTimers();\n // Convert Map to object for serialization\n sendOk(connection.socket, message.requestId, Object.fromEntries(timers));\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_GET_COUNTERS message.\n */\nasync function handleConsoleGetCounters(\n message: ConsoleGetCountersRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const counters = instance.runtime.console.getCounters();\n // Convert Map to object for serialization\n sendOk(connection.socket, message.requestId, Object.fromEntries(counters));\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CONSOLE_GET_GROUP_DEPTH message.\n */\nasync function handleConsoleGetGroupDepth(\n message: ConsoleGetGroupDepthRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const depth = instance.runtime.console.getGroupDepth();\n sendOk(connection.socket, message.requestId, depth);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CALLBACK_RESPONSE message (client responding to a callback invocation).\n */\nfunction handleCallbackResponse(\n message: CallbackResponseMsg,\n connection: ConnectionState\n): void {\n const pending = connection.pendingCallbacks.get(message.requestId);\n\n if (!pending) {\n console.warn(`No pending callback for requestId: ${message.requestId}`);\n return;\n }\n\n connection.pendingCallbacks.delete(message.requestId);\n\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n if (message.error) {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n if (message.error.stack) {\n error.stack = message.error.stack;\n }\n pending.reject(error);\n } else {\n pending.resolve(message.result);\n }\n}\n\n/**\n * Invoke a callback on the client side and wait for response.\n */\nasync function invokeClientCallback(\n connection: ConnectionState,\n callbackId: number,\n args: unknown[],\n timeout = 10000\n): Promise<unknown> {\n const requestId = connection.nextCallbackId++;\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n connection.pendingCallbacks.delete(requestId);\n reject(new Error(\"Callback timeout\"));\n }, timeout);\n\n const pending: PendingRequest = {\n resolve,\n reject,\n timeoutId,\n };\n\n connection.pendingCallbacks.set(requestId, pending);\n\n const invoke: CallbackInvoke = {\n type: MessageType.CALLBACK_INVOKE,\n requestId,\n callbackId,\n args,\n };\n\n sendMessage(connection.socket, invoke);\n });\n}\n\n/**\n * Lightweight marshalling code to inject into the isolate.\n * Converts JavaScript types to Ref objects for type-preserving serialization.\n */\nconst ISOLATE_MARSHAL_CODE = `\n(function() {\n // Marshal a value (JavaScript → Ref)\n function marshalForHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum marshalling depth exceeded');\n\n if (value === null) return null;\n if (value === undefined) return { __type: 'UndefinedRef' };\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'bigint') return { __type: 'BigIntRef', value: value.toString() };\n if (type === 'function') throw new Error('Cannot marshal functions from isolate');\n if (type === 'symbol') throw new Error('Cannot marshal Symbol values');\n\n if (type === 'object') {\n if (value instanceof Date) {\n return { __type: 'DateRef', timestamp: value.getTime() };\n }\n if (value instanceof RegExp) {\n return { __type: 'RegExpRef', source: value.source, flags: value.flags };\n }\n if (value instanceof URL) {\n return { __type: 'URLRef', href: value.href };\n }\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n const pairs = [];\n value.forEach((v, k) => pairs.push([k, v]));\n return { __type: 'HeadersRef', pairs };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8ArrayRef', data: Array.from(value) };\n }\n if (value instanceof ArrayBuffer) {\n return { __type: 'Uint8ArrayRef', data: Array.from(new Uint8Array(value)) };\n }\n if (typeof Request !== 'undefined' && value instanceof Request) {\n throw new Error('Cannot marshal Request from isolate. Use fetch callback instead.');\n }\n if (typeof Response !== 'undefined' && value instanceof Response) {\n throw new Error('Cannot marshal Response from isolate. Return plain objects instead.');\n }\n if (typeof File !== 'undefined' && value instanceof File) {\n throw new Error('Cannot marshal File from isolate.');\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n throw new Error('Cannot marshal Blob from isolate.');\n }\n if (typeof FormData !== 'undefined' && value instanceof FormData) {\n throw new Error('Cannot marshal FormData from isolate.');\n }\n if (Array.isArray(value)) {\n return value.map(v => marshalForHost(v, depth + 1));\n }\n // Plain object\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = marshalForHost(value[key], depth + 1);\n }\n return result;\n }\n return value;\n }\n\n // Unmarshal a value (Ref → JavaScript)\n function unmarshalFromHost(value, depth = 0) {\n if (depth > 100) throw new Error('Maximum unmarshalling depth exceeded');\n\n if (value === null) return null;\n if (typeof value !== 'object') return value;\n\n if (value.__type) {\n switch (value.__type) {\n case 'UndefinedRef': return undefined;\n case 'DateRef': return new Date(value.timestamp);\n case 'RegExpRef': return new RegExp(value.source, value.flags);\n case 'BigIntRef': return BigInt(value.value);\n case 'URLRef': return new URL(value.href);\n case 'HeadersRef': return new Headers(value.pairs);\n case 'Uint8ArrayRef': return new Uint8Array(value.data);\n case 'RequestRef': {\n const init = {\n method: value.method,\n headers: value.headers,\n body: value.body ? new Uint8Array(value.body) : null,\n };\n if (value.mode) init.mode = value.mode;\n if (value.credentials) init.credentials = value.credentials;\n if (value.cache) init.cache = value.cache;\n if (value.redirect) init.redirect = value.redirect;\n if (value.referrer) init.referrer = value.referrer;\n if (value.referrerPolicy) init.referrerPolicy = value.referrerPolicy;\n if (value.integrity) init.integrity = value.integrity;\n return new Request(value.url, init);\n }\n case 'ResponseRef': {\n return new Response(value.body ? new Uint8Array(value.body) : null, {\n status: value.status,\n statusText: value.statusText,\n headers: value.headers,\n });\n }\n case 'FileRef': {\n if (!value.name) {\n return new Blob([new Uint8Array(value.data)], { type: value.type });\n }\n return new File([new Uint8Array(value.data)], value.name, {\n type: value.type,\n lastModified: value.lastModified,\n });\n }\n case 'FormDataRef': {\n const fd = new FormData();\n for (const [key, entry] of value.entries) {\n if (typeof entry === 'string') {\n fd.append(key, entry);\n } else {\n const file = unmarshalFromHost(entry, depth + 1);\n fd.append(key, file);\n }\n }\n return fd;\n }\n case 'CallbackRef': {\n // Create a proxy function that invokes the callback\n const callbackId = value.callbackId;\n return function(...args) {\n const argsJson = JSON.stringify(marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [callbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return unmarshalFromHost(result.value);\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n }\n case 'PromiseRef': {\n // Create a proxy Promise that resolves via callback\n const promiseId = value.promiseId;\n return new Promise((resolve, reject) => {\n try {\n const argsJson = JSON.stringify([promiseId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [value.__resolveCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (result.ok) {\n resolve(unmarshalFromHost(result.value));\n } else {\n reject(new Error(result.error.message));\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n case 'AsyncIteratorRef': {\n const iteratorId = value.iteratorId;\n const nextCallbackId = value.__nextCallbackId;\n const returnCallbackId = value.__returnCallbackId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const argsJson = JSON.stringify([iteratorId]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [nextCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n return {\n done: result.value.done,\n value: unmarshalFromHost(result.value.value)\n };\n },\n async return(v) {\n const argsJson = JSON.stringify([iteratorId, marshalForHost(v)]);\n const resultJson = __customFn_invoke.applySyncPromise(undefined, [returnCallbackId, argsJson]);\n const result = JSON.parse(resultJson);\n return { done: true, value: result.ok ? unmarshalFromHost(result.value) : undefined };\n }\n };\n }\n default:\n // Unknown ref type, return as-is\n break;\n }\n }\n\n if (Array.isArray(value)) {\n return value.map(v => unmarshalFromHost(v, depth + 1));\n }\n\n // Plain object - recursively unmarshal\n const result = {};\n for (const key of Object.keys(value)) {\n result[key] = unmarshalFromHost(value[key], depth + 1);\n }\n return result;\n }\n\n globalThis.__marshalForHost = marshalForHost;\n globalThis.__unmarshalFromHost = unmarshalFromHost;\n})();\n`;\n\n// Threshold for daemon-local callback IDs (returned callbacks/promises/iterators)\nconst LOCAL_CALLBACK_THRESHOLD = 1_000_000;\n\n/**\n * Type guard for PromiseRef\n */\nfunction isPromiseRef(value: unknown): value is { __type: \"PromiseRef\"; promiseId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'PromiseRef'\n );\n}\n\n/**\n * Type guard for AsyncIteratorRef\n */\nfunction isAsyncIteratorRef(value: unknown): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'AsyncIteratorRef'\n );\n}\n\n/**\n * Type guard for CallbackRef\n */\nfunction isCallbackRef(value: unknown): value is { __type: \"CallbackRef\"; callbackId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'CallbackRef'\n );\n}\n\n/**\n * Check if a callback ID is for a daemon-local callback (returned from custom function)\n */\nfunction isLocalCallbackId(callbackId: number): boolean {\n return callbackId >= LOCAL_CALLBACK_THRESHOLD;\n}\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function invokes the client callback when called.\n * Results are marshalled/unmarshalled to preserve type fidelity across isolate boundary.\n *\n * Custom functions return Promises that resolve when the host callback completes.\n * Users should use `await` when calling these functions.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customCallbacks: CustomFunctionRegistrations,\n connection: ConnectionState,\n instance: IsolateInstance\n): Promise<void> {\n const global = context.global;\n\n /**\n * Create a MarshalContext for registering returned callbacks/promises/iterators.\n * These are registered on the instance so they can be invoked when the isolate calls back.\n */\n function createMarshalContext(): MarshalContext {\n return {\n registerCallback: (fn: Function): number => {\n const callbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(callbackId, fn);\n return callbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = instance.nextLocalCallbackId!++;\n instance.returnedPromises!.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = instance.nextLocalCallbackId!++;\n instance.returnedIterators!.set(iteratorId, iterator);\n return iteratorId;\n },\n };\n }\n\n /**\n * Post-process marshalled value to add callback IDs for PromiseRef and AsyncIteratorRef.\n * This recursively walks the value and adds __resolveCallbackId, __nextCallbackId, etc.\n */\n function addCallbackIdsToRefs(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check for PromiseRef - skip if already has callback ID (came from client)\n if (isPromiseRef(value)) {\n if ('__resolveCallbackId' in value) {\n // Already has callback ID from client, pass through\n return value;\n }\n // Create a resolve callback that waits for the promise\n const resolveCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(resolveCallbackId, async (promiseId: number) => {\n const promise = instance.returnedPromises!.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const result = await promise;\n // Clean up\n instance.returnedPromises!.delete(promiseId);\n // Marshal the result recursively\n const ctx = createMarshalContext();\n const marshalled = await marshalValue(result, ctx);\n return addCallbackIdsToRefs(marshalled);\n });\n return {\n ...value,\n __resolveCallbackId: resolveCallbackId,\n };\n }\n\n // Check for AsyncIteratorRef - skip if already has callback IDs (came from client)\n if (isAsyncIteratorRef(value)) {\n if ('__nextCallbackId' in value) {\n // Already has callback IDs from client, pass through\n return value;\n }\n // Create next callback\n const nextCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(nextCallbackId, async (iteratorId: number) => {\n const iterator = instance.returnedIterators!.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const result = await iterator.next();\n if (result.done) {\n instance.returnedIterators!.delete(iteratorId);\n }\n // Marshal the value recursively\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: result.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n // Create return callback\n const returnCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(returnCallbackId, async (iteratorId: number, returnValue?: unknown) => {\n const iterator = instance.returnedIterators!.get(iteratorId);\n instance.returnedIterators!.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const result = await iterator.return(returnValue);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n };\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(item => addCallbackIdsToRefs(item));\n }\n\n // Handle plain objects (recursively process values)\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = addCallbackIdsToRefs((value as Record<string, unknown>)[key]);\n }\n return result;\n }\n\n // Reference that invokes the callback and returns the result\n // Uses applySyncPromise which works in async contexts (serve handlers, etc.)\n // Args are JSON-encoded marshalled values, result is JSON-encoded marshalled value\n // Uses instance.callbackContext for dynamic connection lookup (supports runtime reuse)\n const invokeCallbackRef = new ivm.Reference(\n async (callbackId: number, argsJson: string) => {\n // Parse the JSON and unmarshal refs back to real types\n const marshalledArgs = JSON.parse(argsJson);\n const args = unmarshalValue(marshalledArgs) as unknown[];\n try {\n let result: unknown;\n\n if (isLocalCallbackId(callbackId)) {\n // Local callback (returned from a previous custom function call)\n const callback = instance.returnedCallbacks!.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n result = await callback(...args);\n } else {\n // Client callback - use dynamic connection lookup for runtime reuse support\n const conn = instance.callbackContext?.connection || connection;\n result = await invokeClientCallback(conn, callbackId, args);\n }\n\n // Marshal the result with context for registering returned callbacks/promises/iterators\n const ctx = createMarshalContext();\n const marshalledResult = await marshalValue({ ok: true, value: result }, ctx);\n // Add callback IDs to any PromiseRef/AsyncIteratorRef in the result\n const processedResult = addCallbackIdsToRefs(marshalledResult);\n return JSON.stringify(processedResult);\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Inject marshalling helpers into the isolate\n context.evalSync(ISOLATE_MARSHAL_CODE);\n\n // Create a global registry for custom function callback IDs\n // This allows updating callback IDs on runtime reuse without recreating wrapper functions\n const callbackIdMap: Record<string, number> = {};\n for (const [name, registration] of Object.entries(customCallbacks)) {\n callbackIdMap[name] = registration.callbackId;\n }\n global.setSync(\"__customFnCallbackIds\", new ivm.ExternalCopy(callbackIdMap).copyInto());\n\n // Create wrapper functions for each custom function\n // These use __customFnCallbackIds for dynamic callback ID lookup\n for (const [name, registration] of Object.entries(customCallbacks)) {\n // Skip companion callbacks (name:start, name:next, etc.) - they are used internally by asyncIterator\n if (name.includes(':')) {\n continue;\n }\n\n if (registration.type === 'sync') {\n // Sync function: use applySyncPromise (to await the host response) 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 callbackId = globalThis.__customFnCallbackIds[\"${name}\"];\n const argsJson = JSON.stringify(__marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [callbackId, argsJson]\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 (registration.type === 'asyncIterator') {\n // AsyncIterator function: look up companion callbacks and create async iterator wrapper\n const startReg = customCallbacks[`${name}:start`];\n const nextReg = customCallbacks[`${name}:next`];\n const returnReg = customCallbacks[`${name}:return`];\n const throwReg = customCallbacks[`${name}:throw`];\n\n if (!startReg || !nextReg || !returnReg || !throwReg) {\n throw new Error(`Missing companion callbacks for asyncIterator function \"${name}\"`);\n }\n\n context.evalSync(`\n globalThis.${name} = function(...args) {\n // Start the iterator and get the iteratorId\n const startCallbackId = globalThis.__customFnCallbackIds[\"${name}:start\"];\n const argsJson = JSON.stringify(__marshalForHost(args));\n const startResultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [startCallbackId, argsJson]\n );\n const startResult = JSON.parse(startResultJson);\n if (!startResult.ok) {\n const error = new Error(startResult.error.message);\n error.name = startResult.error.name;\n throw error;\n }\n const iteratorId = __unmarshalFromHost(startResult.value).iteratorId;\n\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const nextCallbackId = globalThis.__customFnCallbackIds[\"${name}:next\"];\n const argsJson = JSON.stringify(__marshalForHost([iteratorId]));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [nextCallbackId, argsJson]\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n const val = __unmarshalFromHost(result.value);\n return { done: val.done, value: val.value };\n },\n async return(v) {\n const returnCallbackId = globalThis.__customFnCallbackIds[\"${name}:return\"];\n const argsJson = JSON.stringify(__marshalForHost([iteratorId, v]));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [returnCallbackId, argsJson]\n );\n const result = JSON.parse(resultJson);\n return { done: true, value: result.ok ? __unmarshalFromHost(result.value) : undefined };\n },\n async throw(e) {\n const throwCallbackId = globalThis.__customFnCallbackIds[\"${name}:throw\"];\n const argsJson = JSON.stringify(__marshalForHost([iteratorId, { message: e?.message, name: e?.name }]));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [throwCallbackId, argsJson]\n );\n const result = JSON.parse(resultJson);\n if (!result.ok) {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n const val = __unmarshalFromHost(result.value);\n return { done: val.done, value: val.value };\n }\n };\n };\n `);\n } else if (registration.type === 'async') {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const callbackId = globalThis.__customFnCallbackIds[\"${name}\"];\n const argsJson = JSON.stringify(__marshalForHost(args));\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [callbackId, argsJson]\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 }\n }\n}\n\n/**\n * Create a module resolver function that invokes the client's module loader.\n */\nfunction createModuleResolver(\n instance: IsolateInstance,\n connection: ConnectionState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (specifier: string, _referrer: ivm.Module): Promise<ivm.Module> => {\n // Check cache first\n const cached = instance.moduleCache?.get(specifier);\n if (cached) return cached;\n\n if (!instance.moduleLoaderCallbackId) {\n throw new Error(`Module not found: ${specifier}`);\n }\n\n // Invoke client callback to get source code\n const code = (await invokeClientCallback(\n connection,\n instance.moduleLoaderCallbackId,\n [specifier]\n )) as string;\n\n // Compile the module\n const mod = await instance.runtime.isolate.compileModule(code, {\n filename: specifier,\n });\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(instance, connection);\n await mod.instantiate(instance.runtime.context, resolver);\n\n // Cache and return\n instance.moduleCache?.set(specifier, mod);\n return mod;\n };\n}\n\n// ============================================================================\n// Request/Response Serialization\n// ============================================================================\n\ninterface SerializedRequestData {\n method: string;\n url: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\ninterface SerializedResponseData {\n status: number;\n statusText: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\nasync function serializeRequest(request: Request): Promise<SerializedRequestData> {\n const headers: [string, string][] = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (request.body) {\n body = new Uint8Array(await request.arrayBuffer());\n }\n\n return {\n method: request.method,\n url: request.url,\n headers,\n body,\n };\n}\n\nasync function serializeResponse(response: Response): Promise<SerializedResponseData> {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (response.body) {\n body = new Uint8Array(await response.arrayBuffer());\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n}\n\nfunction deserializeResponse(data: SerializedResponseData): Response {\n return new Response(data.body as any, {\n status: data.status,\n statusText: data.statusText,\n headers: data.headers,\n });\n}\n\n// ============================================================================\n// Stream Handlers\n// ============================================================================\n\n/**\n * Handle STREAM_PUSH message (client uploading body chunks).\n */\nfunction handleStreamPush(message: StreamPush, connection: ConnectionState): void {\n const receiver = connection.streamReceivers.get(message.streamId);\n if (!receiver) {\n sendMessage(connection.socket, {\n type: MessageType.STREAM_ERROR,\n streamId: message.streamId,\n error: \"Stream not found\",\n });\n return;\n }\n\n receiver.chunks.push(message.chunk);\n receiver.totalBytes += message.chunk.length;\n\n // Send credit back to allow more chunks\n sendMessage(connection.socket, {\n type: MessageType.STREAM_PULL,\n streamId: message.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\n}\n\n/**\n * Handle STREAM_PULL message (client granting credit for response streaming).\n */\nfunction handleStreamPull(message: StreamPull, connection: ConnectionState): void {\n const session = connection.activeStreams.get(message.streamId);\n if (!session) {\n return; // Stream may have completed\n }\n\n session.credit += message.maxBytes;\n\n // Wake up waiting sender if there's a credit resolver\n if (session.creditResolver) {\n session.creditResolver();\n session.creditResolver = undefined;\n }\n}\n\n/**\n * Handle STREAM_CLOSE message (client signaling end of upload).\n */\nfunction handleStreamClose(message: StreamClose, connection: ConnectionState): void {\n const receiver = connection.streamReceivers.get(message.streamId);\n if (!receiver) {\n return;\n }\n\n // Concatenate all chunks and resolve\n const totalLength = receiver.chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const body = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of receiver.chunks) {\n body.set(chunk, offset);\n offset += chunk.length;\n }\n\n receiver.resolve(body);\n connection.streamReceivers.delete(message.streamId);\n}\n\n/**\n * Handle STREAM_ERROR message (client signaling upload error).\n */\nfunction handleStreamError(message: StreamError, connection: ConnectionState): void {\n const receiver = connection.streamReceivers.get(message.streamId);\n if (receiver) {\n receiver.reject(new Error(message.error));\n connection.streamReceivers.delete(message.streamId);\n }\n\n const session = connection.activeStreams.get(message.streamId);\n if (session) {\n session.state = \"closed\";\n connection.activeStreams.delete(message.streamId);\n }\n}\n\n/**\n * Helper to concatenate Uint8Arrays.\n */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\n/**\n * Wait for credit to become available on a stream session.\n */\nfunction waitForCredit(session: import(\"./types.mjs\").StreamSession): Promise<void> {\n return new Promise((resolve) => {\n session.creditResolver = resolve;\n });\n}\n\n/**\n * Send a response body as a stream.\n */\nasync function sendStreamedResponse(\n connection: ConnectionState,\n requestId: number,\n response: Response\n): Promise<void> {\n const streamId = connection.nextStreamId++;\n\n // Collect headers\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n // Send stream start with metadata\n const startMsg: ResponseStreamStart = {\n type: MessageType.RESPONSE_STREAM_START,\n requestId,\n streamId,\n metadata: {\n status: response.status,\n statusText: response.statusText,\n headers,\n },\n };\n sendMessage(connection.socket, startMsg);\n\n if (!response.body) {\n // No body, just end\n const endMsg: ResponseStreamEnd = {\n type: MessageType.RESPONSE_STREAM_END,\n requestId,\n streamId,\n };\n sendMessage(connection.socket, endMsg);\n return;\n }\n\n // Create stream session for tracking\n const session: import(\"./types.mjs\").StreamSession = {\n streamId,\n direction: \"download\",\n requestId,\n state: \"active\",\n bytesTransferred: 0,\n credit: STREAM_DEFAULT_CREDIT,\n };\n connection.activeStreams.set(streamId, session);\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n // Check credit (backpressure)\n while (session.credit < STREAM_CHUNK_SIZE && session.state === \"active\") {\n await waitForCredit(session);\n }\n\n if (session.state !== \"active\") {\n throw new Error(\"Stream cancelled\");\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n const endMsg: ResponseStreamEnd = {\n type: MessageType.RESPONSE_STREAM_END,\n requestId,\n streamId,\n };\n sendMessage(connection.socket, endMsg);\n break;\n }\n\n // Send chunk(s)\n for (let offset = 0; offset < value.length; offset += STREAM_CHUNK_SIZE) {\n const chunk = value.slice(offset, offset + STREAM_CHUNK_SIZE);\n\n const chunkMsg: ResponseStreamChunk = {\n type: MessageType.RESPONSE_STREAM_CHUNK,\n requestId,\n streamId,\n chunk,\n };\n sendMessage(connection.socket, chunkMsg);\n\n session.credit -= chunk.length;\n session.bytesTransferred += chunk.length;\n }\n }\n } catch (err) {\n const errorMsg: StreamError = {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n };\n sendMessage(connection.socket, errorMsg);\n } finally {\n reader.releaseLock();\n connection.activeStreams.delete(streamId);\n }\n}\n\n// ============================================================================\n// Test Environment Handlers\n// ============================================================================\n\n/**\n * Handle RUN_TESTS message.\n */\nasync function handleRunTests(\n message: RunTestsRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Run tests with optional timeout\n const timeout = message.timeout ?? 30000;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(\"Test timeout\")), timeout);\n });\n\n try {\n const results = await Promise.race([\n runTestsInContext(instance.runtime.context),\n timeoutPromise,\n ]);\n\n sendOk(connection.socket, message.requestId, results);\n } finally {\n // Always clear the timeout to prevent process from hanging\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle RESET_TEST_ENV message.\n */\nasync function handleResetTestEnv(\n message: ResetTestEnvRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n // Reset test environment state\n await instance.runtime.context.eval(\"__resetTestEnvironment()\", { promise: true });\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle HAS_TESTS message.\n */\nasync function handleHasTests(\n message: HasTestsRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const result = hasTestsInContext(instance.runtime.context);\n sendOk(connection.socket, message.requestId, result);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle GET_TEST_COUNT message.\n */\nasync function handleGetTestCount(\n message: GetTestCountRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.testEnvironmentEnabled) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const result = getTestCountInContext(instance.runtime.context);\n sendOk(connection.socket, message.requestId, result);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n// ============================================================================\n// Playwright Handlers\n// ============================================================================\n\n/**\n * Handle RUN_PLAYWRIGHT_TESTS message.\n * @deprecated Use testEnvironment.runTests() instead\n */\nasync function handleRunPlaywrightTests(\n message: RunPlaywrightTestsRequest,\n connection: ConnectionState,\n _state: DaemonState\n): Promise<void> {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"playwright.runTests() has been removed. Use testEnvironment.runTests() instead.\"\n );\n}\n\n/**\n * Handle RESET_PLAYWRIGHT_TESTS message.\n * @deprecated Use testEnvironment.reset() instead\n */\nasync function handleResetPlaywrightTests(\n message: ResetPlaywrightTestsRequest,\n connection: ConnectionState,\n _state: DaemonState\n): Promise<void> {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"playwright.reset() has been removed. Use testEnvironment.reset() instead.\"\n );\n}\n\n/**\n * Handle GET_COLLECTED_DATA message.\n */\nasync function handleGetCollectedData(\n message: GetCollectedDataRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.playwrightHandle) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Playwright not configured. Provide playwright.page in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n const data = {\n browserConsoleLogs: instance.playwrightHandle.getBrowserConsoleLogs(),\n networkRequests: instance.playwrightHandle.getNetworkRequests(),\n networkResponses: instance.playwrightHandle.getNetworkResponses(),\n };\n\n sendOk(connection.socket, message.requestId, data);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n\n/**\n * Handle CLEAR_COLLECTED_DATA message.\n */\nasync function handleClearCollectedData(\n message: ClearCollectedDataRequest,\n connection: ConnectionState,\n state: DaemonState\n): Promise<void> {\n const instance = state.isolates.get(message.isolateId);\n\n if (!instance) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.ISOLATE_NOT_FOUND,\n `Isolate not found: ${message.isolateId}`\n );\n return;\n }\n\n if (!instance.playwrightHandle) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n \"Playwright not configured. Provide playwright.page in createRuntime options.\"\n );\n return;\n }\n\n instance.lastActivity = Date.now();\n\n try {\n instance.playwrightHandle.clearCollected();\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "EC4C1FF56C0445D064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/index.mjs
CHANGED
|
@@ -24,7 +24,8 @@ async function startDaemon(options = {}) {
|
|
|
24
24
|
totalIsolatesCreated: 0,
|
|
25
25
|
totalRequestsProcessed: 0
|
|
26
26
|
},
|
|
27
|
-
options: resolvedOptions
|
|
27
|
+
options: resolvedOptions,
|
|
28
|
+
namespacedRuntimes: new Map
|
|
28
29
|
};
|
|
29
30
|
const server = createServer((socket) => {
|
|
30
31
|
handleConnection(socket, state);
|
|
@@ -69,6 +70,7 @@ async function startDaemon(options = {}) {
|
|
|
69
70
|
}
|
|
70
71
|
state.isolates.clear();
|
|
71
72
|
state.connections.clear();
|
|
73
|
+
state.namespacedRuntimes.clear();
|
|
72
74
|
await closeServer(server);
|
|
73
75
|
if (resolvedOptions.socketPath) {
|
|
74
76
|
try {
|
|
@@ -98,4 +100,4 @@ export {
|
|
|
98
100
|
startDaemon
|
|
99
101
|
};
|
|
100
102
|
|
|
101
|
-
//# debugId=
|
|
103
|
+
//# debugId=0CDF49C6B0636B7964756E2164756E21
|