@ricsam/isolate-daemon 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/callback-fs-handler.cjs +17 -11
- package/dist/cjs/callback-fs-handler.cjs.map +3 -3
- package/dist/cjs/connection.cjs +105 -54
- package/dist/cjs/connection.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/callback-fs-handler.mjs +17 -11
- package/dist/mjs/callback-fs-handler.mjs.map +3 -3
- package/dist/mjs/connection.mjs +105 -54
- package/dist/mjs/connection.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/types.d.ts +11 -0
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/connection.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Connection handling for the isolate daemon.\n */\n\nimport type { Socket } from \"node:net\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n ErrorCode,\n STREAM_THRESHOLD,\n STREAM_CHUNK_SIZE,\n STREAM_DEFAULT_CREDIT,\n marshalValue,\n unmarshalValue,\n isPromiseRef,\n isAsyncIteratorRef,\n deserializeResponse,\n type SerializedRequest,\n type SerializedResponse,\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 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 ClientEventMessage,\n type IsolateEventMessage,\n IsolateEvents,\n ClientEvents,\n type WsCommandPayload,\n type WsClientConnectPayload,\n type WsClientSendPayload,\n type WsClientClosePayload,\n type WsClientOpenedPayload,\n type WsClientMessagePayload,\n type WsClientClosedPayload,\n type WsClientErrorPayload,\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\nconst LINKER_CONFLICT_ERROR = \"Module is currently being linked by another linker\";\n\nfunction getErrorText(error: unknown): string {\n if (error instanceof Error) {\n const cause = (error as Error & { cause?: unknown }).cause;\n const causeText =\n cause instanceof Error\n ? `${cause.name}: ${cause.message}\\n${cause.stack ?? \"\"}`\n : cause != null\n ? String(cause)\n : \"\";\n return [error.name, error.message, error.stack, causeText]\n .filter((part) => part != null && part !== \"\")\n .join(\"\\n\");\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error ?? \"\");\n }\n}\n\nfunction isLinkerConflictError(error: unknown): boolean {\n const text = getErrorText(error).toLowerCase();\n return text.includes(LINKER_CONFLICT_ERROR.toLowerCase());\n}\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 if (instance.isPoisoned) {\n // Poisoned namespaced runtime: hard delete and remove from namespace index\n hardDeleteRuntime(instance, state).catch(() => {\n // Ignore disposal errors on socket close cleanup\n });\n } else {\n // Namespaced runtime: soft-delete (keep cached for reuse)\n softDeleteRuntime(instance, state);\n }\n } else if (!instance.isDisposed) {\n // Non-namespaced runtime: hard delete\n hardDeleteRuntime(instance, state).catch(() => {\n // Ignore disposal errors\n });\n }\n }\n }\n\n // Reject pending callbacks\n for (const [, pending] of connection.pendingCallbacks) {\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 // Generic client events (WebSocket events and user-defined events)\n case MessageType.CLIENT_EVENT:\n handleClientEvent(message as ClientEventMessage, 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 * Hard-delete a runtime and remove it from daemon indexes.\n */\nasync function hardDeleteRuntime(instance: IsolateInstance, state: DaemonState): Promise<void> {\n try {\n await instance.runtime.dispose();\n } finally {\n state.isolates.delete(instance.isolateId);\n if (instance.namespaceId != null) {\n const indexed = state.namespacedRuntimes.get(instance.namespaceId);\n if (indexed?.isolateId === instance.isolateId) {\n state.namespacedRuntimes.delete(instance.namespaceId);\n }\n }\n instance.isDisposed = true;\n instance.disposedAt = undefined;\n instance.ownerConnection = null;\n if (instance.callbackContext) {\n instance.callbackContext.connection = null;\n }\n }\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.isPoisoned = 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 hardDeleteRuntime(oldest, state);\n } catch {\n // Ignore disposal errors\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 let namespaceCreationLocked = false;\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 if (state.namespacedCreatesInFlight.has(namespaceId)) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n `Namespace \"${namespaceId}\" creation already in progress`\n );\n return;\n }\n\n state.namespacedCreatesInFlight.add(namespaceId);\n namespaceCreationLocked = true;\n }\n\n try {\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 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 isPoisoned: 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 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 );\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: SerializedRequest = {\n url,\n method: init.method,\n headers: init.headers,\n body: init.rawBody,\n };\n const result = await invokeClientCallback(conn, callbackId, [serialized]);\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 SerializedResponse);\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 via ISOLATE_EVENT\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 payload: WsCommandPayload = {\n type: cmd.type,\n connectionId: cmd.connectionId,\n data,\n code: cmd.code,\n reason: cmd.reason,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_COMMAND,\n payload,\n } as IsolateEventMessage);\n });\n\n // Forward client WebSocket commands from isolate to client via ISOLATE_EVENT\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 payload: WsClientConnectPayload = {\n socketId: cmd.socketId,\n url: cmd.url!,\n protocols: cmd.protocols,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_CLIENT_CONNECT,\n payload,\n } as IsolateEventMessage);\n } else if (cmd.type === \"send\") {\n const payload: WsClientSendPayload = {\n socketId: cmd.socketId,\n data: data!,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_CLIENT_SEND,\n payload,\n } as IsolateEventMessage);\n } else if (cmd.type === \"close\") {\n const payload: WsClientClosePayload = {\n socketId: cmd.socketId,\n code: cmd.code,\n reason: cmd.reason,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_CLIENT_CLOSE,\n payload,\n } as IsolateEventMessage);\n }\n });\n\n // Forward user-defined events from isolate to client via ISOLATE_EVENT\n runtime.fetch.onEvent((eventName, payload) => {\n const targetConnection = callbackContext.connection;\n if (!targetConnection) {\n return;\n }\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: eventName,\n payload,\n } as IsolateEventMessage);\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 } finally {\n if (namespaceCreationLocked && namespaceId != null) {\n state.namespacedCreatesInFlight.delete(namespaceId);\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 if (instance.isPoisoned) {\n // Poisoned namespaced runtime: hard delete and remove from namespace index\n await hardDeleteRuntime(instance, state);\n } else {\n // Namespaced runtime: soft-delete (keep cached for reuse)\n softDeleteRuntime(instance, state);\n }\n } else {\n // Non-namespaced runtime: hard delete\n await hardDeleteRuntime(instance, state);\n }\n\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n if (instance.namespaceId != null && isLinkerConflictError(error)) {\n instance.isPoisoned = true;\n }\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 });\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 if (instance.namespaceId != null && isLinkerConflictError(error)) {\n instance.isPoisoned = true;\n }\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 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// Generic Client Event Handler\n// ============================================================================\n\n/**\n * Handle CLIENT_EVENT message from client.\n * Routes WebSocket events to the isolate, and user-defined events to dispatchEvent.\n */\nfunction handleClientEvent(\n message: ClientEventMessage,\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 switch (message.event) {\n case ClientEvents.WS_CLIENT_OPENED: {\n const payload = message.payload as WsClientOpenedPayload;\n instance.runtime.fetch.dispatchClientWebSocketOpen(\n payload.socketId,\n payload.protocol,\n payload.extensions\n );\n break;\n }\n case ClientEvents.WS_CLIENT_MESSAGE: {\n const payload = message.payload as WsClientMessagePayload;\n // Convert Uint8Array to ArrayBuffer if needed\n const data = payload.data instanceof Uint8Array\n ? payload.data.buffer.slice(\n payload.data.byteOffset,\n payload.data.byteOffset + payload.data.byteLength\n ) as ArrayBuffer\n : payload.data;\n instance.runtime.fetch.dispatchClientWebSocketMessage(payload.socketId, data);\n break;\n }\n case ClientEvents.WS_CLIENT_CLOSED: {\n const payload = message.payload as WsClientClosedPayload;\n instance.runtime.fetch.dispatchClientWebSocketClose(\n payload.socketId,\n payload.code,\n payload.reason,\n payload.wasClean\n );\n break;\n }\n case ClientEvents.WS_CLIENT_ERROR: {\n const payload = message.payload as WsClientErrorPayload;\n instance.runtime.fetch.dispatchClientWebSocketError(payload.socketId);\n break;\n }\n default: {\n // User-defined events: dispatch to isolate\n instance.runtime.fetch.dispatchEvent(message.event, message.payload);\n break;\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 (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): Promise<unknown> {\n const requestId = connection.nextCallbackId++;\n\n return new Promise((resolve, reject) => {\n const pending: PendingRequest = {\n resolve,\n reject,\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// 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\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"
|
|
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 isPromiseRef,\n isAsyncIteratorRef,\n deserializeResponse,\n type SerializedRequest,\n type SerializedResponse,\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 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 ClientEventMessage,\n type IsolateEventMessage,\n IsolateEvents,\n ClientEvents,\n type WsCommandPayload,\n type WsClientConnectPayload,\n type WsClientSendPayload,\n type WsClientClosePayload,\n type WsClientOpenedPayload,\n type WsClientMessagePayload,\n type WsClientClosedPayload,\n type WsClientErrorPayload,\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\nconst LINKER_CONFLICT_ERROR = \"Module is currently being linked by another linker\";\n\nfunction getErrorText(error: unknown): string {\n if (error instanceof Error) {\n const cause = (error as Error & { cause?: unknown }).cause;\n const causeText =\n cause instanceof Error\n ? `${cause.name}: ${cause.message}\\n${cause.stack ?? \"\"}`\n : cause != null\n ? String(cause)\n : \"\";\n return [error.name, error.message, error.stack, causeText]\n .filter((part) => part != null && part !== \"\")\n .join(\"\\n\");\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error ?? \"\");\n }\n}\n\nfunction isLinkerConflictError(error: unknown): boolean {\n const text = getErrorText(error).toLowerCase();\n return text.includes(LINKER_CONFLICT_ERROR.toLowerCase());\n}\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 if (instance.isPoisoned) {\n // Poisoned namespaced runtime: hard delete and remove from namespace index\n hardDeleteRuntime(instance, state).catch(() => {\n // Ignore disposal errors on socket close cleanup\n });\n } else {\n // Namespaced runtime: soft-delete (keep cached for reuse)\n softDeleteRuntime(instance, state);\n }\n } else if (!instance.isDisposed) {\n // Non-namespaced runtime: hard delete\n hardDeleteRuntime(instance, state).catch(() => {\n // Ignore disposal errors\n });\n }\n }\n }\n\n // Reject pending callbacks\n for (const [, pending] of connection.pendingCallbacks) {\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 // Generic client events (WebSocket events and user-defined events)\n case MessageType.CLIENT_EVENT:\n handleClientEvent(message as ClientEventMessage, 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 * Hard-delete a runtime and remove it from daemon indexes.\n */\nasync function hardDeleteRuntime(instance: IsolateInstance, state: DaemonState): Promise<void> {\n try {\n await instance.runtime.dispose();\n } finally {\n state.isolates.delete(instance.isolateId);\n if (instance.namespaceId != null) {\n const indexed = state.namespacedRuntimes.get(instance.namespaceId);\n if (indexed?.isolateId === instance.isolateId) {\n state.namespacedRuntimes.delete(instance.namespaceId);\n }\n }\n instance.isDisposed = true;\n instance.disposedAt = undefined;\n instance.ownerConnection = null;\n if (instance.callbackContext) {\n // Reject any pending reconnection promise before clearing connection.\n // Attach a no-op catch before rejecting to prevent unhandled promise rejections\n // (e.g. when evicting disposed runtimes that nobody is waiting on).\n if (instance.callbackContext.reconnectionPromise) {\n clearTimeout(instance.callbackContext.reconnectionPromise.timeoutId);\n instance.callbackContext.reconnectionPromise.promise.catch(() => {});\n instance.callbackContext.reconnectionPromise.reject(\n new Error(\"Runtime was permanently disposed\")\n );\n instance.callbackContext.reconnectionPromise = undefined;\n }\n instance.callbackContext.connection = null;\n }\n }\n}\n\n/** Default timeout for waiting for reconnection (30 seconds) */\nconst RECONNECTION_TIMEOUT_MS = 30_000;\n\n/**\n * Soft-delete a namespaced runtime (keep cached for reuse).\n * Clears owner connection and callbacks but preserves isolate/context.\n * Creates a reconnection promise so in-flight callbacks can wait for a new connection.\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 // Create a reconnection promise so in-flight callbacks can wait.\n // Attach a no-op catch to prevent unhandled rejection when timeout fires\n // and nobody is awaiting the promise (e.g. runtime was idle at disconnect).\n let resolve: (conn: ConnectionState) => void;\n let reject: (err: Error) => void;\n const promise = new Promise<ConnectionState>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n promise.catch(() => {});\n const timeoutId = setTimeout(() => {\n if (instance.callbackContext?.reconnectionPromise) {\n instance.callbackContext.reconnectionPromise = undefined;\n reject!(new Error(\"Reconnection timeout: no client reconnected within timeout\"));\n }\n }, RECONNECTION_TIMEOUT_MS);\n instance.callbackContext.reconnectionPromise = {\n promise,\n resolve: resolve!,\n reject: reject!,\n timeoutId,\n };\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.isPoisoned = 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 // Resolve the reconnection promise so waiting callbacks can proceed\n if (instance.callbackContext.reconnectionPromise) {\n clearTimeout(instance.callbackContext.reconnectionPromise.timeoutId);\n instance.callbackContext.reconnectionPromise.resolve(connection);\n instance.callbackContext.reconnectionPromise = undefined;\n }\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 * Get the current connection or wait for reconnection.\n * Returns the connection, or throws if no reconnection is possible.\n */\nasync function waitForConnection(callbackContext: CallbackContext): Promise<ConnectionState> {\n if (callbackContext.connection) {\n return callbackContext.connection;\n }\n if (callbackContext.reconnectionPromise) {\n return callbackContext.reconnectionPromise.promise;\n }\n throw new Error(\"No connection available and no reconnection pending\");\n}\n\n/**\n * Invoke a client callback with reconnection support.\n * If the connection is null, waits for reconnection. If the call fails with a\n * connection error and a reconnection promise exists, retries once after reconnection.\n */\nasync function invokeCallbackWithReconnect(\n callbackContext: CallbackContext,\n getCallbackId: () => number | undefined,\n args: unknown[],\n label: string,\n invokeClientCallback: (conn: ConnectionState, callbackId: number, args: unknown[]) => Promise<unknown>,\n): Promise<unknown> {\n const conn = await waitForConnection(callbackContext);\n const cbId = getCallbackId();\n if (cbId === undefined) {\n throw new Error(`${label} callback not available`);\n }\n try {\n return await invokeClientCallback(conn, cbId, args);\n } catch (err) {\n // If the call failed and a reconnection promise now exists, retry once\n if (callbackContext.reconnectionPromise && !callbackContext.connection) {\n const newConn = await callbackContext.reconnectionPromise.promise;\n const newCbId = getCallbackId();\n if (newCbId === undefined) {\n throw new Error(`${label} callback not available after reconnection`);\n }\n return invokeClientCallback(newConn, newCbId, args);\n }\n throw err;\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 */\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 hardDeleteRuntime(oldest, state);\n } catch {\n // Ignore disposal errors\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 let namespaceCreationLocked = false;\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 if (state.namespacedCreatesInFlight.has(namespaceId)) {\n sendError(\n connection.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n `Namespace \"${namespaceId}\" creation already in progress`\n );\n return;\n }\n\n state.namespacedCreatesInFlight.add(namespaceId);\n namespaceCreationLocked = true;\n }\n\n try {\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 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 isPoisoned: 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 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 (with reconnection support)\n const conn = await waitForConnection(callbackContext);\n try {\n return await invokeClientCallback(conn, callbackId, args);\n } catch (err) {\n if (callbackContext.reconnectionPromise && !callbackContext.connection) {\n const newConn = await callbackContext.reconnectionPromise.promise;\n return invokeClientCallback(newConn, callbackId, args);\n }\n throw err;\n }\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 (with reconnection support)\n async function* bridgedIterator() {\n // Start the iterator on the client\n const startResult = await invokeCallbackWithReconnect(\n callbackContext_,\n () => callbackContext_.custom.get(`${name}:start`),\n args,\n `AsyncIterator '${name}' start`,\n invokeClientCallback,\n ) as { iteratorId: number };\n const iteratorId = startResult.iteratorId;\n\n try {\n while (true) {\n const nextResult = await invokeCallbackWithReconnect(\n callbackContext_,\n () => callbackContext_.custom.get(`${name}:next`),\n [iteratorId],\n `AsyncIterator '${name}' next`,\n invokeClientCallback,\n ) as { done: boolean; value: unknown };\n if (nextResult.done) return nextResult.value;\n yield nextResult.value;\n }\n } finally {\n // Call return on cleanup — best-effort, don't fail if connection is gone\n const retConn = callbackContext_.connection;\n const retCbId = callbackContext_.custom.get(`${name}:return`);\n if (retConn && retCbId !== undefined) {\n await invokeClientCallback(retConn, retCbId, [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 // Uses reconnection support so in-flight calls can wait for a new connection\n bridgedCustomFunctions[name] = {\n type: registration.type as 'sync' | 'async',\n fn: async (...args: unknown[]) => {\n return invokeCallbackWithReconnect(\n callbackContext_,\n () => callbackContext_.custom.get(name),\n args,\n `Custom function '${name}'`,\n invokeClientCallback,\n );\n },\n };\n }\n }\n }\n\n // Build module loader if registered (with reconnection support)\n let moduleLoader: ((specifier: string, importer: { path: string; resolveDir: string }) => Promise<{ code: string; filename: string; resolveDir: string; static?: boolean }>) | undefined;\n if (moduleLoaderCallback) {\n moduleLoader = async (specifier: string, importer: { path: string; resolveDir: string }) => {\n return invokeCallbackWithReconnect(\n callbackContext,\n () => callbackContext.moduleLoader,\n [specifier, importer],\n \"Module loader\",\n invokeClientCallback,\n ) as Promise<{ code: string; filename: 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 try {\n const resultJson = await invokeCallbackWithReconnect(\n callbackContext,\n () => callbackContext.playwright.handlerCallbackId,\n [JSON.stringify(op)],\n \"Playwright handler\",\n invokeClientCallback,\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 (with reconnection support)\n fetch: async (url: string, init: FetchRequestInit) => {\n const serialized: SerializedRequest = {\n url,\n method: init.method,\n headers: init.headers,\n body: init.rawBody,\n };\n const result = await invokeCallbackWithReconnect(\n callbackContext,\n () => callbackContext.fetch,\n [serialized],\n \"Fetch\",\n invokeClientCallback,\n );\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 SerializedResponse);\n },\n // FS handler that bridges to client via IPC (with reconnection support)\n fs: {\n getDirectory: async (dirPath: string) => {\n const conn = await waitForConnection(callbackContext);\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 via ISOLATE_EVENT\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 payload: WsCommandPayload = {\n type: cmd.type,\n connectionId: cmd.connectionId,\n data,\n code: cmd.code,\n reason: cmd.reason,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_COMMAND,\n payload,\n } as IsolateEventMessage);\n });\n\n // Forward client WebSocket commands from isolate to client via ISOLATE_EVENT\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 payload: WsClientConnectPayload = {\n socketId: cmd.socketId,\n url: cmd.url!,\n protocols: cmd.protocols,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_CLIENT_CONNECT,\n payload,\n } as IsolateEventMessage);\n } else if (cmd.type === \"send\") {\n const payload: WsClientSendPayload = {\n socketId: cmd.socketId,\n data: data!,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_CLIENT_SEND,\n payload,\n } as IsolateEventMessage);\n } else if (cmd.type === \"close\") {\n const payload: WsClientClosePayload = {\n socketId: cmd.socketId,\n code: cmd.code,\n reason: cmd.reason,\n };\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: IsolateEvents.WS_CLIENT_CLOSE,\n payload,\n } as IsolateEventMessage);\n }\n });\n\n // Forward user-defined events from isolate to client via ISOLATE_EVENT\n runtime.fetch.onEvent((eventName, payload) => {\n const targetConnection = callbackContext.connection;\n if (!targetConnection) {\n return;\n }\n sendMessage(targetConnection.socket, {\n type: MessageType.ISOLATE_EVENT,\n isolateId,\n event: eventName,\n payload,\n } as IsolateEventMessage);\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 } finally {\n if (namespaceCreationLocked && namespaceId != null) {\n state.namespacedCreatesInFlight.delete(namespaceId);\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 if (instance.isPoisoned) {\n // Poisoned namespaced runtime: hard delete and remove from namespace index\n await hardDeleteRuntime(instance, state);\n } else {\n // Namespaced runtime: soft-delete (keep cached for reuse)\n softDeleteRuntime(instance, state);\n }\n } else {\n // Non-namespaced runtime: hard delete\n await hardDeleteRuntime(instance, state);\n }\n\n sendOk(connection.socket, message.requestId);\n } catch (err) {\n const error = err as Error;\n if (instance.namespaceId != null && isLinkerConflictError(error)) {\n instance.isPoisoned = true;\n }\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 });\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 if (instance.namespaceId != null && isLinkerConflictError(error)) {\n instance.isPoisoned = true;\n }\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 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// Generic Client Event Handler\n// ============================================================================\n\n/**\n * Handle CLIENT_EVENT message from client.\n * Routes WebSocket events to the isolate, and user-defined events to dispatchEvent.\n */\nfunction handleClientEvent(\n message: ClientEventMessage,\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 switch (message.event) {\n case ClientEvents.WS_CLIENT_OPENED: {\n const payload = message.payload as WsClientOpenedPayload;\n instance.runtime.fetch.dispatchClientWebSocketOpen(\n payload.socketId,\n payload.protocol,\n payload.extensions\n );\n break;\n }\n case ClientEvents.WS_CLIENT_MESSAGE: {\n const payload = message.payload as WsClientMessagePayload;\n // Convert Uint8Array to ArrayBuffer if needed\n const data = payload.data instanceof Uint8Array\n ? payload.data.buffer.slice(\n payload.data.byteOffset,\n payload.data.byteOffset + payload.data.byteLength\n ) as ArrayBuffer\n : payload.data;\n instance.runtime.fetch.dispatchClientWebSocketMessage(payload.socketId, data);\n break;\n }\n case ClientEvents.WS_CLIENT_CLOSED: {\n const payload = message.payload as WsClientClosedPayload;\n instance.runtime.fetch.dispatchClientWebSocketClose(\n payload.socketId,\n payload.code,\n payload.reason,\n payload.wasClean\n );\n break;\n }\n case ClientEvents.WS_CLIENT_ERROR: {\n const payload = message.payload as WsClientErrorPayload;\n instance.runtime.fetch.dispatchClientWebSocketError(payload.socketId);\n break;\n }\n default: {\n // User-defined events: dispatch to isolate\n instance.runtime.fetch.dispatchEvent(message.event, message.payload);\n break;\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 (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): Promise<unknown> {\n const requestId = connection.nextCallbackId++;\n\n return new Promise((resolve, reject) => {\n const pending: PendingRequest = {\n resolve,\n reject,\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// 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\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 // If there's already an in-flight test run (from before reconnection), await it\n if (instance.pendingTestRun) {\n try {\n const results = await instance.pendingTestRun.promise;\n // Use current connection (may have changed due to reconnection)\n const currentConn = instance.callbackContext?.connection;\n if (currentConn) {\n sendOk(currentConn.socket, message.requestId, results);\n }\n } catch (err) {\n const error = err as Error;\n const currentConn = instance.callbackContext?.connection;\n if (currentConn) {\n sendError(\n currentConn.socket,\n message.requestId,\n ErrorCode.SCRIPT_ERROR,\n error.message,\n { name: error.name, stack: error.stack }\n );\n }\n }\n return;\n }\n\n try {\n const timeout = message.timeout ?? 30000;\n const runPromise = instance.runtime.testEnvironment.runTests(timeout);\n instance.pendingTestRun = { promise: runPromise };\n\n const results = await runPromise;\n instance.pendingTestRun = undefined;\n\n // Send result using CURRENT connection (may have changed due to reconnection)\n const currentConn = instance.callbackContext?.connection ?? connection;\n sendOk(currentConn.socket, message.requestId, results);\n } catch (err) {\n instance.pendingTestRun = undefined;\n const error = err as Error;\n // Send error using CURRENT connection\n const currentConn = instance.callbackContext?.connection ?? connection;\n sendError(\n currentConn.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": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "DCB2345D02FBF03C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|