@ricsam/isolate-daemon 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 path from \"node:path\";\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 normalizeEntryFilename,\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 type CallbackStreamStart,\n type CallbackStreamChunk,\n type CallbackStreamEnd,\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 {\n transformEntryCode,\n transformModuleCode,\n contentHash,\n mapErrorStack,\n type SourceMap,\n} from \"@ricsam/isolate-transform\";\nimport type {\n DaemonState,\n ConnectionState,\n IsolateInstance,\n PendingRequest,\n CallbackContext,\n CallbackStreamReceiver,\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 callbackStreamReceivers: 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 // Callback streaming messages (for streaming fetch callback responses)\n case MessageType.CALLBACK_STREAM_START:\n handleCallbackStreamStart(message as CallbackStreamStart, connection);\n break;\n\n case MessageType.CALLBACK_STREAM_CHUNK:\n handleCallbackStreamChunk(message as CallbackStreamChunk, connection);\n break;\n\n case MessageType.CALLBACK_STREAM_END:\n handleCallbackStreamEnd(message as CallbackStreamEnd, 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 // Use longer timeout for fetch callbacks since they may involve streaming\n // The timeout is for the initial response, streaming continues after\n 60000\n );\n\n // Check if this is a streaming response\n if (result && typeof result === 'object' && (result as { __streamingResponse?: boolean }).__streamingResponse) {\n // Streaming response - return the Response directly\n // Mark it so fetch setup knows to stream it to the isolate\n const response = (result as { response: Response }).response;\n (response as Response & { __isCallbackStream?: boolean }).__isCallbackStream = true;\n return response;\n }\n\n // Buffered response - deserialize\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 instance.moduleToFilename = 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, stdout: event.stdout, 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 // Normalize filename to absolute path for module resolution\n const filename = normalizeEntryFilename(message.filename);\n\n // Transform entry code: strip types, validate, wrap in async function\n const transformed = await transformEntryCode(message.code, filename);\n if (transformed.sourceMap) {\n if (!instance.sourceMaps) {\n instance.sourceMaps = new Map();\n }\n instance.sourceMaps.set(filename, transformed.sourceMap);\n }\n\n // Compile as ES module\n const mod = await instance.runtime.isolate.compileModule(transformed.code, {\n filename,\n });\n\n // Instantiate with module resolver if available\n if (instance.moduleLoaderCallbackId) {\n // Track entry module filename for nested imports\n instance.moduleToFilename?.set(mod, filename);\n\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 - only resolves imports and defines the default function (no timeout needed)\n await mod.evaluate();\n\n // Get the default export and run it with timeout\n const ns = mod.namespace;\n const runRef = await ns.get(\"default\", { reference: true });\n try {\n await runRef.apply(undefined, [], {\n result: { promise: true },\n ...(message.maxExecutionMs\n ? { timeout: message.maxExecutionMs }\n : {}),\n });\n } finally {\n runRef.release();\n }\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 // Map error stack through source maps\n if (error.stack && instance.sourceMaps?.size) {\n error.stack = mapErrorStack(error.stack, instance.sourceMaps);\n }\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 // Get importer info\n const importerPath = instance.moduleToFilename?.get(referrer) ?? \"<unknown>\";\n const importerResolveDir = path.posix.dirname(importerPath);\n\n // Invoke client callback - now always returns { code, resolveDir }\n const result = (await invokeClientCallback(\n connection,\n instance.moduleLoaderCallbackId,\n [specifier, { path: importerPath, resolveDir: importerResolveDir }]\n )) as { code: string; resolveDir: string };\n\n const { code, resolveDir } = result;\n\n // Check cache by content hash\n const hash = contentHash(code);\n const cacheKey = `${specifier}:${hash}`;\n const hashCached = instance.moduleCache?.get(cacheKey);\n if (hashCached) return hashCached;\n\n // Transform module code (strip types)\n const transformed = await transformModuleCode(code, specifier);\n if (transformed.sourceMap) {\n if (!instance.sourceMaps) {\n instance.sourceMaps = new Map();\n }\n instance.sourceMaps.set(specifier, transformed.sourceMap);\n }\n\n // Compile the module\n const mod = await instance.runtime.isolate.compileModule(transformed.code, {\n filename: specifier,\n });\n\n // Construct resolved path and track for nested imports\n const resolvedPath = path.posix.join(resolveDir, path.posix.basename(specifier));\n instance.moduleToFilename?.set(mod, resolvedPath);\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 (both specifier and specifier:hash for content-based invalidation)\n instance.moduleCache?.set(specifier, mod);\n instance.moduleCache?.set(cacheKey, 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 // Also handle callback stream receivers\n const callbackReceiver = connection.callbackStreamReceivers.get(message.streamId);\n if (callbackReceiver && callbackReceiver.state === \"active\") {\n callbackReceiver.state = \"errored\";\n callbackReceiver.error = new Error(message.error);\n\n // Resolve all pending pull promises so the stream can error properly\n const resolvers = callbackReceiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n connection.callbackStreamReceivers.delete(message.streamId);\n }\n}\n\n// ============================================================================\n// Callback Stream Handlers (for streaming fetch callback responses)\n// ============================================================================\n\n/**\n * Handle CALLBACK_STREAM_START message.\n * Creates a ReadableStream and resolves the pending callback with a Response.\n */\nfunction handleCallbackStreamStart(\n message: CallbackStreamStart,\n connection: ConnectionState\n): void {\n // Create a partial receiver that will be completed when the stream is created\n const receiver: CallbackStreamReceiver = {\n streamId: message.streamId,\n requestId: message.requestId,\n metadata: message.metadata,\n controller: null as unknown as ReadableStreamDefaultController<Uint8Array>,\n state: \"active\",\n pendingChunks: [],\n pullResolvers: [],\n controllerFinalized: false,\n };\n\n // Create a ReadableStream that yields chunks as they arrive\n const readableStream = new ReadableStream<Uint8Array>({\n start(controller) {\n receiver.controller = controller;\n },\n pull(_controller) {\n // If controller is already finalized, just return\n if (receiver.controllerFinalized) {\n return;\n }\n\n // If there's a pending chunk, enqueue ONE chunk and return\n // This preserves streaming behavior - one chunk per pull\n if (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\n return Promise.resolve();\n }\n\n // If stream is already closed or errored, handle it\n if (receiver.state === \"closed\") {\n if (!receiver.controllerFinalized) {\n receiver.controllerFinalized = true;\n receiver.controller.close();\n }\n return Promise.resolve();\n }\n if (receiver.state === \"errored\") {\n if (!receiver.controllerFinalized && receiver.error) {\n receiver.controllerFinalized = true;\n receiver.controller.error(receiver.error);\n }\n return Promise.resolve();\n }\n\n // Return a promise that resolves when the next chunk arrives\n return new Promise<void>((resolve) => {\n receiver.pullResolvers.push(resolve);\n });\n },\n cancel(_reason) {\n receiver.state = \"closed\";\n receiver.controllerFinalized = true;\n\n // Resolve all pending pull promises\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n connection.callbackStreamReceivers.delete(message.streamId);\n\n // Tell the client to stop streaming this response body\n sendMessage(connection.socket, {\n type: MessageType.CALLBACK_STREAM_CANCEL,\n streamId: message.streamId,\n });\n\n return Promise.resolve();\n },\n });\n\n connection.callbackStreamReceivers.set(message.streamId, receiver);\n\n // Create Response and resolve the pending callback\n const pending = connection.pendingCallbacks.get(message.requestId);\n if (pending) {\n connection.pendingCallbacks.delete(message.requestId);\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n const response = new Response(readableStream, {\n status: message.metadata.status,\n statusText: message.metadata.statusText,\n headers: message.metadata.headers,\n });\n\n // Resolve with the streaming Response\n pending.resolve({ __streamingResponse: true, response });\n }\n}\n\n/**\n * Handle CALLBACK_STREAM_CHUNK message.\n * Enqueues a chunk to the stream controller.\n */\nfunction handleCallbackStreamChunk(\n message: CallbackStreamChunk,\n connection: ConnectionState\n): void {\n const receiver = connection.callbackStreamReceivers.get(message.streamId);\n if (receiver && receiver.state === \"active\") {\n if (receiver.pullResolvers.length > 0) {\n // Consumer is waiting for data - enqueue directly and resolve one pending pull\n receiver.controller.enqueue(message.chunk);\n const resolver = receiver.pullResolvers.shift()!;\n resolver();\n } else {\n // Consumer not ready - buffer the chunk\n receiver.pendingChunks.push(message.chunk);\n }\n }\n}\n\n/**\n * Handle CALLBACK_STREAM_END message.\n * Closes the stream controller.\n */\nfunction handleCallbackStreamEnd(\n message: CallbackStreamEnd,\n connection: ConnectionState\n): void {\n const receiver = connection.callbackStreamReceivers.get(message.streamId);\n if (receiver) {\n // Mark stream as closed\n receiver.state = \"closed\";\n\n // Flush any remaining pending chunks\n while (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\n }\n\n // Close the stream (only if not already finalized)\n if (!receiver.controllerFinalized) {\n receiver.controllerFinalized = true;\n receiver.controller.close();\n }\n\n // Resolve all pending pull promises\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n // Clean up\n connection.callbackStreamReceivers.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"
5
+ "/**\n * Connection handling for the isolate daemon.\n */\n\nimport type { Socket } from \"node:net\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n ErrorCode,\n STREAM_THRESHOLD,\n STREAM_CHUNK_SIZE,\n STREAM_DEFAULT_CREDIT,\n marshalValue,\n unmarshalValue,\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 GetCollectedDataRequest,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\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 type CallbackStreamStart,\n type CallbackStreamChunk,\n type CallbackStreamEnd,\n type ClientWsConnectRequest,\n type ClientWsSendRequest,\n type ClientWsCloseRequest,\n type ClientWsOpenedMessage,\n type ClientWsMessageMessage,\n type ClientWsClosedMessage,\n type ClientWsErrorMessage,\n type FetchRequestInit,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createCallbackFileSystemHandler } from \"./callback-fs-handler.mjs\";\nimport {\n createRuntime,\n type RuntimeHandle,\n type CustomFunctionsMarshalOptions,\n} from \"@ricsam/isolate-runtime\";\nimport type {\n DaemonState,\n ConnectionState,\n IsolateInstance,\n PendingRequest,\n CallbackContext,\n CallbackStreamReceiver,\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 callbackStreamReceivers: 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 instance.runtime.dispose().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.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 // Callback streaming messages (for streaming fetch callback responses)\n case MessageType.CALLBACK_STREAM_START:\n handleCallbackStreamStart(message as CallbackStreamStart, connection);\n break;\n\n case MessageType.CALLBACK_STREAM_CHUNK:\n handleCallbackStreamChunk(message as CallbackStreamChunk, connection);\n break;\n\n case MessageType.CALLBACK_STREAM_END:\n handleCallbackStreamEnd(message as CallbackStreamEnd, connection);\n break;\n\n // Client WebSocket events (from client, forwarded to isolate)\n case MessageType.CLIENT_WS_OPENED:\n handleClientWsOpened(message as ClientWsOpenedMessage, connection, state);\n break;\n\n case MessageType.CLIENT_WS_MESSAGE:\n handleClientWsMessage(message as ClientWsMessageMessage, connection, state);\n break;\n\n case MessageType.CLIENT_WS_CLOSED:\n handleClientWsClosed(message as ClientWsClosedMessage, connection, state);\n break;\n\n case MessageType.CLIENT_WS_ERROR:\n handleClientWsError(message as ClientWsErrorMessage, connection, state);\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.\n */\nfunction softDeleteRuntime(instance: IsolateInstance, state: DaemonState): void {\n instance.isDisposed = true;\n instance.disposedAt = Date.now();\n instance.ownerConnection = null;\n if (instance.callbackContext) {\n instance.callbackContext.connection = null;\n }\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.runtime.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 // Clear module cache (staticModuleCache and transformCache preserved by clearModuleCache)\n instance.runtime.clearModuleCache();\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 const testEnvOptions =\n message.options.testEnvironment != null &&\n typeof message.options.testEnvironment === \"object\"\n ? message.options.testEnvironment\n : undefined;\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 instance.callbackContext.testEnvironmentOnEvent =\n testEnvOptions?.callbacks?.onEvent?.callbackId;\n instance.callbackContext.playwright = {\n handlerCallbackId: callbacks?.playwright?.handlerCallbackId,\n onBrowserConsoleLogCallbackId:\n callbacks?.playwright?.onBrowserConsoleLogCallbackId,\n onNetworkRequestCallbackId:\n callbacks?.playwright?.onNetworkRequestCallbackId,\n onNetworkResponseCallbackId:\n callbacks?.playwright?.onNetworkResponseCallbackId,\n };\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.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 if (testEnvOptions?.callbacks?.onEvent) {\n instance.callbacks.set(testEnvOptions.callbacks.onEvent.callbackId, {\n ...testEnvOptions.callbacks.onEvent,\n name: \"testEnvironment.onEvent\",\n });\n }\n\n if (callbacks?.playwright) {\n instance.callbacks.set(callbacks.playwright.handlerCallbackId, {\n callbackId: callbacks.playwright.handlerCallbackId,\n name: \"playwright.handler\",\n type: \"async\",\n });\n if (callbacks.playwright.onBrowserConsoleLogCallbackId !== undefined) {\n instance.callbacks.set(callbacks.playwright.onBrowserConsoleLogCallbackId, {\n callbackId: callbacks.playwright.onBrowserConsoleLogCallbackId,\n name: \"playwright.onBrowserConsoleLog\",\n type: \"sync\",\n });\n }\n if (callbacks.playwright.onNetworkRequestCallbackId !== undefined) {\n instance.callbacks.set(callbacks.playwright.onNetworkRequestCallbackId, {\n callbackId: callbacks.playwright.onNetworkRequestCallbackId,\n name: \"playwright.onNetworkRequest\",\n type: \"sync\",\n });\n }\n if (callbacks.playwright.onNetworkResponseCallbackId !== undefined) {\n instance.callbacks.set(callbacks.playwright.onNetworkResponseCallbackId, {\n callbackId: callbacks.playwright.onNetworkResponseCallbackId,\n name: \"playwright.onNetworkResponse\",\n type: \"sync\",\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\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 */\nasync function evictOldestDisposedRuntime(state: DaemonState): Promise<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 await 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 (!(await 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 // 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 testEnvironmentOnEvent:\n message.options.testEnvironment != null &&\n typeof message.options.testEnvironment === \"object\"\n ? message.options.testEnvironment.callbacks?.onEvent?.callbackId\n : undefined,\n playwright: {\n handlerCallbackId: message.options.callbacks?.playwright?.handlerCallbackId,\n onBrowserConsoleLogCallbackId:\n message.options.callbacks?.playwright?.onBrowserConsoleLogCallbackId,\n onNetworkRequestCallbackId:\n message.options.callbacks?.playwright?.onNetworkRequestCallbackId,\n onNetworkResponseCallbackId:\n message.options.callbacks?.playwright?.onNetworkResponseCallbackId,\n },\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 // Pre-create the instance object so marshalOptions closures can reference it\n // (needed for returned callbacks/promises/iterators registration)\n const instance: IsolateInstance = {\n isolateId,\n runtime: null as unknown as RuntimeHandle, // Set after createRuntime\n ownerConnection: connection.socket,\n callbacks: new Map(),\n createdAt: Date.now(),\n lastActivity: Date.now(),\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 // Build custom functions as local IPC-bridged implementations\n type CustomFunctions = Record<string, { type: \"sync\" | \"async\" | \"asyncIterator\"; fn: (...args: unknown[]) => unknown }>;\n let bridgedCustomFunctions: CustomFunctions | undefined;\n let customFnMarshalOptions: CustomFunctionsMarshalOptions | undefined;\n\n if (customCallbacks) {\n // Create MarshalContext factory and addCallbackIdsToRefs for custom function results\n const createMarshalContext = (): MarshalContext => ({\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 const isPromiseRef = (value: unknown): value is { __type: \"PromiseRef\"; promiseId: number } =>\n typeof value === 'object' && value !== null && (value as { __type?: string }).__type === 'PromiseRef';\n const isAsyncIteratorRef = (value: unknown): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } =>\n typeof value === 'object' && value !== null && (value as { __type?: string }).__type === 'AsyncIteratorRef';\n\n const addCallbackIdsToRefs = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') return value;\n\n if (isPromiseRef(value)) {\n if ('__resolveCallbackId' in value) return value;\n const resolveCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(resolveCallbackId, async (promiseId: number) => {\n const promise = instance.returnedPromises!.get(promiseId);\n if (!promise) throw new Error(`Promise ${promiseId} not found`);\n const result = await promise;\n instance.returnedPromises!.delete(promiseId);\n const ctx = createMarshalContext();\n const marshalled = await marshalValue(result, ctx);\n return addCallbackIdsToRefs(marshalled);\n });\n return { ...value, __resolveCallbackId: resolveCallbackId };\n }\n\n if (isAsyncIteratorRef(value)) {\n if ('__nextCallbackId' in value) return value;\n const nextCallbackId = instance.nextLocalCallbackId!++;\n instance.returnedCallbacks!.set(nextCallbackId, async (iteratorId: number) => {\n const iterator = instance.returnedIterators!.get(iteratorId);\n if (!iterator) throw new Error(`Iterator ${iteratorId} not found`);\n const result = await iterator.next();\n if (result.done) instance.returnedIterators!.delete(iteratorId);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return { done: result.done, value: addCallbackIdsToRefs(marshalledValue) };\n });\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) return { done: true, value: undefined };\n const result = await iterator.return(returnValue);\n const ctx = createMarshalContext();\n const marshalledValue = await marshalValue(result.value, ctx);\n return { done: true, value: addCallbackIdsToRefs(marshalledValue) };\n });\n return { ...value, __nextCallbackId: nextCallbackId, __returnCallbackId: returnCallbackId };\n }\n\n if (Array.isArray(value)) return value.map(item => addCallbackIdsToRefs(item));\n\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 const LOCAL_CALLBACK_THRESHOLD = 1_000_000;\n\n const invokeCallback = async (callbackId: number, args: unknown[]): Promise<unknown> => {\n if (callbackId >= LOCAL_CALLBACK_THRESHOLD) {\n // Local callback (returned from a previous custom function call on the daemon)\n const callback = instance.returnedCallbacks!.get(callbackId);\n if (!callback) {\n throw new Error(`Local callback ${callbackId} not found`);\n }\n return await callback(...args);\n } else {\n // Client-side callback — forward via IPC\n const conn = callbackContext.connection;\n if (!conn) {\n throw new Error(`No connection available for callback ${callbackId}`);\n }\n return invokeClientCallback(conn, callbackId, args);\n }\n };\n\n customFnMarshalOptions = { createMarshalContext, addCallbackIdsToRefs, invokeCallback };\n\n // Build bridged custom functions\n // The invokeCallbackRef in setupCustomFunctions (in runtime) will call these bridged functions.\n // For client callbacks, these functions invoke IPC; for local callbacks (returned from previous calls),\n // they invoke from the instance registries.\n bridgedCustomFunctions = {};\n\n for (const [name, registration] of Object.entries(customCallbacks)) {\n // Skip companion callbacks for asyncIterator (name:start, etc.)\n if (name.includes(':')) continue;\n\n const callbackContext_ = callbackContext; // Capture for closure\n\n if (registration.type === 'asyncIterator') {\n // AsyncIterator: create start/next/return/throw as a single asyncIterator function\n bridgedCustomFunctions[name] = {\n type: 'asyncIterator' as const,\n fn: (...args: unknown[]) => {\n // Return an async generator that bridges to client callbacks\n const startCallbackId = callbackContext_.custom.get(`${name}:start`);\n const nextCallbackId = callbackContext_.custom.get(`${name}:next`);\n const returnCallbackId = callbackContext_.custom.get(`${name}:return`);\n\n // Create async generator\n async function* bridgedIterator() {\n // Start the iterator on the client\n const conn = callbackContext_.connection;\n if (!conn || startCallbackId === undefined) {\n throw new Error(`AsyncIterator callback '${name}' not available`);\n }\n\n const startResult = await invokeClientCallback(conn, startCallbackId, args) as { iteratorId: number };\n const iteratorId = startResult.iteratorId;\n\n try {\n while (true) {\n const nextConn = callbackContext_.connection;\n if (!nextConn || nextCallbackId === undefined) {\n throw new Error(`AsyncIterator callback '${name}' not available`);\n }\n const nextResult = await invokeClientCallback(nextConn, nextCallbackId, [iteratorId]) as { done: boolean; value: unknown };\n if (nextResult.done) return nextResult.value;\n yield nextResult.value;\n }\n } finally {\n // Call return on cleanup\n const retConn = callbackContext_.connection;\n if (retConn && returnCallbackId !== undefined) {\n await invokeClientCallback(retConn, returnCallbackId, [iteratorId]).catch(() => {});\n }\n }\n }\n\n return bridgedIterator();\n },\n };\n } else {\n // Sync or async function — both bridge to IPC (which is always async)\n // The runtime's setupCustomFunctions handles the sync/async wrapping in the isolate\n bridgedCustomFunctions[name] = {\n type: registration.type as 'sync' | 'async',\n fn: async (...args: unknown[]) => {\n const conn = callbackContext_.connection;\n const cbId = callbackContext_.custom.get(name);\n if (!conn || cbId === undefined) {\n throw new Error(`Custom function callback '${name}' not available`);\n }\n return invokeClientCallback(conn, cbId, args);\n },\n };\n }\n }\n }\n\n // Build module loader if registered\n let moduleLoader: ((specifier: string, importer: { path: string; resolveDir: string }) => Promise<{ code: string; resolveDir: string; static?: boolean }>) | undefined;\n if (moduleLoaderCallback) {\n moduleLoader = async (specifier: string, importer: { path: string; resolveDir: string }) => {\n const conn = callbackContext.connection;\n const cbId = callbackContext.moduleLoader;\n if (!conn || cbId === undefined) {\n throw new Error(\"Module loader callback not available\");\n }\n return invokeClientCallback(conn, cbId, [specifier, importer]) as Promise<{ code: string; resolveDir: string; static?: boolean }>;\n };\n }\n\n // Build test environment options\n let testEnvironment: boolean | { onEvent?: (event: unknown) => void; testTimeout?: number } | undefined;\n if (message.options.testEnvironment) {\n const testEnvOption = message.options.testEnvironment;\n const testEnvOptions = typeof testEnvOption === \"object\" ? testEnvOption : undefined;\n testEnvironment = {\n onEvent: testEnvOptions?.callbacks?.onEvent\n ? (event: unknown) => {\n const conn = callbackContext.connection;\n const callbackId = callbackContext.testEnvironmentOnEvent;\n if (!conn || callbackId === undefined) {\n return;\n }\n const promise = invokeClientCallback(\n conn,\n callbackId,\n [JSON.stringify(event)]\n ).catch(() => {});\n // Push to runtime's pendingCallbacks (will be set after createRuntime)\n instance.runtime?.pendingCallbacks?.push(promise);\n }\n : undefined,\n testTimeout: testEnvOptions?.testTimeout,\n };\n\n // Store callback registration\n if (testEnvOptions?.callbacks?.onEvent) {\n instance.callbacks.set(testEnvOptions.callbacks.onEvent.callbackId, {\n ...testEnvOptions.callbacks.onEvent,\n name: \"testEnvironment.onEvent\",\n });\n }\n }\n\n // Build playwright options\n let playwrightOptions: { handler: (op: PlaywrightOperation) => Promise<PlaywrightResult>; console?: boolean; onEvent?: (event: { type: string; level?: string; stdout?: string; timestamp?: number; [key: string]: unknown }) => void } | undefined;\n const playwrightCallbacks = message.options.callbacks?.playwright;\n if (playwrightCallbacks) {\n playwrightOptions = {\n handler: async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n const conn = callbackContext.connection;\n const callbackId = callbackContext.playwright.handlerCallbackId;\n if (!conn || callbackId === undefined) {\n return {\n ok: false,\n error: {\n name: \"Error\",\n message: \"Playwright handler callback not available\",\n },\n };\n }\n try {\n const resultJson = await invokeClientCallback(\n conn,\n callbackId,\n [JSON.stringify(op)],\n 60000\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 console: playwrightCallbacks.console,\n onEvent: (event: { type: string; level?: string; stdout?: string; timestamp?: number; [key: string]: unknown }) => {\n const conn = callbackContext.connection;\n if (!conn) {\n return;\n }\n\n if (\n event.type === \"browserConsoleLog\" &&\n callbackContext.playwright.onBrowserConsoleLogCallbackId !== undefined\n ) {\n const promise = invokeClientCallback(\n conn,\n callbackContext.playwright.onBrowserConsoleLogCallbackId,\n [{ level: event.level, stdout: event.stdout, timestamp: event.timestamp }]\n ).catch(() => {});\n instance.runtime?.pendingCallbacks?.push(promise);\n } else if (\n event.type === \"networkRequest\" &&\n callbackContext.playwright.onNetworkRequestCallbackId !== undefined\n ) {\n const promise = invokeClientCallback(\n conn,\n callbackContext.playwright.onNetworkRequestCallbackId,\n [event]\n ).catch(() => {});\n instance.runtime?.pendingCallbacks?.push(promise);\n } else if (\n event.type === \"networkResponse\" &&\n callbackContext.playwright.onNetworkResponseCallbackId !== undefined\n ) {\n const promise = invokeClientCallback(\n conn,\n callbackContext.playwright.onNetworkResponseCallbackId,\n [event]\n ).catch(() => {});\n instance.runtime?.pendingCallbacks?.push(promise);\n }\n },\n };\n }\n\n // Create the runtime using the unified createRuntime()\n const runtime = await createRuntime({\n memoryLimitMB: message.options.memoryLimitMB ?? state.options.defaultMemoryLimitMB,\n cwd: message.options.cwd,\n // Console handler that bridges to client via IPC\n console: {\n onEntry: (entry) => {\n const conn = callbackContext.connection;\n const callbackId = callbackContext.consoleOnEntry;\n if (!conn || callbackId === undefined) return;\n const promise = invokeClientCallback(conn, callbackId, [entry]).catch(() => {});\n runtime.pendingCallbacks.push(promise);\n },\n },\n // Fetch handler that bridges to client via IPC\n fetch: async (url: string, init: FetchRequestInit) => {\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 const serialized: SerializedRequestData = {\n url,\n method: init.method,\n headers: init.headers,\n body: init.rawBody,\n };\n const result = await invokeClientCallback(conn, callbackId, [serialized], 60000);\n if (result && typeof result === 'object' && (result as { __streamingResponse?: boolean }).__streamingResponse) {\n const response = (result as { response: Response }).response;\n (response as Response & { __isCallbackStream?: boolean }).__isCallbackStream = true;\n return response;\n }\n return deserializeResponse(result as SerializedResponseData);\n },\n // FS handler that bridges to client via IPC\n fs: {\n getDirectory: async (dirPath: string) => {\n const conn = callbackContext.connection;\n if (!conn) {\n throw new Error(\"FS callbacks not available\");\n }\n return createCallbackFileSystemHandler({\n connection: conn,\n callbackContext,\n invokeClientCallback,\n basePath: dirPath,\n });\n },\n },\n // Module loader that bridges to client via IPC\n moduleLoader,\n // Custom functions bridged to client via IPC\n customFunctions: bridgedCustomFunctions as any,\n customFunctionsMarshalOptions: customFnMarshalOptions,\n // Test environment\n testEnvironment,\n // Playwright\n playwright: playwrightOptions as any,\n });\n\n // Set the runtime on the pre-created instance\n instance.runtime = runtime;\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 if (playwrightCallbacks) {\n instance.callbacks.set(playwrightCallbacks.handlerCallbackId, {\n callbackId: playwrightCallbacks.handlerCallbackId,\n name: \"playwright.handler\",\n type: \"async\",\n });\n if (playwrightCallbacks.onBrowserConsoleLogCallbackId !== undefined) {\n instance.callbacks.set(playwrightCallbacks.onBrowserConsoleLogCallbackId, {\n callbackId: playwrightCallbacks.onBrowserConsoleLogCallbackId,\n name: \"playwright.onBrowserConsoleLog\",\n type: \"sync\",\n });\n }\n if (playwrightCallbacks.onNetworkRequestCallbackId !== undefined) {\n instance.callbacks.set(playwrightCallbacks.onNetworkRequestCallbackId, {\n callbackId: playwrightCallbacks.onNetworkRequestCallbackId,\n name: \"playwright.onNetworkRequest\",\n type: \"sync\",\n });\n }\n if (playwrightCallbacks.onNetworkResponseCallbackId !== undefined) {\n instance.callbacks.set(playwrightCallbacks.onNetworkResponseCallbackId, {\n callbackId: playwrightCallbacks.onNetworkResponseCallbackId,\n name: \"playwright.onNetworkResponse\",\n type: \"sync\",\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 runtime.fetch.onWebSocketCommand((cmd) => {\n const targetConnection = callbackContext.connection;\n if (!targetConnection) {\n return;\n }\n\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(targetConnection.socket, wsCommandMsg);\n });\n\n // Forward client WebSocket commands from isolate to client\n runtime.fetch.onClientWebSocketCommand((cmd) => {\n const targetConnection = callbackContext.connection;\n if (!targetConnection) {\n return;\n }\n\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 if (cmd.type === \"connect\") {\n const msg: ClientWsConnectRequest = {\n type: MessageType.CLIENT_WS_CONNECT,\n requestId: 0,\n isolateId,\n socketId: cmd.socketId,\n url: cmd.url!,\n protocols: cmd.protocols,\n };\n sendMessage(targetConnection.socket, msg);\n } else if (cmd.type === \"send\") {\n const msg: ClientWsSendRequest = {\n type: MessageType.CLIENT_WS_SEND,\n requestId: 0,\n isolateId,\n socketId: cmd.socketId,\n data: data!,\n };\n sendMessage(targetConnection.socket, msg);\n } else if (cmd.type === \"close\") {\n const msg: ClientWsCloseRequest = {\n type: MessageType.CLIENT_WS_CLOSE,\n requestId: 0,\n isolateId,\n socketId: cmd.socketId,\n code: cmd.code,\n reason: cmd.reason,\n };\n sendMessage(targetConnection.socket, msg);\n }\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 await 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 // Delegate to RuntimeHandle.eval() which handles:\n // - Transform, compile, instantiate, evaluate, source maps\n // - Module resolution via moduleLoader callback\n // - Pending callback flushing\n await instance.runtime.eval(message.code, {\n filename: message.filename,\n maxExecutionMs: message.maxExecutionMs,\n });\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// Client WebSocket Event Handlers (outbound connections from isolate)\n// ============================================================================\n\n/**\n * Handle CLIENT_WS_OPENED message from client.\n * Dispatches open event to the WebSocket instance in the isolate.\n */\nfunction handleClientWsOpened(\n message: ClientWsOpenedMessage,\n connection: ConnectionState,\n state: DaemonState\n): void {\n const instance = state.isolates.get(message.isolateId);\n if (!instance) return;\n\n instance.lastActivity = Date.now();\n instance.runtime.fetch.dispatchClientWebSocketOpen(\n message.socketId,\n message.protocol,\n message.extensions\n );\n}\n\n/**\n * Handle CLIENT_WS_MESSAGE message from client.\n * Dispatches message event to the WebSocket instance in the isolate.\n */\nfunction handleClientWsMessage(\n message: ClientWsMessageMessage,\n connection: ConnectionState,\n state: DaemonState\n): void {\n const instance = state.isolates.get(message.isolateId);\n if (!instance) return;\n\n instance.lastActivity = Date.now();\n\n // Convert Uint8Array to ArrayBuffer if needed\n const data = message.data instanceof Uint8Array\n ? message.data.buffer.slice(\n message.data.byteOffset,\n message.data.byteOffset + message.data.byteLength\n ) as ArrayBuffer\n : message.data;\n\n instance.runtime.fetch.dispatchClientWebSocketMessage(message.socketId, data);\n}\n\n/**\n * Handle CLIENT_WS_CLOSED message from client.\n * Dispatches close event to the WebSocket instance in the isolate.\n */\nfunction handleClientWsClosed(\n message: ClientWsClosedMessage,\n connection: ConnectionState,\n state: DaemonState\n): void {\n const instance = state.isolates.get(message.isolateId);\n if (!instance) return;\n\n instance.lastActivity = Date.now();\n instance.runtime.fetch.dispatchClientWebSocketClose(\n message.socketId,\n message.code,\n message.reason,\n message.wasClean\n );\n}\n\n/**\n * Handle CLIENT_WS_ERROR message from client.\n * Dispatches error event to the WebSocket instance in the isolate.\n */\nfunction handleClientWsError(\n message: ClientWsErrorMessage,\n connection: ConnectionState,\n state: DaemonState\n): void {\n const instance = state.isolates.get(message.isolateId);\n if (!instance) return;\n\n instance.lastActivity = Date.now();\n instance.runtime.fetch.dispatchClientWebSocketError(message.socketId);\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// 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 // Also handle callback stream receivers\n const callbackReceiver = connection.callbackStreamReceivers.get(message.streamId);\n if (callbackReceiver && callbackReceiver.state === \"active\") {\n callbackReceiver.state = \"errored\";\n callbackReceiver.error = new Error(message.error);\n\n // Resolve all pending pull promises so the stream can error properly\n const resolvers = callbackReceiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n connection.callbackStreamReceivers.delete(message.streamId);\n }\n}\n\n// ============================================================================\n// Callback Stream Handlers (for streaming fetch callback responses)\n// ============================================================================\n\n/**\n * Handle CALLBACK_STREAM_START message.\n * Creates a ReadableStream and resolves the pending callback with a Response.\n */\nfunction handleCallbackStreamStart(\n message: CallbackStreamStart,\n connection: ConnectionState\n): void {\n // Create a partial receiver that will be completed when the stream is created\n const receiver: CallbackStreamReceiver = {\n streamId: message.streamId,\n requestId: message.requestId,\n metadata: message.metadata,\n controller: null as unknown as ReadableStreamDefaultController<Uint8Array>,\n state: \"active\",\n pendingChunks: [],\n pullResolvers: [],\n controllerFinalized: false,\n };\n\n // Create a ReadableStream that yields chunks as they arrive\n const readableStream = new ReadableStream<Uint8Array>({\n start(controller) {\n receiver.controller = controller;\n },\n pull(_controller) {\n // If controller is already finalized, just return\n if (receiver.controllerFinalized) {\n return;\n }\n\n // If there's a pending chunk, enqueue ONE chunk and return\n // This preserves streaming behavior - one chunk per pull\n if (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\n return Promise.resolve();\n }\n\n // If stream is already closed or errored, handle it\n if (receiver.state === \"closed\") {\n if (!receiver.controllerFinalized) {\n receiver.controllerFinalized = true;\n receiver.controller.close();\n }\n return Promise.resolve();\n }\n if (receiver.state === \"errored\") {\n if (!receiver.controllerFinalized && receiver.error) {\n receiver.controllerFinalized = true;\n receiver.controller.error(receiver.error);\n }\n return Promise.resolve();\n }\n\n // Return a promise that resolves when the next chunk arrives\n return new Promise<void>((resolve) => {\n receiver.pullResolvers.push(resolve);\n });\n },\n cancel(_reason) {\n receiver.state = \"closed\";\n receiver.controllerFinalized = true;\n\n // Resolve all pending pull promises\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n connection.callbackStreamReceivers.delete(message.streamId);\n\n // Tell the client to stop streaming this response body\n sendMessage(connection.socket, {\n type: MessageType.CALLBACK_STREAM_CANCEL,\n streamId: message.streamId,\n });\n\n return Promise.resolve();\n },\n });\n\n connection.callbackStreamReceivers.set(message.streamId, receiver);\n\n // Create Response and resolve the pending callback\n const pending = connection.pendingCallbacks.get(message.requestId);\n if (pending) {\n connection.pendingCallbacks.delete(message.requestId);\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n const response = new Response(readableStream, {\n status: message.metadata.status,\n statusText: message.metadata.statusText,\n headers: message.metadata.headers,\n });\n\n // Resolve with the streaming Response\n pending.resolve({ __streamingResponse: true, response });\n }\n}\n\n/**\n * Handle CALLBACK_STREAM_CHUNK message.\n * Enqueues a chunk to the stream controller.\n */\nfunction handleCallbackStreamChunk(\n message: CallbackStreamChunk,\n connection: ConnectionState\n): void {\n const receiver = connection.callbackStreamReceivers.get(message.streamId);\n if (receiver && receiver.state === \"active\") {\n if (receiver.pullResolvers.length > 0) {\n // Consumer is waiting for data - enqueue directly and resolve one pending pull\n receiver.controller.enqueue(message.chunk);\n const resolver = receiver.pullResolvers.shift()!;\n resolver();\n } else {\n // Consumer not ready - buffer the chunk\n receiver.pendingChunks.push(message.chunk);\n }\n }\n}\n\n/**\n * Handle CALLBACK_STREAM_END message.\n * Closes the stream controller.\n */\nfunction handleCallbackStreamEnd(\n message: CallbackStreamEnd,\n connection: ConnectionState\n): void {\n const receiver = connection.callbackStreamReceivers.get(message.streamId);\n if (receiver) {\n // Mark stream as closed\n receiver.state = \"closed\";\n\n // Flush any remaining pending chunks\n while (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\n }\n\n // Close the stream (only if not already finalized)\n if (!receiver.controllerFinalized) {\n receiver.controllerFinalized = true;\n receiver.controller.close();\n }\n\n // Resolve all pending pull promises\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n // Clean up\n connection.callbackStreamReceivers.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 instance.lastActivity = Date.now();\n\n try {\n const timeout = message.timeout ?? 30000;\n const results = await instance.runtime.testEnvironment.runTests(timeout);\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 instance.lastActivity = Date.now();\n\n try {\n instance.runtime.testEnvironment.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 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 instance.lastActivity = Date.now();\n\n try {\n const result = instance.runtime.testEnvironment.hasTests();\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 instance.lastActivity = Date.now();\n\n try {\n const result = instance.runtime.testEnvironment.getTestCount();\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 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 instance.lastActivity = Date.now();\n\n try {\n const data = instance.runtime.playwright.getCollectedData();\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 instance.lastActivity = Date.now();\n\n try {\n instance.runtime.playwright.clearCollectedData();\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": "514032B8427B94A564756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "C809F161C354C84D64756E2164756E21",
9
9
  "names": []
10
10
  }