@ricsam/isolate-client 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/README.md +1 -0
- package/dist/cjs/connection.cjs +196 -164
- package/dist/cjs/connection.cjs.map +3 -3
- package/dist/cjs/index.cjs +2 -1
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/connection.mjs +199 -161
- package/dist/mjs/connection.mjs.map +3 -3
- package/dist/mjs/index.mjs +3 -2
- package/dist/mjs/index.mjs.map +2 -2
- package/dist/mjs/package.json +1 -1
- package/dist/types/connection.d.ts +1 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/types.d.ts +15 -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 client.\n */\n\nimport { connect as netConnect, type Socket } from \"node:net\";\nimport path from \"node:path\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n STREAM_THRESHOLD,\n STREAM_CHUNK_SIZE,\n STREAM_DEFAULT_CREDIT,\n type Message,\n type ResponseOk,\n type ResponseError,\n type CreateRuntimeRequest,\n type DisposeRuntimeRequest,\n type EvalRequest,\n type DispatchRequestRequest,\n type CallbackInvoke,\n type CallbackResponseMsg,\n type CallbackRegistration,\n type RuntimeCallbackRegistrations,\n type CreateRuntimeResult,\n type SerializedResponse,\n type RunTestsRequest,\n type RunTestsResult,\n type HasTestsRequest,\n type GetTestCountRequest,\n type TestEnvironmentCallbackRegistrations,\n type TestEnvironmentOptionsProtocol,\n type TestEventMessage,\n type CollectedData,\n type ResetTestEnvRequest,\n type PlaywrightOperation,\n type PlaywrightResult,\n type WsOpenRequest,\n type WsMessageRequest,\n type WsCloseRequest,\n type FetchGetUpgradeRequestRequest,\n type FetchHasServeHandlerRequest,\n type FetchHasActiveConnectionsRequest,\n type FetchWsErrorRequest,\n type TimersClearAllRequest,\n type ConsoleResetRequest,\n type ConsoleGetTimersRequest,\n type ConsoleGetCountersRequest,\n type ConsoleGetGroupDepthRequest,\n type WsCommandMessage,\n type ResponseStreamStart,\n type ResponseStreamChunk,\n type ResponseStreamEnd,\n type StreamPush,\n type StreamPull,\n type StreamClose,\n type StreamError,\n type CallbackStreamStart,\n type CallbackStreamChunk,\n type CallbackStreamEnd,\n type ClientWsConnectRequest,\n type ClientWsSendRequest,\n type ClientWsCloseRequest,\n type ClientWsOpenedMessage,\n type ClientWsMessageMessage,\n type ClientWsClosedMessage,\n type ClientWsErrorMessage,\n marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport {\n getDefaultPlaywrightHandlerMetadata,\n type PlaywrightCallback,\n} from \"@ricsam/isolate-playwright/client\";\nimport type {\n ConnectOptions,\n DaemonConnection,\n RuntimeOptions,\n RemoteRuntime,\n RemoteFetchHandle,\n RemoteTimersHandle,\n RemoteConsoleHandle,\n RemoteTestEnvironmentHandle,\n RemotePlaywrightHandle,\n DispatchOptions,\n ConsoleCallbacks,\n FetchCallback,\n FileSystemCallbacks,\n ModuleLoaderCallback,\n CustomFunctions,\n EvalOptions,\n UpgradeRequest,\n WebSocketCommand,\n TestEnvironmentOptions,\n Namespace,\n} from \"./types.mjs\";\n\nconst DEFAULT_TIMEOUT = 30000;\nconst TEST_REQUEST_TIMEOUT_BUFFER_MS = 1000;\n\n// Track WebSocket command callbacks per isolate for handling WS_COMMAND messages\nconst isolateWsCallbacks = new Map<string, Set<(cmd: WebSocketCommand) => void>>();\n\n// Track client WebSockets per isolate (outbound connections from isolate)\n// Map: isolateId -> Map<socketId -> WebSocket>\nconst isolateClientWebSockets = new Map<string, Map<string, WebSocket>>();\n\n// Track WebSocket callbacks per isolate for handling outbound WebSocket connections\n// Map: isolateId -> WebSocketCallback\nimport type { WebSocketCallback } from \"@ricsam/isolate-protocol\";\nconst isolateWebSocketCallbacks = new Map<string, WebSocketCallback>();\n\ninterface PendingRequest {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\n/** Stream receiver for streaming response chunks directly to consumer */\ninterface StreamResponseReceiver {\n streamId: number;\n requestId: number;\n metadata?: {\n status?: number;\n statusText?: string;\n headers?: [string, string][];\n };\n controller: ReadableStreamDefaultController<Uint8Array>;\n state: \"active\" | \"closed\" | \"errored\";\n pendingChunks: Uint8Array[]; // Buffer for chunks arriving before consumer pulls\n error?: Error; // Stored error to propagate after pending chunks are consumed\n pullResolvers: Array<() => void>; // Queue of resolvers for pending pull() calls\n controllerFinalized: boolean; // True if controller.close() or controller.error() was called\n}\n\n/** Stream session for tracking upload streams (client sending to daemon) */\ninterface StreamUploadSession {\n streamId: number;\n requestId: number;\n state: \"active\" | \"closing\" | \"closed\";\n bytesTransferred: number;\n credit: number;\n creditResolver?: () => void;\n}\n\ninterface ConnectionState {\n socket: Socket;\n pendingRequests: Map<number, PendingRequest>;\n callbacks: Map<number, (...args: unknown[]) => unknown>;\n /** Callback IDs that need requestId passed as last argument (e.g., fetch callbacks for streaming) */\n callbacksNeedingRequestId: Set<number>;\n nextRequestId: number;\n nextCallbackId: number;\n nextStreamId: number;\n connected: boolean;\n /** Track streaming responses being received */\n streamResponses: Map<number, StreamResponseReceiver>;\n /** Track upload streams (for request body streaming) */\n uploadStreams: Map<number, StreamUploadSession>;\n /** Cache for module source code (shared across all runtimes in this connection) */\n moduleSourceCache: Map<string, string>;\n /** Track active callback stream readers (for cancellation from daemon) */\n callbackStreamReaders: Map<number, ReadableStreamDefaultReader<Uint8Array>>;\n}\n\n/**\n * Connect to the isolate daemon.\n */\nexport async function connect(options: ConnectOptions = {}): Promise<DaemonConnection> {\n const socket = await createSocket(options);\n\n const state: ConnectionState = {\n socket,\n pendingRequests: new Map(),\n callbacks: new Map(),\n callbacksNeedingRequestId: new Set(),\n nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n connected: true,\n streamResponses: new Map(),\n uploadStreams: new Map(),\n moduleSourceCache: new Map(),\n callbackStreamReaders: new Map(),\n };\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, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests and clear their timeouts\n for (const [, pending] of state.pendingRequests) {\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n\n // Clean up streaming responses - error any pending streams\n for (const [, receiver] of state.streamResponses) {\n receiver.state = \"errored\";\n receiver.error = new Error(\"Connection closed\");\n // Resolve all pending pull promises so the stream can error properly\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n }\n state.streamResponses.clear();\n\n // Clean up upload streams\n for (const [, session] of state.uploadStreams) {\n session.state = \"closed\";\n if (session.creditResolver) {\n session.creditResolver();\n }\n }\n state.uploadStreams.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\n createNamespace: (id: string): Namespace => ({\n id,\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions, id),\n }),\n close: async () => {\n state.connected = false;\n socket.destroy();\n },\n isConnected: () => state.connected,\n };\n}\n\n/**\n * Create a socket connection.\n */\nfunction createSocket(options: ConnectOptions): Promise<Socket> {\n return new Promise((resolve, reject) => {\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n let socket: Socket;\n\n const onError = (err: Error) => {\n reject(err);\n };\n\n const onConnect = () => {\n socket.removeListener(\"error\", onError);\n resolve(socket);\n };\n\n if (options.socket) {\n socket = netConnect(options.socket, onConnect);\n } else {\n socket = netConnect(\n options.port ?? 47891,\n options.host ?? \"127.0.0.1\",\n onConnect\n );\n }\n\n socket.on(\"error\", onError);\n\n // Connection timeout\n const timeoutId = setTimeout(() => {\n socket.destroy();\n reject(new Error(\"Connection timeout\"));\n }, timeout);\n\n socket.once(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n });\n}\n\n/**\n * Handle an incoming message from the daemon.\n */\nfunction handleMessage(message: Message, state: ConnectionState): void {\n switch (message.type) {\n case MessageType.RESPONSE_OK: {\n const response = message as ResponseOk;\n const pending = state.pendingRequests.get(response.requestId);\n if (pending) {\n state.pendingRequests.delete(response.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n pending.resolve(response.data);\n }\n break;\n }\n\n case MessageType.RESPONSE_ERROR: {\n const response = message as ResponseError;\n const pending = state.pendingRequests.get(response.requestId);\n if (pending) {\n state.pendingRequests.delete(response.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n const error = new Error(response.message);\n if (response.details) {\n error.name = response.details.name;\n if (response.details.stack) {\n error.stack = response.details.stack;\n }\n }\n pending.reject(error);\n }\n break;\n }\n\n case MessageType.CALLBACK_INVOKE: {\n const invoke = message as CallbackInvoke;\n handleCallbackInvoke(invoke, state);\n break;\n }\n\n case MessageType.PONG:\n // Heartbeat response, ignore\n break;\n\n case MessageType.CALLBACK_STREAM_CANCEL: {\n const streamId = (message as { streamId: number }).streamId;\n const reader = state.callbackStreamReaders.get(streamId);\n if (reader) {\n reader.cancel().catch(() => {});\n }\n break;\n }\n\n case MessageType.WS_COMMAND: {\n const msg = message as WsCommandMessage;\n const callbacks = isolateWsCallbacks.get(msg.isolateId);\n if (callbacks) {\n // Convert Uint8Array to ArrayBuffer if needed\n let data: string | ArrayBuffer | undefined;\n if (msg.command.data instanceof Uint8Array) {\n data = msg.command.data.buffer.slice(\n msg.command.data.byteOffset,\n msg.command.data.byteOffset + msg.command.data.byteLength\n ) as ArrayBuffer;\n } else {\n data = msg.command.data;\n }\n const cmd: WebSocketCommand = {\n type: msg.command.type,\n connectionId: msg.command.connectionId,\n data,\n code: msg.command.code,\n reason: msg.command.reason,\n };\n for (const cb of callbacks) {\n cb(cmd);\n }\n }\n break;\n }\n\n // Client WebSocket commands (outbound connections from isolate)\n case MessageType.CLIENT_WS_CONNECT: {\n const msg = message as ClientWsConnectRequest;\n handleClientWsConnect(msg, state);\n break;\n }\n\n case MessageType.CLIENT_WS_SEND: {\n const msg = message as ClientWsSendRequest;\n handleClientWsSend(msg, state);\n break;\n }\n\n case MessageType.CLIENT_WS_CLOSE: {\n const msg = message as ClientWsCloseRequest;\n handleClientWsClose(msg, state);\n break;\n }\n\n // Streaming response messages\n case MessageType.RESPONSE_STREAM_START: {\n const msg = message as ResponseStreamStart;\n\n // Create a partial receiver that will be completed when the stream is created\n const receiver: StreamResponseReceiver = {\n streamId: msg.streamId,\n requestId: msg.requestId,\n metadata: msg.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 // Store the controller in the receiver\n receiver.controller = controller;\n },\n pull(_controller) {\n // Consumer is ready for more data\n // If controller is already finalized, just return\n if (receiver.controllerFinalized) {\n return;\n }\n\n // Flush any pending chunks first\n while (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\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 a resolved Promise to signal completion cleanly\n return Promise.resolve();\n }\n if (receiver.state === \"errored\") {\n // Error the stream if not already done\n if (!receiver.controllerFinalized && receiver.error) {\n receiver.controllerFinalized = true;\n receiver.controller.error(receiver.error);\n }\n // Return a resolved Promise to signal completion cleanly\n return Promise.resolve();\n }\n\n // Send credit to daemon to request more data\n sendMessage(state.socket, {\n type: MessageType.STREAM_PULL,\n streamId: msg.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\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 // Consumer cancelled the stream - mark as closed (not errored)\n // since cancel is a clean termination\n receiver.state = \"closed\";\n receiver.controllerFinalized = true; // Mark as finalized on cancel\n\n // Resolve ALL pending pull promises to allow cleanup\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n // Notify daemon that stream was cancelled\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId: msg.streamId,\n error: \"Stream cancelled by consumer\",\n } as StreamError);\n state.streamResponses.delete(msg.streamId);\n\n // Return a Promise that resolves after a macrotask to ensure\n // all internal cleanup and promise resolution is processed\n return new Promise<void>((resolve) => setTimeout(resolve, 0));\n },\n });\n\n state.streamResponses.set(msg.streamId, receiver);\n\n // Create Response and resolve the pending request immediately\n const pending = state.pendingRequests.get(msg.requestId);\n if (pending) {\n state.pendingRequests.delete(msg.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n\n const response = new Response(readableStream, {\n status: msg.metadata?.status ?? 200,\n statusText: msg.metadata?.statusText ?? \"OK\",\n headers: msg.metadata?.headers,\n });\n\n // Resolve with a marker that this is a streaming Response\n pending.resolve({ response, __streaming: true });\n }\n\n // Send initial credit to start receiving data\n sendMessage(state.socket, {\n type: MessageType.STREAM_PULL,\n streamId: msg.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\n break;\n }\n\n case MessageType.RESPONSE_STREAM_CHUNK: {\n const msg = message as ResponseStreamChunk;\n const receiver = state.streamResponses.get(msg.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(msg.chunk);\n const resolver = receiver.pullResolvers.shift()!;\n resolver();\n } else {\n // Consumer not ready - buffer the chunk\n receiver.pendingChunks.push(msg.chunk);\n }\n }\n break;\n }\n\n case MessageType.RESPONSE_STREAM_END: {\n const msg = message as ResponseStreamEnd;\n const receiver = state.streamResponses.get(msg.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 state.streamResponses.delete(msg.streamId);\n }\n break;\n }\n\n case MessageType.STREAM_PULL: {\n const msg = message as StreamPull;\n const session = state.uploadStreams.get(msg.streamId);\n if (session) {\n session.credit += msg.maxBytes;\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 break;\n }\n\n case MessageType.STREAM_ERROR: {\n const msg = message as StreamError;\n // Handle error for upload streams\n const uploadSession = state.uploadStreams.get(msg.streamId);\n if (uploadSession) {\n uploadSession.state = \"closed\";\n state.uploadStreams.delete(msg.streamId);\n }\n // Handle error for response streams (streaming mode)\n const receiver = state.streamResponses.get(msg.streamId);\n if (receiver) {\n // Mark stream as errored and store the error\n receiver.state = \"errored\";\n receiver.error = new Error(msg.error);\n\n // Flush any remaining pending chunks to controller\n // These will be readable before the error is signaled\n while (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\n }\n\n // Resolve all pending pull promises so consumer can proceed to read queued chunks\n // The error will be signaled on the next pull() after queue is empty\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n // Clean up from map - pull() still has access to receiver via closure\n // Note: Don't call controller.error() here - it discards queued chunks\n state.streamResponses.delete(msg.streamId);\n }\n break;\n }\n\n default:\n console.warn(`Unexpected message type: ${message.type}`);\n }\n}\n\n/**\n * Handle a callback invocation from the daemon.\n */\nasync function handleCallbackInvoke(\n invoke: CallbackInvoke,\n state: ConnectionState\n): Promise<void> {\n const callback = state.callbacks.get(invoke.callbackId);\n\n const response: CallbackResponseMsg = {\n type: MessageType.CALLBACK_RESPONSE,\n requestId: invoke.requestId,\n };\n\n if (!callback) {\n response.error = {\n name: \"Error\",\n message: `Unknown callback: ${invoke.callbackId}`,\n };\n sendMessage(state.socket, response);\n } else {\n try {\n // Only pass requestId to callbacks that need it (e.g., fetch callbacks for streaming)\n const needsRequestId = state.callbacksNeedingRequestId.has(invoke.callbackId);\n const result = needsRequestId\n ? await callback(...invoke.args, invoke.requestId)\n : await callback(...invoke.args);\n\n // Check if this is a streaming response (don't send CALLBACK_RESPONSE, streaming handles it)\n if (result && typeof result === 'object' && (result as { __callbackStreaming?: boolean }).__callbackStreaming) {\n // Streaming response - CALLBACK_STREAM_START already sent, body streaming in progress\n // Don't send a CALLBACK_RESPONSE here\n return;\n }\n\n response.result = result;\n sendMessage(state.socket, response);\n } catch (err) {\n const error = err as Error;\n response.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n sendMessage(state.socket, response);\n }\n }\n}\n\n/**\n * Send a message to the daemon.\n */\nfunction sendMessage(socket: Socket, message: Message): void {\n const frame = buildFrame(message);\n socket.write(frame);\n}\n\n/**\n * Send a request and wait for response.\n */\nfunction sendRequest<T>(\n state: ConnectionState,\n message: Message,\n timeout = DEFAULT_TIMEOUT\n): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!state.connected) {\n reject(new Error(\"Not connected\"));\n return;\n }\n\n const requestId = (message as { requestId: number }).requestId;\n\n const timeoutId = setTimeout(() => {\n state.pendingRequests.delete(requestId);\n reject(new Error(\"Request timeout\"));\n }, timeout);\n\n state.pendingRequests.set(requestId, {\n resolve: resolve as (data: unknown) => void,\n reject,\n timeoutId,\n });\n\n sendMessage(state.socket, message);\n });\n}\n\n/**\n * Create a runtime in the daemon.\n */\nasync function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n state: ConnectionState,\n options: RuntimeOptions<T> = {},\n namespaceId?: string\n): Promise<RemoteRuntime> {\n // Register callbacks\n const callbacks: RuntimeCallbackRegistrations = {};\n\n if (options.console) {\n callbacks.console = registerConsoleCallbacks(state, options.console);\n }\n\n if (options.fetch) {\n callbacks.fetch = registerFetchCallback(state, options.fetch);\n }\n\n if (options.fs) {\n callbacks.fs = registerFsCallbacks(state, options.fs);\n }\n\n if (options.moduleLoader) {\n callbacks.moduleLoader = registerModuleLoaderCallback(\n state,\n options.moduleLoader\n );\n }\n\n if (options.customFunctions) {\n callbacks.custom = registerCustomFunctions(state, options.customFunctions as CustomFunctions<Record<string, unknown[]>>);\n }\n\n // Playwright callback registration - client owns the browser\n let playwrightHandler: PlaywrightCallback | undefined;\n // Client-side browser event buffers\n const browserConsoleLogs: { level: string; stdout: string; timestamp: number }[] = [];\n const networkRequests: { url: string; method: string; headers: Record<string, string>; timestamp: number }[] = [];\n const networkResponses: { url: string; status: number; headers: Record<string, string>; timestamp: number }[] = [];\n const pageListenerCleanups: (() => void)[] = [];\n\n if (options.playwright) {\n playwrightHandler = options.playwright.handler;\n if (!playwrightHandler) {\n throw new Error(\"playwright.handler is required when using playwright options\");\n }\n const page = getDefaultPlaywrightHandlerMetadata(playwrightHandler)?.page;\n\n const handlerCallbackId = state.nextCallbackId++;\n state.callbacks.set(handlerCallbackId, async (opJson: unknown) => {\n const op = JSON.parse(opJson as string) as PlaywrightOperation;\n const result = await playwrightHandler!(op);\n return JSON.stringify(result);\n });\n\n // If handler was created from a page via defaultPlaywrightHandler(),\n // preserve local event capture and collected-data ergonomics.\n if (page) {\n const onConsole = (msg: { type: () => string; text: () => string }) => {\n const entry = {\n level: msg.type(),\n stdout: msg.text(),\n timestamp: Date.now(),\n };\n browserConsoleLogs.push(entry);\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"browserConsoleLog\",\n ...entry,\n });\n }\n\n if (options.playwright!.console && options.console?.onEntry) {\n options.console.onEntry({\n type: \"browserOutput\",\n ...entry,\n });\n } else if (options.playwright!.console) {\n const prefix = entry.level === \"error\" ? \"[browser:error]\" : \"[browser]\";\n console.log(prefix, entry.stdout);\n }\n };\n\n const onRequest = (request: { url: () => string; method: () => string; headers: () => Record<string, string> }) => {\n const info = {\n url: request.url(),\n method: request.method(),\n headers: request.headers(),\n timestamp: Date.now(),\n };\n networkRequests.push(info);\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"networkRequest\",\n ...info,\n });\n }\n };\n\n const onResponse = (response: { url: () => string; status: () => number; headers: () => Record<string, string> }) => {\n const info = {\n url: response.url(),\n status: response.status(),\n headers: response.headers(),\n timestamp: Date.now(),\n };\n networkResponses.push(info);\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"networkResponse\",\n ...info,\n });\n }\n };\n\n page.on(\"console\", onConsole);\n page.on(\"request\", onRequest);\n page.on(\"response\", onResponse);\n\n pageListenerCleanups.push(\n () => page.removeListener(\"console\", onConsole),\n () => page.removeListener(\"request\", onRequest),\n () => page.removeListener(\"response\", onResponse),\n );\n }\n\n callbacks.playwright = {\n handlerCallbackId,\n console: options.playwright.console && !options.console?.onEntry,\n };\n }\n\n // Test environment callback registration\n let testEnvironmentOption: boolean | TestEnvironmentOptionsProtocol | undefined;\n if (options.testEnvironment) {\n if (typeof options.testEnvironment === \"object\") {\n const testEnvOptions = options.testEnvironment;\n const testEnvCallbacks: TestEnvironmentCallbackRegistrations = {};\n\n if (testEnvOptions.onEvent) {\n const userOnEvent = testEnvOptions.onEvent;\n const onEventCallbackId = registerEventCallback(state, (eventJson: unknown) => {\n const event = JSON.parse(eventJson as string);\n userOnEvent(event);\n });\n testEnvCallbacks.onEvent = {\n callbackId: onEventCallbackId,\n name: \"testEnvironment.onEvent\",\n type: 'sync',\n };\n }\n\n testEnvironmentOption = {\n callbacks: testEnvCallbacks,\n testTimeout: testEnvOptions.testTimeout,\n };\n } else {\n testEnvironmentOption = true;\n }\n }\n\n const requestId = state.nextRequestId++;\n const request: CreateRuntimeRequest = {\n type: MessageType.CREATE_RUNTIME,\n requestId,\n options: {\n memoryLimitMB: options.memoryLimitMB,\n cwd: options.cwd,\n callbacks,\n testEnvironment: testEnvironmentOption,\n namespaceId,\n },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\n const reused = result.reused ?? false;\n\n // WebSocket command callbacks - store in module-level Map for WS_COMMAND message handling\n const wsCommandCallbacks: Set<(cmd: WebSocketCommand) => void> = new Set();\n isolateWsCallbacks.set(isolateId, wsCommandCallbacks);\n\n // Store WebSocket callback if provided (for outbound connections from isolate)\n if (options.webSocket) {\n isolateWebSocketCallbacks.set(isolateId, options.webSocket);\n }\n\n // Create fetch handle\n const fetchHandle: RemoteFetchHandle = {\n async dispatchRequest(req: Request, opts?: DispatchOptions) {\n const reqId = state.nextRequestId++;\n const serialized = await serializeRequestWithStreaming(state, req);\n\n // Extract bodyStream before creating the protocol message (can't be serialized)\n const { bodyStream, ...serializableRequest } = serialized;\n\n const request: DispatchRequestRequest = {\n type: MessageType.DISPATCH_REQUEST,\n requestId: reqId,\n isolateId,\n request: serializableRequest,\n options: opts,\n };\n\n // Helper to handle response which may be streaming or buffered\n const handleResponse = (res: { response: SerializedResponse | Response; __streaming?: boolean }): Response => {\n // Streaming case: already a Response\n if (res.__streaming && res.response instanceof Response) {\n return res.response;\n }\n // Buffered case: deserialize SerializedResponse\n return deserializeResponse(res.response as SerializedResponse);\n };\n\n // If streaming body, start sending chunks after request is sent\n if (serialized.bodyStreamId !== undefined && bodyStream) {\n const streamId = serialized.bodyStreamId;\n\n // Send the request first\n const responsePromise = sendRequest<{ response: SerializedResponse | Response; __streaming?: boolean }>(\n state,\n request,\n opts?.timeout ?? DEFAULT_TIMEOUT\n );\n\n // Then stream the body\n await sendBodyStream(state, streamId, bodyStream);\n\n // Wait for response\n const res = await responsePromise;\n return handleResponse(res);\n } else {\n const res = await sendRequest<{ response: SerializedResponse | Response; __streaming?: boolean }>(\n state,\n request,\n opts?.timeout ?? DEFAULT_TIMEOUT\n );\n return handleResponse(res);\n }\n },\n\n async getUpgradeRequest(): Promise<UpgradeRequest | null> {\n const reqId = state.nextRequestId++;\n const req: FetchGetUpgradeRequestRequest = {\n type: MessageType.FETCH_GET_UPGRADE_REQUEST,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<UpgradeRequest | null>(state, req);\n },\n\n async dispatchWebSocketOpen(connectionId: string): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: WsOpenRequest = {\n type: MessageType.WS_OPEN,\n requestId: reqId,\n isolateId,\n connectionId,\n };\n await sendRequest(state, req);\n },\n\n async dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): Promise<void> {\n const reqId = state.nextRequestId++;\n const data = message instanceof ArrayBuffer ? new Uint8Array(message) : message;\n const req: WsMessageRequest = {\n type: MessageType.WS_MESSAGE,\n requestId: reqId,\n isolateId,\n connectionId,\n data,\n };\n await sendRequest(state, req);\n },\n\n async dispatchWebSocketClose(connectionId: string, code: number, reason: string): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: WsCloseRequest = {\n type: MessageType.WS_CLOSE,\n requestId: reqId,\n isolateId,\n connectionId,\n code,\n reason,\n };\n await sendRequest(state, req);\n },\n\n async dispatchWebSocketError(connectionId: string, error: Error): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: FetchWsErrorRequest = {\n type: MessageType.FETCH_WS_ERROR,\n requestId: reqId,\n isolateId,\n connectionId,\n error: error.message,\n };\n await sendRequest(state, req);\n },\n\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void {\n wsCommandCallbacks.add(callback);\n return () => {\n wsCommandCallbacks.delete(callback);\n };\n },\n\n async hasServeHandler(): Promise<boolean> {\n const reqId = state.nextRequestId++;\n const req: FetchHasServeHandlerRequest = {\n type: MessageType.FETCH_HAS_SERVE_HANDLER,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<boolean>(state, req);\n },\n\n async hasActiveConnections(): Promise<boolean> {\n const reqId = state.nextRequestId++;\n const req: FetchHasActiveConnectionsRequest = {\n type: MessageType.FETCH_HAS_ACTIVE_CONNECTIONS,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<boolean>(state, req);\n },\n };\n\n // Create timers handle\n const timersHandle: RemoteTimersHandle = {\n async clearAll(): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: TimersClearAllRequest = {\n type: MessageType.TIMERS_CLEAR_ALL,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n // Create console handle\n const consoleHandle: RemoteConsoleHandle = {\n async reset(): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: ConsoleResetRequest = {\n type: MessageType.CONSOLE_RESET,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n\n async getTimers(): Promise<Map<string, number>> {\n const reqId = state.nextRequestId++;\n const req: ConsoleGetTimersRequest = {\n type: MessageType.CONSOLE_GET_TIMERS,\n requestId: reqId,\n isolateId,\n };\n const result = await sendRequest<Record<string, number>>(state, req);\n return new Map(Object.entries(result));\n },\n\n async getCounters(): Promise<Map<string, number>> {\n const reqId = state.nextRequestId++;\n const req: ConsoleGetCountersRequest = {\n type: MessageType.CONSOLE_GET_COUNTERS,\n requestId: reqId,\n isolateId,\n };\n const result = await sendRequest<Record<string, number>>(state, req);\n return new Map(Object.entries(result));\n },\n\n async getGroupDepth(): Promise<number> {\n const reqId = state.nextRequestId++;\n const req: ConsoleGetGroupDepthRequest = {\n type: MessageType.CONSOLE_GET_GROUP_DEPTH,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<number>(state, req);\n },\n };\n\n // Track whether testEnvironment and playwright were enabled\n const testEnvironmentEnabled = !!options.testEnvironment;\n const playwrightEnabled = !!options.playwright;\n\n // Create test environment handle\n const testEnvironmentHandle: RemoteTestEnvironmentHandle = {\n async runTests(timeout?: number): Promise<RunTestsResult> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: RunTestsRequest = {\n type: MessageType.RUN_TESTS,\n requestId: reqId,\n isolateId,\n timeout,\n };\n const requestTimeout =\n timeout === undefined\n ? DEFAULT_TIMEOUT\n : Math.max(timeout + TEST_REQUEST_TIMEOUT_BUFFER_MS, DEFAULT_TIMEOUT);\n return sendRequest<RunTestsResult>(state, req, requestTimeout);\n },\n\n async hasTests(): Promise<boolean> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: HasTestsRequest = {\n type: MessageType.HAS_TESTS,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<boolean>(state, req);\n },\n\n async getTestCount(): Promise<number> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: GetTestCountRequest = {\n type: MessageType.GET_TEST_COUNT,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<number>(state, req);\n },\n\n async reset(): Promise<void> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: ResetTestEnvRequest = {\n type: MessageType.RESET_TEST_ENV,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n // Create playwright handle\n const playwrightHandle: RemotePlaywrightHandle = {\n getCollectedData(): CollectedData {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.handler in createRuntime options.\");\n }\n return {\n browserConsoleLogs: [...browserConsoleLogs],\n networkRequests: [...networkRequests],\n networkResponses: [...networkResponses],\n };\n },\n\n clearCollectedData(): void {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.handler in createRuntime options.\");\n }\n browserConsoleLogs.length = 0;\n networkRequests.length = 0;\n networkResponses.length = 0;\n },\n };\n\n return {\n id: isolateId,\n reused,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n eval: async (\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> => {\n const reqId = state.nextRequestId++;\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n const req: EvalRequest = {\n type: MessageType.EVAL,\n requestId: reqId,\n isolateId,\n code,\n filename: options?.filename,\n maxExecutionMs: options?.maxExecutionMs,\n };\n await sendRequest<{ value: unknown }>(state, req);\n // Module evaluation returns void - don't return the value\n },\n\n dispose: async () => {\n // Clean up page listeners\n for (const cleanup of pageListenerCleanups) {\n cleanup();\n }\n // Clean up WebSocket callbacks\n isolateWsCallbacks.delete(isolateId);\n isolateWebSocketCallbacks.delete(isolateId);\n\n // Clean up client WebSockets (close all open connections)\n const clientSockets = isolateClientWebSockets.get(isolateId);\n if (clientSockets) {\n for (const ws of clientSockets.values()) {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, \"Isolate disposed\");\n }\n }\n isolateClientWebSockets.delete(isolateId);\n }\n\n const reqId = state.nextRequestId++;\n const req: DisposeRuntimeRequest = {\n type: MessageType.DISPOSE_RUNTIME,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n}\n\n/**\n * Register a simple event callback (fire-and-forget).\n */\nfunction registerEventCallback(\n state: ConnectionState,\n handler: (data: unknown) => void\n): number {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, (data: unknown) => {\n handler(data);\n return undefined;\n });\n return callbackId;\n}\n\n/**\n * Register console callbacks.\n */\nfunction registerConsoleCallbacks(\n state: ConnectionState,\n callbacks: ConsoleCallbacks\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n if (callbacks.onEntry) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, (entry: unknown) => {\n callbacks.onEntry!(entry as Parameters<typeof callbacks.onEntry>[0]);\n });\n registrations.onEntry = { callbackId, name: \"onEntry\", type: 'sync' };\n }\n\n return registrations;\n}\n\n/** Threshold for streaming callback responses (64KB) */\nconst CALLBACK_STREAM_THRESHOLD = 64 * 1024;\n\n/**\n * Register fetch callback.\n * Supports streaming responses for large/unknown-size bodies.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n // Mark this callback as needing requestId for streaming support\n state.callbacksNeedingRequestId.add(callbackId);\n\n // Register a callback that returns a special marker for streaming responses\n state.callbacks.set(callbackId, async (serialized: unknown, requestId: unknown) => {\n const data = serialized as SerializedRequestData;\n // Create a FetchRequestInit from the serialized data\n // Note: signal is not serialized over the wire, so we create a dummy one\n const init = {\n method: data.method,\n headers: data.headers,\n rawBody: data.body,\n body: data.body as BodyInit | null,\n signal: new AbortController().signal,\n };\n const response = await callback(data.url, init);\n\n // Determine if we should stream the response\n const contentLength = response.headers.get(\"content-length\");\n const knownSize = contentLength ? parseInt(contentLength, 10) : null;\n\n // Only stream network responses (responses with http/https URLs)\n // Locally constructed Responses (no URL or non-http URL) are buffered\n const isNetworkResponse = response.url && (response.url.startsWith('http://') || response.url.startsWith('https://'));\n\n // Stream if: network response AND has body AND (no content-length OR size > threshold)\n const shouldStream = isNetworkResponse && response.body && (knownSize === null || knownSize > CALLBACK_STREAM_THRESHOLD);\n\n if (shouldStream && response.body) {\n // Streaming path: send metadata immediately, then stream body\n const streamId = state.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 CALLBACK_STREAM_START with metadata\n sendMessage(state.socket, {\n type: MessageType.CALLBACK_STREAM_START,\n requestId: requestId as number,\n streamId,\n metadata: {\n status: response.status,\n statusText: response.statusText,\n headers,\n url: response.url || undefined,\n },\n } as CallbackStreamStart);\n\n // Stream the body in the background\n streamCallbackResponseBody(state, streamId, requestId as number, response.body);\n\n // Return special marker indicating streaming is in progress\n return { __callbackStreaming: true, streamId };\n }\n\n // Buffered path for small responses\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", type: 'async' };\n}\n\n/**\n * Stream a callback response body to the daemon.\n */\nasync function streamCallbackResponseBody(\n state: ConnectionState,\n streamId: number,\n requestId: number,\n body: ReadableStream<Uint8Array>\n): Promise<void> {\n const reader = body.getReader();\n state.callbackStreamReaders.set(streamId, reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Send stream end\n sendMessage(state.socket, {\n type: MessageType.CALLBACK_STREAM_END,\n requestId,\n streamId,\n } as CallbackStreamEnd);\n break;\n }\n\n // Send chunk(s) - split large chunks if needed\n for (let offset = 0; offset < value.length; offset += STREAM_CHUNK_SIZE) {\n const chunk = value.slice(offset, offset + STREAM_CHUNK_SIZE);\n sendMessage(state.socket, {\n type: MessageType.CALLBACK_STREAM_CHUNK,\n requestId,\n streamId,\n chunk,\n } as CallbackStreamChunk);\n }\n }\n } catch (err) {\n // Ignore cancellation errors\n if (!(err instanceof Error && err.message.includes('cancel'))) {\n // Send error\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n }\n } finally {\n state.callbackStreamReaders.delete(streamId);\n reader.releaseLock();\n }\n}\n\n/**\n * Register file system callbacks.\n */\nfunction registerFsCallbacks(\n state: ConnectionState,\n callbacks: FileSystemCallbacks\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n // readFile: (path: string) => Promise<ArrayBuffer>\n if (callbacks.readFile) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n const result = await callbacks.readFile!(path as string);\n // Convert ArrayBuffer to Uint8Array for serialization\n return new Uint8Array(result);\n });\n registrations.readFile = { callbackId, name: \"readFile\", type: 'async' };\n }\n\n // writeFile: (path: string, data: ArrayBuffer) => Promise<void>\n if (callbacks.writeFile) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown, data: unknown) => {\n // Convert Uint8Array or array back to ArrayBuffer\n let buffer: ArrayBuffer;\n if (data instanceof Uint8Array) {\n buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n } else if (Array.isArray(data)) {\n buffer = new Uint8Array(data as number[]).buffer;\n } else if (data instanceof ArrayBuffer) {\n buffer = data;\n } else {\n buffer = new ArrayBuffer(0);\n }\n await callbacks.writeFile!(path as string, buffer);\n });\n registrations.writeFile = { callbackId, name: \"writeFile\", type: 'async' };\n }\n\n // unlink: (path: string) => Promise<void>\n if (callbacks.unlink) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n await callbacks.unlink!(path as string);\n });\n registrations.unlink = { callbackId, name: \"unlink\", type: 'async' };\n }\n\n // readdir: (path: string) => Promise<string[]>\n if (callbacks.readdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n return callbacks.readdir!(path as string);\n });\n registrations.readdir = { callbackId, name: \"readdir\", type: 'async' };\n }\n\n // mkdir: (path: string, options?: { recursive?: boolean }) => Promise<void>\n if (callbacks.mkdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown, options: unknown) => {\n await callbacks.mkdir!(path as string, options as { recursive?: boolean });\n });\n registrations.mkdir = { callbackId, name: \"mkdir\", type: 'async' };\n }\n\n // rmdir: (path: string) => Promise<void>\n if (callbacks.rmdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n await callbacks.rmdir!(path as string);\n });\n registrations.rmdir = { callbackId, name: \"rmdir\", type: 'async' };\n }\n\n // stat: (path: string) => Promise<{ isFile: boolean; isDirectory: boolean; size: number }>\n if (callbacks.stat) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n return callbacks.stat!(path as string);\n });\n registrations.stat = { callbackId, name: \"stat\", type: 'async' };\n }\n\n // rename: (from: string, to: string) => Promise<void>\n if (callbacks.rename) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (from: unknown, to: unknown) => {\n await callbacks.rename!(from as string, to as string);\n });\n registrations.rename = { callbackId, name: \"rename\", type: 'async' };\n }\n\n return registrations;\n}\n\n/**\n * Register module loader callback.\n * Uses connection-level cache to avoid calling the callback multiple times for the same module.\n */\nfunction registerModuleLoaderCallback(\n state: ConnectionState,\n callback: ModuleLoaderCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (moduleName: unknown, importer: unknown) => {\n const specifier = moduleName as string;\n const importerInfo = importer as { path: string; resolveDir: string };\n\n // Call user's module loader - returns { code, resolveDir }\n const result = await callback(specifier, importerInfo);\n\n // Cache using resolved path\n const resolvedPath = path.posix.join(result.resolveDir, path.posix.basename(specifier));\n state.moduleSourceCache.set(resolvedPath, result.code);\n\n return result;\n });\n\n return { callbackId, name: \"moduleLoader\", type: 'async' };\n}\n\n// Iterator session tracking for async iterator custom functions on the client side\ninterface ClientIteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst clientIteratorSessions = new Map<number, ClientIteratorSession>();\nlet nextClientIteratorId = 1;\n\n// Registries for returned promises/iterators from custom function callbacks\n// These are populated when a custom function returns a Promise or AsyncIterator\nconst returnedPromiseRegistry = new Map<number, Promise<unknown>>();\nconst returnedIteratorRegistry = new Map<number, AsyncIterator<unknown>>();\n\n/**\n * Type guard for PromiseRef\n */\nfunction isPromiseRef(value: unknown): value is { __type: \"PromiseRef\"; promiseId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'PromiseRef'\n );\n}\n\n/**\n * Type guard for AsyncIteratorRef\n */\nfunction isAsyncIteratorRef(value: unknown): value is { __type: \"AsyncIteratorRef\"; iteratorId: number } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __type?: string }).__type === 'AsyncIteratorRef'\n );\n}\n\n/**\n * Register custom function callbacks.\n */\nfunction registerCustomFunctions(\n state: ConnectionState,\n customFunctions: CustomFunctions\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n for (const [name, def] of Object.entries(customFunctions)) {\n if (def.type === 'asyncIterator') {\n // For async iterators, we need to register 4 callbacks:\n // start, next, return, throw\n\n // Start callback: creates iterator, returns iteratorId\n const startCallbackId = state.nextCallbackId++;\n state.callbacks.set(startCallbackId, async (...args: unknown[]) => {\n try {\n const fn = def.fn as (...args: unknown[]) => AsyncGenerator<unknown, unknown, unknown>;\n const iterator = fn(...args);\n const iteratorId = nextClientIteratorId++;\n clientIteratorSessions.set(iteratorId, { iterator });\n return { iteratorId };\n } catch (error: unknown) {\n throw error;\n }\n });\n\n // Next callback: calls iterator.next() - marshal the value for type fidelity\n const nextCallbackId = state.nextCallbackId++;\n state.callbacks.set(nextCallbackId, async (iteratorId: unknown) => {\n const session = clientIteratorSessions.get(iteratorId as number);\n if (!session) {\n throw new Error(`Iterator session ${iteratorId} not found`);\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n clientIteratorSessions.delete(iteratorId as number);\n }\n return { done: result.done, value: await marshalValue(result.value) };\n } catch (error: unknown) {\n clientIteratorSessions.delete(iteratorId as number);\n throw error;\n }\n });\n\n // Return callback: calls iterator.return() - marshal the value for type fidelity\n const returnCallbackId = state.nextCallbackId++;\n state.callbacks.set(returnCallbackId, async (iteratorId: unknown, value: unknown) => {\n const session = clientIteratorSessions.get(iteratorId as number);\n if (!session) {\n return { done: true, value: await marshalValue(undefined) };\n }\n try {\n const result = await session.iterator.return?.(value);\n clientIteratorSessions.delete(iteratorId as number);\n return { done: true, value: await marshalValue(result?.value) };\n } catch (error: unknown) {\n clientIteratorSessions.delete(iteratorId as number);\n throw error;\n }\n });\n\n // Throw callback: calls iterator.throw() - marshal the value for type fidelity\n const throwCallbackId = state.nextCallbackId++;\n state.callbacks.set(throwCallbackId, async (iteratorId: unknown, errorData: unknown) => {\n const session = clientIteratorSessions.get(iteratorId as number);\n if (!session) {\n throw new Error(`Iterator session ${iteratorId} not found`);\n }\n try {\n const errInfo = errorData as { message: string; name: string };\n const error = Object.assign(new Error(errInfo.message), { name: errInfo.name });\n const result = await session.iterator.throw?.(error);\n clientIteratorSessions.delete(iteratorId as number);\n return { done: result?.done ?? true, value: await marshalValue(result?.value) };\n } catch (error: unknown) {\n clientIteratorSessions.delete(iteratorId as number);\n throw error;\n }\n });\n\n // Register with special naming convention for iterator callbacks\n registrations[`${name}:start`] = { callbackId: startCallbackId, name: `${name}:start`, type: 'async' };\n registrations[`${name}:next`] = { callbackId: nextCallbackId, name: `${name}:next`, type: 'async' };\n registrations[`${name}:return`] = { callbackId: returnCallbackId, name: `${name}:return`, type: 'async' };\n registrations[`${name}:throw`] = { callbackId: throwCallbackId, name: `${name}:throw`, type: 'async' };\n\n // Also register the main entry with asyncIterator type so daemon knows this is an iterator\n registrations[name] = {\n callbackId: startCallbackId,\n name,\n type: 'asyncIterator',\n };\n } else {\n const callbackId = state.nextCallbackId++;\n\n // Register the callback - marshal the result to preserve type fidelity\n // (Request, Response, File, undefined, etc. → Refs)\n // Also register returned functions/promises/iterators so they can be called back\n state.callbacks.set(callbackId, async (...args: unknown[]) => {\n const result = await def.fn(...args);\n\n // Helper to add callback IDs to PromiseRef and AsyncIteratorRef\n const addCallbackIdsToRefs = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check for PromiseRef\n if (isPromiseRef(value)) {\n // Create a resolve callback\n const resolveCallbackId = state.nextCallbackId++;\n state.callbacks.set(resolveCallbackId, async (...args: unknown[]) => {\n const promiseId = args[0] as number;\n const promise = returnedPromiseRegistry.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const promiseResult = await promise;\n // Clean up\n returnedPromiseRegistry.delete(promiseId);\n // Marshal and process the result recursively\n const marshalledResult = await marshalValue(promiseResult, marshalCtx);\n return addCallbackIdsToRefs(marshalledResult);\n });\n return {\n ...value,\n __resolveCallbackId: resolveCallbackId,\n };\n }\n\n // Check for AsyncIteratorRef\n if (isAsyncIteratorRef(value)) {\n // Create next callback\n const nextCallbackId = state.nextCallbackId++;\n state.callbacks.set(nextCallbackId, async (...args: unknown[]) => {\n const iteratorId = args[0] as number;\n const iterator = returnedIteratorRegistry.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const iterResult = await iterator.next();\n if (iterResult.done) {\n returnedIteratorRegistry.delete(iteratorId);\n }\n // Marshal and process the value recursively\n const marshalledValue = await marshalValue(iterResult.value, marshalCtx);\n return {\n done: iterResult.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n // Create return callback\n const returnCallbackId = state.nextCallbackId++;\n state.callbacks.set(returnCallbackId, async (...args: unknown[]) => {\n const iteratorId = args[0] as number;\n const returnValue = args[1];\n const iterator = returnedIteratorRegistry.get(iteratorId);\n returnedIteratorRegistry.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const iterResult = await iterator.return(returnValue);\n const marshalledValue = await marshalValue(iterResult.value, marshalCtx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n };\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(item => addCallbackIdsToRefs(item));\n }\n\n // Handle plain objects (recursively process values)\n const objResult: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n objResult[key] = addCallbackIdsToRefs((value as Record<string, unknown>)[key]);\n }\n return objResult;\n };\n\n // Create context for registering returned callbacks/promises/iterators\n // These will be registered in state.callbacks so the daemon can call them back\n const marshalCtx: MarshalContext = {\n registerCallback: (fn: Function): number => {\n const returnedCallbackId = state.nextCallbackId++;\n // Register a callback that marshals its result recursively\n state.callbacks.set(returnedCallbackId, async (...args: unknown[]) => {\n const fnResult = await fn(...args);\n const marshalledResult = await marshalValue(fnResult, marshalCtx);\n return addCallbackIdsToRefs(marshalledResult);\n });\n return returnedCallbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = state.nextCallbackId++;\n // Store the promise - callback to resolve it will be created in addCallbackIdsToRefs\n returnedPromiseRegistry.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = state.nextCallbackId++;\n // Store the iterator - callbacks for next/return will be created in addCallbackIdsToRefs\n returnedIteratorRegistry.set(iteratorId, iterator);\n return iteratorId;\n },\n };\n\n const marshalled = await marshalValue(result, marshalCtx);\n const withCallbackIds = addCallbackIdsToRefs(marshalled);\n return withCallbackIds;\n });\n\n registrations[name] = {\n callbackId,\n name,\n type: def.type,\n };\n }\n }\n\n return registrations;\n}\n\n// ============================================================================\n// Request/Response Serialization\n// ============================================================================\n\ninterface SerializedRequestData {\n method: string;\n url: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\ninterface SerializedResponseData {\n status: number;\n statusText: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\nasync function serializeRequest(request: Request): Promise<SerializedRequestData> {\n const headers: [string, string][] = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (request.body) {\n body = new Uint8Array(await request.arrayBuffer());\n }\n\n return {\n method: request.method,\n url: request.url,\n headers,\n body,\n };\n}\n\nasync function serializeResponse(response: Response): Promise<SerializedResponseData> {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (response.body) {\n body = new Uint8Array(await response.arrayBuffer());\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n}\n\nfunction deserializeRequest(data: SerializedRequestData): Request {\n return new Request(data.url, {\n method: data.method,\n headers: data.headers,\n body: data.body as unknown as BodyInit | null | undefined,\n });\n}\n\nfunction deserializeResponse(data: SerializedResponse): Response {\n return new Response(data.body as unknown as BodyInit | null, {\n status: data.status,\n statusText: data.statusText,\n headers: data.headers,\n });\n}\n\n// ============================================================================\n// Streaming Request Serialization\n// ============================================================================\n\ninterface SerializedRequestWithStream extends SerializedRequestData {\n bodyStreamId?: number;\n bodyStream?: ReadableStream<Uint8Array>;\n}\n\n/**\n * Serialize a request, using streaming for large bodies.\n */\nasync function serializeRequestWithStreaming(\n state: ConnectionState,\n request: Request\n): Promise<SerializedRequestWithStream> {\n const headers: [string, string][] = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n let bodyStreamId: number | undefined;\n let bodyStream: ReadableStream<Uint8Array> | undefined;\n\n if (request.body) {\n // Check Content-Length header first\n const contentLength = request.headers.get(\"content-length\");\n const knownSize = contentLength ? parseInt(contentLength, 10) : null;\n\n if (knownSize !== null && knownSize > STREAM_THRESHOLD) {\n // Large body with known size - use streaming\n bodyStreamId = state.nextStreamId++;\n bodyStream = request.body;\n } else {\n // Small or unknown size - read into memory\n const clonedRequest = request.clone();\n try {\n body = new Uint8Array(await request.arrayBuffer());\n\n // Check if it ended up being large\n if (body.length > STREAM_THRESHOLD) {\n // Use the cloned request's body for streaming\n bodyStreamId = state.nextStreamId++;\n bodyStream = clonedRequest.body!;\n body = null;\n }\n } catch {\n // Failed to read body, try streaming\n bodyStreamId = state.nextStreamId++;\n bodyStream = clonedRequest.body!;\n }\n }\n }\n\n const result: SerializedRequestWithStream = {\n method: request.method,\n url: request.url,\n headers,\n body,\n };\n\n // Only include streaming fields if actually streaming\n if (bodyStreamId !== undefined) {\n result.bodyStreamId = bodyStreamId;\n result.bodyStream = bodyStream;\n }\n\n return result;\n}\n\n/**\n * Wait for credit to become available on an upload stream session.\n */\nfunction waitForUploadCredit(session: StreamUploadSession): Promise<void> {\n return new Promise((resolve) => {\n session.creditResolver = resolve;\n });\n}\n\n/**\n * Send a request body as a stream.\n */\nasync function sendBodyStream(\n state: ConnectionState,\n streamId: number,\n body: ReadableStream<Uint8Array>\n): Promise<void> {\n // Create upload session for tracking\n const session: StreamUploadSession = {\n streamId,\n requestId: 0,\n state: \"active\",\n bytesTransferred: 0,\n credit: 0, // Wait for initial credit from daemon\n };\n state.uploadStreams.set(streamId, session);\n\n const reader = body.getReader();\n\n try {\n while (true) {\n if (session.state !== \"active\") {\n throw new Error(\"Stream cancelled\");\n }\n\n // Wait for credit if needed\n while (session.credit < STREAM_CHUNK_SIZE && session.state === \"active\") {\n await waitForUploadCredit(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 // Send stream close\n sendMessage(state.socket, {\n type: MessageType.STREAM_CLOSE,\n streamId,\n } as StreamClose);\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 sendMessage(state.socket, {\n type: MessageType.STREAM_PUSH,\n streamId,\n chunk,\n } as StreamPush);\n\n session.credit -= chunk.length;\n session.bytesTransferred += chunk.length;\n }\n }\n } catch (err) {\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n throw err;\n } finally {\n reader.releaseLock();\n state.uploadStreams.delete(streamId);\n }\n}\n\n// ============================================================================\n// Client WebSocket Handlers (outbound connections from isolate)\n// ============================================================================\n\n/**\n * Handle CLIENT_WS_CONNECT command from daemon.\n * Creates a real WebSocket connection and sets up event handlers.\n * If a WebSocket callback is registered, it's used to create/proxy the connection.\n */\nfunction handleClientWsConnect(\n message: ClientWsConnectRequest,\n state: ConnectionState\n): void {\n const { isolateId, socketId, url, protocols } = message;\n\n // Get or create the WebSocket map for this isolate\n let sockets = isolateClientWebSockets.get(isolateId);\n if (!sockets) {\n sockets = new Map();\n isolateClientWebSockets.set(isolateId, sockets);\n }\n\n // Helper to set up event handlers on a WebSocket\n const setupWebSocket = (ws: WebSocket) => {\n // Track the socket\n sockets!.set(socketId, ws);\n\n // Set up event handlers\n ws.onopen = () => {\n const msg: ClientWsOpenedMessage = {\n type: MessageType.CLIENT_WS_OPENED,\n isolateId,\n socketId,\n protocol: ws.protocol || \"\",\n extensions: ws.extensions || \"\",\n };\n sendMessage(state.socket, msg);\n };\n\n ws.onmessage = (event) => {\n let data: string | Uint8Array;\n if (typeof event.data === \"string\") {\n data = event.data;\n } else if (event.data instanceof ArrayBuffer) {\n data = new Uint8Array(event.data);\n } else if (event.data instanceof Blob) {\n // Read blob asynchronously\n event.data.arrayBuffer().then((buffer) => {\n const msg: ClientWsMessageMessage = {\n type: MessageType.CLIENT_WS_MESSAGE,\n isolateId,\n socketId,\n data: new Uint8Array(buffer),\n };\n sendMessage(state.socket, msg);\n });\n return;\n } else {\n // Unknown data type, convert to string\n data = String(event.data);\n }\n\n const msg: ClientWsMessageMessage = {\n type: MessageType.CLIENT_WS_MESSAGE,\n isolateId,\n socketId,\n data,\n };\n sendMessage(state.socket, msg);\n };\n\n ws.onerror = () => {\n const msg: ClientWsErrorMessage = {\n type: MessageType.CLIENT_WS_ERROR,\n isolateId,\n socketId,\n };\n sendMessage(state.socket, msg);\n };\n\n ws.onclose = (event) => {\n const msg: ClientWsClosedMessage = {\n type: MessageType.CLIENT_WS_CLOSED,\n isolateId,\n socketId,\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n };\n sendMessage(state.socket, msg);\n\n // Clean up the socket\n sockets?.delete(socketId);\n if (sockets?.size === 0) {\n isolateClientWebSockets.delete(isolateId);\n }\n };\n };\n\n // Helper to send connection blocked/failed events\n const sendConnectionFailed = (reason: string) => {\n const errorMsg: ClientWsErrorMessage = {\n type: MessageType.CLIENT_WS_ERROR,\n isolateId,\n socketId,\n };\n sendMessage(state.socket, errorMsg);\n\n const closeMsg: ClientWsClosedMessage = {\n type: MessageType.CLIENT_WS_CLOSED,\n isolateId,\n socketId,\n code: 1006,\n reason,\n wasClean: false,\n };\n sendMessage(state.socket, closeMsg);\n };\n\n // Check if a WebSocket callback is registered for this isolate\n const callback = isolateWebSocketCallbacks.get(isolateId);\n\n if (callback) {\n // Use the callback to create/proxy the WebSocket\n try {\n const result = callback(url, protocols || []);\n\n if (result instanceof Promise) {\n // Handle async callback\n result\n .then((ws) => {\n if (ws === null) {\n // Connection blocked by callback\n sendConnectionFailed(\"Connection blocked\");\n } else {\n setupWebSocket(ws);\n }\n })\n .catch(() => {\n sendConnectionFailed(\"Callback error\");\n });\n } else if (result === null) {\n // Connection blocked by callback\n sendConnectionFailed(\"Connection blocked\");\n } else {\n // Callback returned a WebSocket synchronously\n setupWebSocket(result);\n }\n } catch {\n sendConnectionFailed(\"Callback error\");\n }\n } else {\n // No callback, create WebSocket directly (default behavior)\n try {\n const ws =\n protocols && protocols.length > 0\n ? new WebSocket(url, protocols)\n : new WebSocket(url);\n setupWebSocket(ws);\n } catch {\n sendConnectionFailed(\"Connection failed\");\n }\n }\n}\n\n/**\n * Handle CLIENT_WS_SEND command from daemon.\n * Sends data on an existing WebSocket connection.\n */\nfunction handleClientWsSend(\n message: ClientWsSendRequest,\n state: ConnectionState\n): void {\n const { isolateId, socketId, data } = message;\n\n const sockets = isolateClientWebSockets.get(isolateId);\n const ws = sockets?.get(socketId);\n\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return; // Silently ignore if socket not found or not open\n }\n\n // Handle binary data (check for __BINARY__ marker from isolate)\n if (typeof data === \"string\" && data.startsWith(\"__BINARY__\")) {\n const base64 = data.slice(10);\n const binary = Buffer.from(base64, \"base64\");\n ws.send(binary);\n } else if (data instanceof Uint8Array) {\n ws.send(data);\n } else {\n ws.send(data as string);\n }\n}\n\n/**\n * Handle CLIENT_WS_CLOSE command from daemon.\n * Closes an existing WebSocket connection.\n */\nfunction handleClientWsClose(\n message: ClientWsCloseRequest,\n state: ConnectionState\n): void {\n const { isolateId, socketId, code, reason } = message;\n\n const sockets = isolateClientWebSockets.get(isolateId);\n const ws = sockets?.get(socketId);\n\n if (!ws) {\n return; // Silently ignore if socket not found\n }\n\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(code ?? 1000, reason ?? \"\");\n }\n}\n"
|
|
5
|
+
"/**\n * Connection handling for the isolate client.\n */\n\nimport { connect as netConnect, type Socket } from \"node:net\";\nimport path from \"node:path\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n STREAM_THRESHOLD,\n STREAM_CHUNK_SIZE,\n STREAM_DEFAULT_CREDIT,\n type Message,\n type ResponseOk,\n type ResponseError,\n type CreateRuntimeRequest,\n type DisposeRuntimeRequest,\n type EvalRequest,\n type DispatchRequestRequest,\n type CallbackInvoke,\n type CallbackResponseMsg,\n type CallbackRegistration,\n type RuntimeCallbackRegistrations,\n type CreateRuntimeResult,\n type SerializedRequest,\n type SerializedResponse,\n type RunTestsRequest,\n type RunTestsResult,\n type HasTestsRequest,\n type GetTestCountRequest,\n type TestEnvironmentCallbackRegistrations,\n type TestEnvironmentOptionsProtocol,\n type CollectedData,\n type ResetTestEnvRequest,\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 IsolateEventMessage,\n type ClientEventMessage,\n IsolateEvents,\n ClientEvents,\n type WsCommandPayload,\n type WsClientConnectPayload,\n type WsClientSendPayload,\n type WsClientClosePayload,\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 marshalValue,\n isPromiseRef,\n isAsyncIteratorRef,\n serializeResponse,\n deserializeRequest,\n deserializeResponse,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport {\n getDefaultPlaywrightHandlerMetadata,\n type PlaywrightCallback,\n} from \"@ricsam/isolate-playwright/client\";\nimport type {\n ConnectOptions,\n DaemonConnection,\n RuntimeOptions,\n RemoteRuntime,\n RemoteFetchHandle,\n RemoteTimersHandle,\n RemoteConsoleHandle,\n RemoteTestEnvironmentHandle,\n RemotePlaywrightHandle,\n DispatchOptions,\n ConsoleCallbacks,\n FetchCallback,\n FileSystemCallbacks,\n ModuleLoaderCallback,\n CustomFunctions,\n EvalOptions,\n UpgradeRequest,\n WebSocketCommand,\n TestEnvironmentOptions,\n Namespace,\n} from \"./types.mjs\";\n\n// Track WebSocket command callbacks per isolate for handling WS_COMMAND messages\nconst isolateWsCallbacks = new Map<string, Set<(cmd: WebSocketCommand) => void>>();\n\n// Track client WebSockets per isolate (outbound connections from isolate)\n// Map: isolateId -> Map<socketId -> WebSocket>\nconst isolateClientWebSockets = new Map<string, Map<string, WebSocket>>();\n\n// Track WebSocket callbacks per isolate for handling outbound WebSocket connections\n// Map: isolateId -> WebSocketCallback\nimport type { WebSocketCallback } from \"@ricsam/isolate-protocol\";\nconst isolateWebSocketCallbacks = new Map<string, WebSocketCallback>();\n\n// Track event listeners per isolate for handling user-defined ISOLATE_EVENT messages\n// Map: isolateId -> Map<event, Set<callback>>\nconst isolateEventListeners = new Map<string, Map<string, Set<(payload: unknown) => void>>>();\n\ninterface PendingRequest {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n}\n\n/** Stream receiver for streaming response chunks directly to consumer */\ninterface StreamResponseReceiver {\n streamId: number;\n requestId: number;\n metadata?: {\n status?: number;\n statusText?: string;\n headers?: [string, string][];\n };\n controller: ReadableStreamDefaultController<Uint8Array>;\n state: \"active\" | \"closed\" | \"errored\";\n pendingChunks: Uint8Array[]; // Buffer for chunks arriving before consumer pulls\n error?: Error; // Stored error to propagate after pending chunks are consumed\n pullResolvers: Array<() => void>; // Queue of resolvers for pending pull() calls\n controllerFinalized: boolean; // True if controller.close() or controller.error() was called\n}\n\n/** Stream session for tracking upload streams (client sending to daemon) */\ninterface StreamUploadSession {\n streamId: number;\n requestId: number;\n state: \"active\" | \"closing\" | \"closed\";\n bytesTransferred: number;\n credit: number;\n creditResolver?: () => void;\n}\n\ninterface ConnectionState {\n socket: Socket;\n pendingRequests: Map<number, PendingRequest>;\n callbacks: Map<number, (...args: unknown[]) => unknown>;\n /** Callback IDs that need requestId passed as last argument (e.g., fetch callbacks for streaming) */\n callbacksNeedingRequestId: Set<number>;\n nextRequestId: number;\n nextCallbackId: number;\n nextStreamId: number;\n connected: boolean;\n /** Track streaming responses being received */\n streamResponses: Map<number, StreamResponseReceiver>;\n /** Track upload streams (for request body streaming) */\n uploadStreams: Map<number, StreamUploadSession>;\n /** Cache for module source code (shared across all runtimes in this connection) */\n moduleSourceCache: Map<string, string>;\n /** Track active callback stream readers (for cancellation from daemon) */\n callbackStreamReaders: Map<number, ReadableStreamDefaultReader<Uint8Array>>;\n}\n\n/**\n * Connect to the isolate daemon.\n */\nexport async function connect(options: ConnectOptions = {}): Promise<DaemonConnection> {\n const socket = await createSocket(options);\n\n const state: ConnectionState = {\n socket,\n pendingRequests: new Map(),\n callbacks: new Map(),\n callbacksNeedingRequestId: new Set(),\n nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n connected: true,\n streamResponses: new Map(),\n uploadStreams: new Map(),\n moduleSourceCache: new Map(),\n callbackStreamReaders: new Map(),\n };\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, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests\n for (const [, pending] of state.pendingRequests) {\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n\n // Clean up streaming responses - error any pending streams\n for (const [, receiver] of state.streamResponses) {\n receiver.state = \"errored\";\n receiver.error = new Error(\"Connection closed\");\n // Resolve all pending pull promises so the stream can error properly\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n }\n state.streamResponses.clear();\n\n // Clean up upload streams\n for (const [, session] of state.uploadStreams) {\n session.state = \"closed\";\n if (session.creditResolver) {\n session.creditResolver();\n }\n }\n state.uploadStreams.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\n createNamespace: (id: string): Namespace => ({\n id,\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions, id),\n }),\n close: async () => {\n state.connected = false;\n socket.destroy();\n },\n isConnected: () => state.connected,\n };\n}\n\n/**\n * Create a socket connection.\n */\nfunction createSocket(options: ConnectOptions): Promise<Socket> {\n return new Promise((resolve, reject) => {\n const timeout = options.timeout;\n\n let socket: Socket;\n\n const onError = (err: Error) => {\n reject(err);\n };\n\n const onConnect = () => {\n socket.removeListener(\"error\", onError);\n resolve(socket);\n };\n\n if (options.socket) {\n socket = netConnect(options.socket, onConnect);\n } else {\n socket = netConnect(\n options.port ?? 47891,\n options.host ?? \"127.0.0.1\",\n onConnect\n );\n }\n\n socket.on(\"error\", onError);\n\n // Connection timeout (opt-in)\n if (timeout && timeout > 0) {\n const timeoutId = setTimeout(() => {\n socket.destroy();\n reject(new Error(\"Connection timeout\"));\n }, timeout);\n\n socket.once(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n });\n}\n\n/**\n * Handle an incoming message from the daemon.\n */\nfunction handleMessage(message: Message, state: ConnectionState): void {\n switch (message.type) {\n case MessageType.RESPONSE_OK: {\n const response = message as ResponseOk;\n const pending = state.pendingRequests.get(response.requestId);\n if (pending) {\n state.pendingRequests.delete(response.requestId);\n pending.resolve(response.data);\n }\n break;\n }\n\n case MessageType.RESPONSE_ERROR: {\n const response = message as ResponseError;\n const pending = state.pendingRequests.get(response.requestId);\n if (pending) {\n state.pendingRequests.delete(response.requestId);\n const error = new Error(response.message);\n if (response.details) {\n error.name = response.details.name;\n if (response.details.stack) {\n error.stack = response.details.stack;\n }\n }\n pending.reject(error);\n }\n break;\n }\n\n case MessageType.CALLBACK_INVOKE: {\n const invoke = message as CallbackInvoke;\n handleCallbackInvoke(invoke, state);\n break;\n }\n\n case MessageType.PONG:\n // Heartbeat response, ignore\n break;\n\n case MessageType.CALLBACK_STREAM_CANCEL: {\n const streamId = (message as { streamId: number }).streamId;\n const reader = state.callbackStreamReaders.get(streamId);\n if (reader) {\n reader.cancel().catch(() => {});\n }\n break;\n }\n\n // Generic isolate events (WebSocket commands and user-defined events)\n case MessageType.ISOLATE_EVENT: {\n const msg = message as IsolateEventMessage;\n handleIsolateEvent(msg, state);\n break;\n }\n\n // Streaming response messages\n case MessageType.RESPONSE_STREAM_START: {\n const msg = message as ResponseStreamStart;\n\n // Create a partial receiver that will be completed when the stream is created\n const receiver: StreamResponseReceiver = {\n streamId: msg.streamId,\n requestId: msg.requestId,\n metadata: msg.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 // Store the controller in the receiver\n receiver.controller = controller;\n },\n pull(_controller) {\n // Consumer is ready for more data\n // If controller is already finalized, just return\n if (receiver.controllerFinalized) {\n return;\n }\n\n // Flush any pending chunks first\n while (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\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 a resolved Promise to signal completion cleanly\n return Promise.resolve();\n }\n if (receiver.state === \"errored\") {\n // Error the stream if not already done\n if (!receiver.controllerFinalized && receiver.error) {\n receiver.controllerFinalized = true;\n receiver.controller.error(receiver.error);\n }\n // Return a resolved Promise to signal completion cleanly\n return Promise.resolve();\n }\n\n // Send credit to daemon to request more data\n sendMessage(state.socket, {\n type: MessageType.STREAM_PULL,\n streamId: msg.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\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 // Consumer cancelled the stream - mark as closed (not errored)\n // since cancel is a clean termination\n receiver.state = \"closed\";\n receiver.controllerFinalized = true; // Mark as finalized on cancel\n\n // Resolve ALL pending pull promises to allow cleanup\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n // Notify daemon that stream was cancelled\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId: msg.streamId,\n error: \"Stream cancelled by consumer\",\n } as StreamError);\n state.streamResponses.delete(msg.streamId);\n\n // Return a Promise that resolves after a macrotask to ensure\n // all internal cleanup and promise resolution is processed\n return new Promise<void>((resolve) => setTimeout(resolve, 0));\n },\n });\n\n state.streamResponses.set(msg.streamId, receiver);\n\n // Create Response and resolve the pending request immediately\n const pending = state.pendingRequests.get(msg.requestId);\n if (pending) {\n state.pendingRequests.delete(msg.requestId);\n\n const response = new Response(readableStream, {\n status: msg.metadata?.status ?? 200,\n statusText: msg.metadata?.statusText ?? \"OK\",\n headers: msg.metadata?.headers,\n });\n\n // Resolve with a marker that this is a streaming Response\n pending.resolve({ response, __streaming: true });\n }\n\n // Send initial credit to start receiving data\n sendMessage(state.socket, {\n type: MessageType.STREAM_PULL,\n streamId: msg.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\n break;\n }\n\n case MessageType.RESPONSE_STREAM_CHUNK: {\n const msg = message as ResponseStreamChunk;\n const receiver = state.streamResponses.get(msg.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(msg.chunk);\n const resolver = receiver.pullResolvers.shift()!;\n resolver();\n } else {\n // Consumer not ready - buffer the chunk\n receiver.pendingChunks.push(msg.chunk);\n }\n }\n break;\n }\n\n case MessageType.RESPONSE_STREAM_END: {\n const msg = message as ResponseStreamEnd;\n const receiver = state.streamResponses.get(msg.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 state.streamResponses.delete(msg.streamId);\n }\n break;\n }\n\n case MessageType.STREAM_PULL: {\n const msg = message as StreamPull;\n const session = state.uploadStreams.get(msg.streamId);\n if (session) {\n session.credit += msg.maxBytes;\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 break;\n }\n\n case MessageType.STREAM_ERROR: {\n const msg = message as StreamError;\n // Handle error for upload streams\n const uploadSession = state.uploadStreams.get(msg.streamId);\n if (uploadSession) {\n uploadSession.state = \"closed\";\n state.uploadStreams.delete(msg.streamId);\n }\n // Handle error for response streams (streaming mode)\n const receiver = state.streamResponses.get(msg.streamId);\n if (receiver) {\n // Mark stream as errored and store the error\n receiver.state = \"errored\";\n receiver.error = new Error(msg.error);\n\n // Flush any remaining pending chunks to controller\n // These will be readable before the error is signaled\n while (receiver.pendingChunks.length > 0) {\n const chunk = receiver.pendingChunks.shift()!;\n receiver.controller.enqueue(chunk);\n }\n\n // Resolve all pending pull promises so consumer can proceed to read queued chunks\n // The error will be signaled on the next pull() after queue is empty\n const resolvers = receiver.pullResolvers.splice(0);\n for (const resolver of resolvers) {\n resolver();\n }\n\n // Clean up from map - pull() still has access to receiver via closure\n // Note: Don't call controller.error() here - it discards queued chunks\n state.streamResponses.delete(msg.streamId);\n }\n break;\n }\n\n default:\n console.warn(`Unexpected message type: ${message.type}`);\n }\n}\n\n/**\n * Handle a callback invocation from the daemon.\n */\nasync function handleCallbackInvoke(\n invoke: CallbackInvoke,\n state: ConnectionState\n): Promise<void> {\n const callback = state.callbacks.get(invoke.callbackId);\n\n const response: CallbackResponseMsg = {\n type: MessageType.CALLBACK_RESPONSE,\n requestId: invoke.requestId,\n };\n\n if (!callback) {\n response.error = {\n name: \"Error\",\n message: `Unknown callback: ${invoke.callbackId}`,\n };\n sendMessage(state.socket, response);\n } else {\n try {\n // Only pass requestId to callbacks that need it (e.g., fetch callbacks for streaming)\n const needsRequestId = state.callbacksNeedingRequestId.has(invoke.callbackId);\n const result = needsRequestId\n ? await callback(...invoke.args, invoke.requestId)\n : await callback(...invoke.args);\n\n // Check if this is a streaming response (don't send CALLBACK_RESPONSE, streaming handles it)\n if (result && typeof result === 'object' && (result as { __callbackStreaming?: boolean }).__callbackStreaming) {\n // Streaming response - CALLBACK_STREAM_START already sent, body streaming in progress\n // Don't send a CALLBACK_RESPONSE here\n return;\n }\n\n response.result = result;\n sendMessage(state.socket, response);\n } catch (err) {\n const error = err as Error;\n response.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n sendMessage(state.socket, response);\n }\n }\n}\n\n/**\n * Send a message to the daemon.\n */\nfunction sendMessage(socket: Socket, message: Message): void {\n const frame = buildFrame(message);\n socket.write(frame);\n}\n\n/**\n * Send a request and wait for response.\n */\nfunction sendRequest<T>(\n state: ConnectionState,\n message: Message,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!state.connected) {\n reject(new Error(\"Not connected\"));\n return;\n }\n\n const requestId = (message as { requestId: number }).requestId;\n\n state.pendingRequests.set(requestId, {\n resolve: resolve as (data: unknown) => void,\n reject,\n });\n\n sendMessage(state.socket, message);\n });\n}\n\nexport function isBenignDisposeError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /isolate not owned by this connection|isolate not found|not connected|connection closed/i.test(\n message\n );\n}\n\n/**\n * Create a runtime in the daemon.\n */\nasync function createRuntime<T extends Record<string, any[]> = Record<string, unknown[]>>(\n state: ConnectionState,\n options: RuntimeOptions<T> = {},\n namespaceId?: string\n): Promise<RemoteRuntime> {\n // Register callbacks\n const callbacks: RuntimeCallbackRegistrations = {};\n\n if (options.console) {\n callbacks.console = registerConsoleCallbacks(state, options.console);\n }\n\n if (options.fetch) {\n callbacks.fetch = registerFetchCallback(state, options.fetch);\n }\n\n if (options.fs) {\n callbacks.fs = registerFsCallbacks(state, options.fs);\n }\n\n if (options.moduleLoader) {\n callbacks.moduleLoader = registerModuleLoaderCallback(\n state,\n options.moduleLoader\n );\n }\n\n if (options.customFunctions) {\n callbacks.custom = registerCustomFunctions(state, options.customFunctions as CustomFunctions<Record<string, unknown[]>>);\n }\n\n // Playwright callback registration - client owns the browser\n let playwrightHandler: PlaywrightCallback | undefined;\n // Client-side browser event buffers\n const browserConsoleLogs: { level: string; stdout: string; timestamp: number }[] = [];\n const networkRequests: { url: string; method: string; headers: Record<string, string>; timestamp: number }[] = [];\n const networkResponses: { url: string; status: number; headers: Record<string, string>; timestamp: number }[] = [];\n const pageListenerCleanups: (() => void)[] = [];\n\n if (options.playwright) {\n playwrightHandler = options.playwright.handler;\n if (!playwrightHandler) {\n throw new Error(\"playwright.handler is required when using playwright options\");\n }\n const page = getDefaultPlaywrightHandlerMetadata(playwrightHandler)?.page;\n\n const handlerCallbackId = state.nextCallbackId++;\n state.callbacks.set(handlerCallbackId, async (opJson: unknown) => {\n const op = JSON.parse(opJson as string) as PlaywrightOperation;\n const result = await playwrightHandler!(op);\n return JSON.stringify(result);\n });\n\n // If handler was created from a page via defaultPlaywrightHandler(),\n // preserve local event capture and collected-data ergonomics.\n if (page) {\n const onConsole = (msg: { type: () => string; text: () => string }) => {\n const entry = {\n level: msg.type(),\n stdout: msg.text(),\n timestamp: Date.now(),\n };\n browserConsoleLogs.push(entry);\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"browserConsoleLog\",\n ...entry,\n });\n }\n\n if (options.playwright!.console && options.console?.onEntry) {\n options.console.onEntry({\n type: \"browserOutput\",\n ...entry,\n });\n } else if (options.playwright!.console) {\n const prefix = entry.level === \"error\" ? \"[browser:error]\" : \"[browser]\";\n console.log(prefix, entry.stdout);\n }\n };\n\n const onRequest = (request: { url: () => string; method: () => string; headers: () => Record<string, string> }) => {\n const info = {\n url: request.url(),\n method: request.method(),\n headers: request.headers(),\n timestamp: Date.now(),\n };\n networkRequests.push(info);\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"networkRequest\",\n ...info,\n });\n }\n };\n\n const onResponse = (response: { url: () => string; status: () => number; headers: () => Record<string, string> }) => {\n const info = {\n url: response.url(),\n status: response.status(),\n headers: response.headers(),\n timestamp: Date.now(),\n };\n networkResponses.push(info);\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"networkResponse\",\n ...info,\n });\n }\n };\n\n page.on(\"console\", onConsole);\n page.on(\"request\", onRequest);\n page.on(\"response\", onResponse);\n\n pageListenerCleanups.push(\n () => page.removeListener(\"console\", onConsole),\n () => page.removeListener(\"request\", onRequest),\n () => page.removeListener(\"response\", onResponse),\n );\n }\n\n callbacks.playwright = {\n handlerCallbackId,\n console: options.playwright.console && !options.console?.onEntry,\n };\n }\n\n // Test environment callback registration\n let testEnvironmentOption: boolean | TestEnvironmentOptionsProtocol | undefined;\n if (options.testEnvironment) {\n if (typeof options.testEnvironment === \"object\") {\n const testEnvOptions = options.testEnvironment;\n const testEnvCallbacks: TestEnvironmentCallbackRegistrations = {};\n\n if (testEnvOptions.onEvent) {\n const userOnEvent = testEnvOptions.onEvent;\n const onEventCallbackId = registerEventCallback(state, (eventJson: unknown) => {\n const event = JSON.parse(eventJson as string);\n userOnEvent(event);\n });\n testEnvCallbacks.onEvent = {\n callbackId: onEventCallbackId,\n name: \"testEnvironment.onEvent\",\n type: 'sync',\n };\n }\n\n testEnvironmentOption = {\n callbacks: testEnvCallbacks,\n testTimeout: testEnvOptions.testTimeout,\n };\n } else {\n testEnvironmentOption = true;\n }\n }\n\n const requestId = state.nextRequestId++;\n const request: CreateRuntimeRequest = {\n type: MessageType.CREATE_RUNTIME,\n requestId,\n options: {\n memoryLimitMB: options.memoryLimitMB,\n cwd: options.cwd,\n callbacks,\n testEnvironment: testEnvironmentOption,\n namespaceId,\n },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\n const reused = result.reused ?? false;\n\n // WebSocket command callbacks - store in module-level Map for WS_COMMAND message handling\n const wsCommandCallbacks: Set<(cmd: WebSocketCommand) => void> = new Set();\n isolateWsCallbacks.set(isolateId, wsCommandCallbacks);\n if (options.onWebSocketCommand) {\n wsCommandCallbacks.add(options.onWebSocketCommand);\n }\n\n // Store WebSocket callback if provided (for outbound connections from isolate)\n if (options.webSocket) {\n isolateWebSocketCallbacks.set(isolateId, options.webSocket);\n }\n\n // Create fetch handle\n const fetchHandle: RemoteFetchHandle = {\n async dispatchRequest(req: Request, opts?: DispatchOptions) {\n const signal = opts?.signal;\n if (signal?.aborted) {\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n\n const reqId = state.nextRequestId++;\n const serialized = await serializeRequestWithStreaming(state, req);\n\n // Extract bodyStream before creating the protocol message (can't be serialized)\n const { bodyStream, ...serializableRequest } = serialized;\n\n const request: DispatchRequestRequest = {\n type: MessageType.DISPATCH_REQUEST,\n requestId: reqId,\n isolateId,\n request: serializableRequest,\n };\n\n // Helper to handle response which may be streaming or buffered\n const handleResponse = (res: { response: SerializedResponse | Response; __streaming?: boolean }): Response => {\n // Streaming case: already a Response\n if (res.__streaming && res.response instanceof Response) {\n return res.response;\n }\n // Buffered case: deserialize SerializedResponse\n return deserializeResponse(res.response as SerializedResponse);\n };\n\n // Set up abort signal handling\n let onAbort: (() => void) | undefined;\n if (signal) {\n onAbort = () => {\n const pending = state.pendingRequests.get(reqId);\n if (pending) {\n state.pendingRequests.delete(reqId);\n pending.reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n }\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n // If streaming body, start sending chunks after request is sent\n if (serialized.bodyStreamId !== undefined && bodyStream) {\n const streamId = serialized.bodyStreamId;\n\n // Send the request first\n const responsePromise = sendRequest<{ response: SerializedResponse | Response; __streaming?: boolean }>(\n state,\n request,\n );\n\n // Then stream the body\n await sendBodyStream(state, streamId, bodyStream);\n\n // Wait for response\n const res = await responsePromise;\n return handleResponse(res);\n } else {\n const res = await sendRequest<{ response: SerializedResponse | Response; __streaming?: boolean }>(\n state,\n request,\n );\n return handleResponse(res);\n }\n } finally {\n if (signal && onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n },\n\n async getUpgradeRequest(): Promise<UpgradeRequest | null> {\n const reqId = state.nextRequestId++;\n const req: FetchGetUpgradeRequestRequest = {\n type: MessageType.FETCH_GET_UPGRADE_REQUEST,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<UpgradeRequest | null>(state, req);\n },\n\n async dispatchWebSocketOpen(connectionId: string): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: WsOpenRequest = {\n type: MessageType.WS_OPEN,\n requestId: reqId,\n isolateId,\n connectionId,\n };\n await sendRequest(state, req);\n },\n\n async dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): Promise<void> {\n const reqId = state.nextRequestId++;\n const data = message instanceof ArrayBuffer ? new Uint8Array(message) : message;\n const req: WsMessageRequest = {\n type: MessageType.WS_MESSAGE,\n requestId: reqId,\n isolateId,\n connectionId,\n data,\n };\n await sendRequest(state, req);\n },\n\n async dispatchWebSocketClose(connectionId: string, code: number, reason: string): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: WsCloseRequest = {\n type: MessageType.WS_CLOSE,\n requestId: reqId,\n isolateId,\n connectionId,\n code,\n reason,\n };\n await sendRequest(state, req);\n },\n\n async dispatchWebSocketError(connectionId: string, error: Error): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: FetchWsErrorRequest = {\n type: MessageType.FETCH_WS_ERROR,\n requestId: reqId,\n isolateId,\n connectionId,\n error: error.message,\n };\n await sendRequest(state, req);\n },\n\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void {\n wsCommandCallbacks.add(callback);\n return () => {\n wsCommandCallbacks.delete(callback);\n };\n },\n\n async hasServeHandler(): Promise<boolean> {\n const reqId = state.nextRequestId++;\n const req: FetchHasServeHandlerRequest = {\n type: MessageType.FETCH_HAS_SERVE_HANDLER,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<boolean>(state, req);\n },\n\n async hasActiveConnections(): Promise<boolean> {\n const reqId = state.nextRequestId++;\n const req: FetchHasActiveConnectionsRequest = {\n type: MessageType.FETCH_HAS_ACTIVE_CONNECTIONS,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<boolean>(state, req);\n },\n };\n\n // Create timers handle\n const timersHandle: RemoteTimersHandle = {\n async clearAll(): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: TimersClearAllRequest = {\n type: MessageType.TIMERS_CLEAR_ALL,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n // Create console handle\n const consoleHandle: RemoteConsoleHandle = {\n async reset(): Promise<void> {\n const reqId = state.nextRequestId++;\n const req: ConsoleResetRequest = {\n type: MessageType.CONSOLE_RESET,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n\n async getTimers(): Promise<Map<string, number>> {\n const reqId = state.nextRequestId++;\n const req: ConsoleGetTimersRequest = {\n type: MessageType.CONSOLE_GET_TIMERS,\n requestId: reqId,\n isolateId,\n };\n const result = await sendRequest<Record<string, number>>(state, req);\n return new Map(Object.entries(result));\n },\n\n async getCounters(): Promise<Map<string, number>> {\n const reqId = state.nextRequestId++;\n const req: ConsoleGetCountersRequest = {\n type: MessageType.CONSOLE_GET_COUNTERS,\n requestId: reqId,\n isolateId,\n };\n const result = await sendRequest<Record<string, number>>(state, req);\n return new Map(Object.entries(result));\n },\n\n async getGroupDepth(): Promise<number> {\n const reqId = state.nextRequestId++;\n const req: ConsoleGetGroupDepthRequest = {\n type: MessageType.CONSOLE_GET_GROUP_DEPTH,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<number>(state, req);\n },\n };\n\n // Track whether testEnvironment and playwright were enabled\n const testEnvironmentEnabled = !!options.testEnvironment;\n const playwrightEnabled = !!options.playwright;\n\n // Create test environment handle\n const testEnvironmentHandle: RemoteTestEnvironmentHandle = {\n async runTests(timeout?: number): Promise<RunTestsResult> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: RunTestsRequest = {\n type: MessageType.RUN_TESTS,\n requestId: reqId,\n isolateId,\n timeout,\n };\n return sendRequest<RunTestsResult>(state, req);\n },\n\n async hasTests(): Promise<boolean> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: HasTestsRequest = {\n type: MessageType.HAS_TESTS,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<boolean>(state, req);\n },\n\n async getTestCount(): Promise<number> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: GetTestCountRequest = {\n type: MessageType.GET_TEST_COUNT,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<number>(state, req);\n },\n\n async reset(): Promise<void> {\n if (!testEnvironmentEnabled) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: ResetTestEnvRequest = {\n type: MessageType.RESET_TEST_ENV,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n // Create playwright handle\n const playwrightHandle: RemotePlaywrightHandle = {\n getCollectedData(): CollectedData {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.handler in createRuntime options.\");\n }\n return {\n browserConsoleLogs: [...browserConsoleLogs],\n networkRequests: [...networkRequests],\n networkResponses: [...networkResponses],\n };\n },\n\n clearCollectedData(): void {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.handler in createRuntime options.\");\n }\n browserConsoleLogs.length = 0;\n networkRequests.length = 0;\n networkResponses.length = 0;\n },\n };\n\n return {\n id: isolateId,\n reused,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n eval: async (\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> => {\n const reqId = state.nextRequestId++;\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n const req: EvalRequest = {\n type: MessageType.EVAL,\n requestId: reqId,\n isolateId,\n code,\n filename: options?.filename,\n };\n await sendRequest<{ value: unknown }>(state, req);\n // Module evaluation returns void - don't return the value\n },\n\n on(event: string, callback: (payload: unknown) => void): () => void {\n let listeners = isolateEventListeners.get(isolateId);\n if (!listeners) {\n listeners = new Map();\n isolateEventListeners.set(isolateId, listeners);\n }\n let eventListeners = listeners.get(event);\n if (!eventListeners) {\n eventListeners = new Set();\n listeners.set(event, eventListeners);\n }\n eventListeners.add(callback);\n return () => {\n eventListeners!.delete(callback);\n if (eventListeners!.size === 0) {\n listeners!.delete(event);\n if (listeners!.size === 0) {\n isolateEventListeners.delete(isolateId);\n }\n }\n };\n },\n\n emit(event: string, payload: unknown): void {\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event,\n payload,\n } as ClientEventMessage);\n },\n\n dispose: async () => {\n // Clean up page listeners\n for (const cleanup of pageListenerCleanups) {\n cleanup();\n }\n // Clean up WebSocket callbacks\n isolateWsCallbacks.delete(isolateId);\n isolateWebSocketCallbacks.delete(isolateId);\n isolateEventListeners.delete(isolateId);\n\n // Clean up client WebSockets (close all open connections)\n const clientSockets = isolateClientWebSockets.get(isolateId);\n if (clientSockets) {\n for (const ws of clientSockets.values()) {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(1000, \"Isolate disposed\");\n }\n }\n isolateClientWebSockets.delete(isolateId);\n }\n\n const reqId = state.nextRequestId++;\n const req: DisposeRuntimeRequest = {\n type: MessageType.DISPOSE_RUNTIME,\n requestId: reqId,\n isolateId,\n };\n try {\n await sendRequest(state, req);\n } catch (error) {\n // Stale runtime handles after reconnect/ownership handoff are idempotent disposals.\n if (!isBenignDisposeError(error)) {\n throw error;\n }\n }\n },\n };\n}\n\n/**\n * Register a simple event callback (fire-and-forget).\n */\nfunction registerEventCallback(\n state: ConnectionState,\n handler: (data: unknown) => void\n): number {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, (data: unknown) => {\n handler(data);\n return undefined;\n });\n return callbackId;\n}\n\n/**\n * Register console callbacks.\n */\nfunction registerConsoleCallbacks(\n state: ConnectionState,\n callbacks: ConsoleCallbacks\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n if (callbacks.onEntry) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, (entry: unknown) => {\n callbacks.onEntry!(entry as Parameters<typeof callbacks.onEntry>[0]);\n });\n registrations.onEntry = { callbackId, name: \"onEntry\", type: 'sync' };\n }\n\n return registrations;\n}\n\n/** Threshold for streaming callback responses (64KB) */\nconst CALLBACK_STREAM_THRESHOLD = 64 * 1024;\n\n/**\n * Register fetch callback.\n * Supports streaming responses for large/unknown-size bodies.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n // Mark this callback as needing requestId for streaming support\n state.callbacksNeedingRequestId.add(callbackId);\n\n // Register a callback that returns a special marker for streaming responses\n state.callbacks.set(callbackId, async (serialized: unknown, requestId: unknown) => {\n const data = serialized as SerializedRequest;\n // Create a FetchRequestInit from the serialized data\n // Note: signal is not serialized over the wire, so we create a dummy one\n const init = {\n method: data.method,\n headers: data.headers,\n rawBody: data.body ?? null,\n body: (data.body ?? null) as BodyInit | null,\n signal: new AbortController().signal,\n };\n const response = await callback(data.url, init);\n\n // Determine if we should stream the response\n const contentLength = response.headers.get(\"content-length\");\n const knownSize = contentLength ? parseInt(contentLength, 10) : null;\n\n // Only stream network responses (responses with http/https URLs)\n // Locally constructed Responses (no URL or non-http URL) are buffered\n const isNetworkResponse = response.url && (response.url.startsWith('http://') || response.url.startsWith('https://'));\n\n // Stream if: network response AND has body AND (no content-length OR size > threshold)\n const shouldStream = isNetworkResponse && response.body && (knownSize === null || knownSize > CALLBACK_STREAM_THRESHOLD);\n\n if (shouldStream && response.body) {\n // Streaming path: send metadata immediately, then stream body\n const streamId = state.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 CALLBACK_STREAM_START with metadata\n sendMessage(state.socket, {\n type: MessageType.CALLBACK_STREAM_START,\n requestId: requestId as number,\n streamId,\n metadata: {\n status: response.status,\n statusText: response.statusText,\n headers,\n url: response.url || undefined,\n },\n } as CallbackStreamStart);\n\n // Stream the body in the background\n streamCallbackResponseBody(state, streamId, requestId as number, response.body);\n\n // Return special marker indicating streaming is in progress\n return { __callbackStreaming: true, streamId };\n }\n\n // Buffered path for small responses\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", type: 'async' };\n}\n\n/**\n * Stream a callback response body to the daemon.\n */\nasync function streamCallbackResponseBody(\n state: ConnectionState,\n streamId: number,\n requestId: number,\n body: ReadableStream<Uint8Array>\n): Promise<void> {\n const reader = body.getReader();\n state.callbackStreamReaders.set(streamId, reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Send stream end\n sendMessage(state.socket, {\n type: MessageType.CALLBACK_STREAM_END,\n requestId,\n streamId,\n } as CallbackStreamEnd);\n break;\n }\n\n // Send chunk(s) - split large chunks if needed\n for (let offset = 0; offset < value.length; offset += STREAM_CHUNK_SIZE) {\n const chunk = value.slice(offset, offset + STREAM_CHUNK_SIZE);\n sendMessage(state.socket, {\n type: MessageType.CALLBACK_STREAM_CHUNK,\n requestId,\n streamId,\n chunk,\n } as CallbackStreamChunk);\n }\n }\n } catch (err) {\n // Ignore cancellation errors\n if (!(err instanceof Error && err.message.includes('cancel'))) {\n // Send error\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n }\n } finally {\n state.callbackStreamReaders.delete(streamId);\n reader.releaseLock();\n }\n}\n\n/**\n * Register file system callbacks.\n */\nfunction registerFsCallbacks(\n state: ConnectionState,\n callbacks: FileSystemCallbacks\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n // readFile: (path: string) => Promise<ArrayBuffer>\n if (callbacks.readFile) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n const result = await callbacks.readFile!(path as string);\n // Convert ArrayBuffer to Uint8Array for serialization\n return new Uint8Array(result);\n });\n registrations.readFile = { callbackId, name: \"readFile\", type: 'async' };\n }\n\n // writeFile: (path: string, data: ArrayBuffer) => Promise<void>\n if (callbacks.writeFile) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown, data: unknown) => {\n // Convert Uint8Array or array back to ArrayBuffer\n let buffer: ArrayBuffer;\n if (data instanceof Uint8Array) {\n buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n } else if (Array.isArray(data)) {\n buffer = new Uint8Array(data as number[]).buffer;\n } else if (data instanceof ArrayBuffer) {\n buffer = data;\n } else {\n buffer = new ArrayBuffer(0);\n }\n await callbacks.writeFile!(path as string, buffer);\n });\n registrations.writeFile = { callbackId, name: \"writeFile\", type: 'async' };\n }\n\n // unlink: (path: string) => Promise<void>\n if (callbacks.unlink) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n await callbacks.unlink!(path as string);\n });\n registrations.unlink = { callbackId, name: \"unlink\", type: 'async' };\n }\n\n // readdir: (path: string) => Promise<string[]>\n if (callbacks.readdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n return callbacks.readdir!(path as string);\n });\n registrations.readdir = { callbackId, name: \"readdir\", type: 'async' };\n }\n\n // mkdir: (path: string, options?: { recursive?: boolean }) => Promise<void>\n if (callbacks.mkdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown, options: unknown) => {\n await callbacks.mkdir!(path as string, options as { recursive?: boolean });\n });\n registrations.mkdir = { callbackId, name: \"mkdir\", type: 'async' };\n }\n\n // rmdir: (path: string) => Promise<void>\n if (callbacks.rmdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n await callbacks.rmdir!(path as string);\n });\n registrations.rmdir = { callbackId, name: \"rmdir\", type: 'async' };\n }\n\n // stat: (path: string) => Promise<{ isFile: boolean; isDirectory: boolean; size: number }>\n if (callbacks.stat) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n return callbacks.stat!(path as string);\n });\n registrations.stat = { callbackId, name: \"stat\", type: 'async' };\n }\n\n // rename: (from: string, to: string) => Promise<void>\n if (callbacks.rename) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (from: unknown, to: unknown) => {\n await callbacks.rename!(from as string, to as string);\n });\n registrations.rename = { callbackId, name: \"rename\", type: 'async' };\n }\n\n return registrations;\n}\n\n/**\n * Register module loader callback.\n * Uses connection-level cache to avoid calling the callback multiple times for the same module.\n */\nfunction registerModuleLoaderCallback(\n state: ConnectionState,\n callback: ModuleLoaderCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (moduleName: unknown, importer: unknown) => {\n const specifier = moduleName as string;\n const importerInfo = importer as { path: string; resolveDir: string };\n\n // Call user's module loader - returns { code, resolveDir }\n const result = await callback(specifier, importerInfo);\n\n // Cache using resolved path\n const resolvedPath = path.posix.join(result.resolveDir, path.posix.basename(specifier));\n state.moduleSourceCache.set(resolvedPath, result.code);\n\n return result;\n });\n\n return { callbackId, name: \"moduleLoader\", type: 'async' };\n}\n\n// Iterator session tracking for async iterator custom functions on the client side\ninterface ClientIteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst clientIteratorSessions = new Map<number, ClientIteratorSession>();\nlet nextClientIteratorId = 1;\n\n// Registries for returned promises/iterators from custom function callbacks\n// These are populated when a custom function returns a Promise or AsyncIterator\nconst returnedPromiseRegistry = new Map<number, Promise<unknown>>();\nconst returnedIteratorRegistry = new Map<number, AsyncIterator<unknown>>();\n\n/**\n * Register custom function callbacks.\n */\nfunction registerCustomFunctions(\n state: ConnectionState,\n customFunctions: CustomFunctions\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n for (const [name, def] of Object.entries(customFunctions)) {\n if (def.type === 'asyncIterator') {\n // For async iterators, we need to register 4 callbacks:\n // start, next, return, throw\n\n // Start callback: creates iterator, returns iteratorId\n const startCallbackId = state.nextCallbackId++;\n state.callbacks.set(startCallbackId, async (...args: unknown[]) => {\n try {\n const fn = def.fn as (...args: unknown[]) => AsyncGenerator<unknown, unknown, unknown>;\n const iterator = fn(...args);\n const iteratorId = nextClientIteratorId++;\n clientIteratorSessions.set(iteratorId, { iterator });\n return { iteratorId };\n } catch (error: unknown) {\n throw error;\n }\n });\n\n // Next callback: calls iterator.next() - marshal the value for type fidelity\n const nextCallbackId = state.nextCallbackId++;\n state.callbacks.set(nextCallbackId, async (iteratorId: unknown) => {\n const session = clientIteratorSessions.get(iteratorId as number);\n if (!session) {\n throw new Error(`Iterator session ${iteratorId} not found`);\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n clientIteratorSessions.delete(iteratorId as number);\n }\n return { done: result.done, value: await marshalValue(result.value) };\n } catch (error: unknown) {\n clientIteratorSessions.delete(iteratorId as number);\n throw error;\n }\n });\n\n // Return callback: calls iterator.return() - marshal the value for type fidelity\n const returnCallbackId = state.nextCallbackId++;\n state.callbacks.set(returnCallbackId, async (iteratorId: unknown, value: unknown) => {\n const session = clientIteratorSessions.get(iteratorId as number);\n if (!session) {\n return { done: true, value: await marshalValue(undefined) };\n }\n try {\n const result = await session.iterator.return?.(value);\n clientIteratorSessions.delete(iteratorId as number);\n return { done: true, value: await marshalValue(result?.value) };\n } catch (error: unknown) {\n clientIteratorSessions.delete(iteratorId as number);\n throw error;\n }\n });\n\n // Throw callback: calls iterator.throw() - marshal the value for type fidelity\n const throwCallbackId = state.nextCallbackId++;\n state.callbacks.set(throwCallbackId, async (iteratorId: unknown, errorData: unknown) => {\n const session = clientIteratorSessions.get(iteratorId as number);\n if (!session) {\n throw new Error(`Iterator session ${iteratorId} not found`);\n }\n try {\n const errInfo = errorData as { message: string; name: string };\n const error = Object.assign(new Error(errInfo.message), { name: errInfo.name });\n const result = await session.iterator.throw?.(error);\n clientIteratorSessions.delete(iteratorId as number);\n return { done: result?.done ?? true, value: await marshalValue(result?.value) };\n } catch (error: unknown) {\n clientIteratorSessions.delete(iteratorId as number);\n throw error;\n }\n });\n\n // Register with special naming convention for iterator callbacks\n registrations[`${name}:start`] = { callbackId: startCallbackId, name: `${name}:start`, type: 'async' };\n registrations[`${name}:next`] = { callbackId: nextCallbackId, name: `${name}:next`, type: 'async' };\n registrations[`${name}:return`] = { callbackId: returnCallbackId, name: `${name}:return`, type: 'async' };\n registrations[`${name}:throw`] = { callbackId: throwCallbackId, name: `${name}:throw`, type: 'async' };\n\n // Also register the main entry with asyncIterator type so daemon knows this is an iterator\n registrations[name] = {\n callbackId: startCallbackId,\n name,\n type: 'asyncIterator',\n };\n } else {\n const callbackId = state.nextCallbackId++;\n\n // Register the callback - marshal the result to preserve type fidelity\n // (Request, Response, File, undefined, etc. → Refs)\n // Also register returned functions/promises/iterators so they can be called back\n state.callbacks.set(callbackId, async (...args: unknown[]) => {\n const result = await def.fn(...args);\n\n // Helper to add callback IDs to PromiseRef and AsyncIteratorRef\n const addCallbackIdsToRefs = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check for PromiseRef\n if (isPromiseRef(value)) {\n // Create a resolve callback\n const resolveCallbackId = state.nextCallbackId++;\n state.callbacks.set(resolveCallbackId, async (...args: unknown[]) => {\n const promiseId = args[0] as number;\n const promise = returnedPromiseRegistry.get(promiseId);\n if (!promise) {\n throw new Error(`Promise ${promiseId} not found`);\n }\n const promiseResult = await promise;\n // Clean up\n returnedPromiseRegistry.delete(promiseId);\n // Marshal and process the result recursively\n const marshalledResult = await marshalValue(promiseResult, marshalCtx);\n return addCallbackIdsToRefs(marshalledResult);\n });\n return {\n ...value,\n __resolveCallbackId: resolveCallbackId,\n };\n }\n\n // Check for AsyncIteratorRef\n if (isAsyncIteratorRef(value)) {\n // Create next callback\n const nextCallbackId = state.nextCallbackId++;\n state.callbacks.set(nextCallbackId, async (...args: unknown[]) => {\n const iteratorId = args[0] as number;\n const iterator = returnedIteratorRegistry.get(iteratorId);\n if (!iterator) {\n throw new Error(`Iterator ${iteratorId} not found`);\n }\n const iterResult = await iterator.next();\n if (iterResult.done) {\n returnedIteratorRegistry.delete(iteratorId);\n }\n // Marshal and process the value recursively\n const marshalledValue = await marshalValue(iterResult.value, marshalCtx);\n return {\n done: iterResult.done,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n // Create return callback\n const returnCallbackId = state.nextCallbackId++;\n state.callbacks.set(returnCallbackId, async (...args: unknown[]) => {\n const iteratorId = args[0] as number;\n const returnValue = args[1];\n const iterator = returnedIteratorRegistry.get(iteratorId);\n returnedIteratorRegistry.delete(iteratorId);\n if (!iterator || !iterator.return) {\n return { done: true, value: undefined };\n }\n const iterResult = await iterator.return(returnValue);\n const marshalledValue = await marshalValue(iterResult.value, marshalCtx);\n return {\n done: true,\n value: addCallbackIdsToRefs(marshalledValue),\n };\n });\n\n return {\n ...value,\n __nextCallbackId: nextCallbackId,\n __returnCallbackId: returnCallbackId,\n };\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(item => addCallbackIdsToRefs(item));\n }\n\n // Handle plain objects (recursively process values)\n const objResult: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n objResult[key] = addCallbackIdsToRefs((value as Record<string, unknown>)[key]);\n }\n return objResult;\n };\n\n // Create context for registering returned callbacks/promises/iterators\n // These will be registered in state.callbacks so the daemon can call them back\n const marshalCtx: MarshalContext = {\n registerCallback: (fn: Function): number => {\n const returnedCallbackId = state.nextCallbackId++;\n // Register a callback that marshals its result recursively\n state.callbacks.set(returnedCallbackId, async (...args: unknown[]) => {\n const fnResult = await fn(...args);\n const marshalledResult = await marshalValue(fnResult, marshalCtx);\n return addCallbackIdsToRefs(marshalledResult);\n });\n return returnedCallbackId;\n },\n registerPromise: (promise: Promise<unknown>): number => {\n const promiseId = state.nextCallbackId++;\n // Store the promise - callback to resolve it will be created in addCallbackIdsToRefs\n returnedPromiseRegistry.set(promiseId, promise);\n return promiseId;\n },\n registerIterator: (iterator: AsyncIterator<unknown>): number => {\n const iteratorId = state.nextCallbackId++;\n // Store the iterator - callbacks for next/return will be created in addCallbackIdsToRefs\n returnedIteratorRegistry.set(iteratorId, iterator);\n return iteratorId;\n },\n };\n\n const marshalled = await marshalValue(result, marshalCtx);\n const withCallbackIds = addCallbackIdsToRefs(marshalled);\n return withCallbackIds;\n });\n\n registrations[name] = {\n callbackId,\n name,\n type: def.type,\n };\n }\n }\n\n return registrations;\n}\n\n// ============================================================================\n// Streaming Request Serialization\n// ============================================================================\n\ninterface SerializedRequestWithStream extends SerializedRequest {\n bodyStreamId?: number;\n bodyStream?: ReadableStream<Uint8Array>;\n}\n\n/**\n * Serialize a request, using streaming for large bodies.\n */\nasync function serializeRequestWithStreaming(\n state: ConnectionState,\n request: Request\n): Promise<SerializedRequestWithStream> {\n const headers: [string, string][] = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n let bodyStreamId: number | undefined;\n let bodyStream: ReadableStream<Uint8Array> | undefined;\n\n if (request.body) {\n // Check Content-Length header first\n const contentLength = request.headers.get(\"content-length\");\n const knownSize = contentLength ? parseInt(contentLength, 10) : null;\n\n if (knownSize !== null && knownSize > STREAM_THRESHOLD) {\n // Large body with known size - use streaming\n bodyStreamId = state.nextStreamId++;\n bodyStream = request.body;\n } else {\n // Small or unknown size - read into memory\n const clonedRequest = request.clone();\n try {\n body = new Uint8Array(await request.arrayBuffer());\n\n // Check if it ended up being large\n if (body.length > STREAM_THRESHOLD) {\n // Use the cloned request's body for streaming\n bodyStreamId = state.nextStreamId++;\n bodyStream = clonedRequest.body!;\n body = null;\n }\n } catch {\n // Failed to read body, try streaming\n bodyStreamId = state.nextStreamId++;\n bodyStream = clonedRequest.body!;\n }\n }\n }\n\n const result: SerializedRequestWithStream = {\n method: request.method,\n url: request.url,\n headers,\n body,\n };\n\n // Only include streaming fields if actually streaming\n if (bodyStreamId !== undefined) {\n result.bodyStreamId = bodyStreamId;\n result.bodyStream = bodyStream;\n }\n\n return result;\n}\n\n/**\n * Wait for credit to become available on an upload stream session.\n */\nfunction waitForUploadCredit(session: StreamUploadSession): Promise<void> {\n return new Promise((resolve) => {\n session.creditResolver = resolve;\n });\n}\n\n/**\n * Send a request body as a stream.\n */\nasync function sendBodyStream(\n state: ConnectionState,\n streamId: number,\n body: ReadableStream<Uint8Array>\n): Promise<void> {\n // Create upload session for tracking\n const session: StreamUploadSession = {\n streamId,\n requestId: 0,\n state: \"active\",\n bytesTransferred: 0,\n credit: 0, // Wait for initial credit from daemon\n };\n state.uploadStreams.set(streamId, session);\n\n const reader = body.getReader();\n\n try {\n while (true) {\n if (session.state !== \"active\") {\n throw new Error(\"Stream cancelled\");\n }\n\n // Wait for credit if needed\n while (session.credit < STREAM_CHUNK_SIZE && session.state === \"active\") {\n await waitForUploadCredit(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 // Send stream close\n sendMessage(state.socket, {\n type: MessageType.STREAM_CLOSE,\n streamId,\n } as StreamClose);\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 sendMessage(state.socket, {\n type: MessageType.STREAM_PUSH,\n streamId,\n chunk,\n } as StreamPush);\n\n session.credit -= chunk.length;\n session.bytesTransferred += chunk.length;\n }\n }\n } catch (err) {\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n throw err;\n } finally {\n reader.releaseLock();\n state.uploadStreams.delete(streamId);\n }\n}\n\n// ============================================================================\n// Generic Isolate Event Handler\n// ============================================================================\n\n/**\n * Handle ISOLATE_EVENT message from daemon.\n * Routes WS events to existing handlers, and user-defined events to listeners.\n */\nfunction handleIsolateEvent(\n message: IsolateEventMessage,\n state: ConnectionState\n): void {\n switch (message.event) {\n case IsolateEvents.WS_COMMAND: {\n const payload = message.payload as WsCommandPayload;\n const callbacks = isolateWsCallbacks.get(message.isolateId);\n if (callbacks) {\n // Convert Uint8Array to ArrayBuffer if needed\n let data: string | ArrayBuffer | undefined;\n if (payload.data instanceof Uint8Array) {\n data = payload.data.buffer.slice(\n payload.data.byteOffset,\n payload.data.byteOffset + payload.data.byteLength\n ) as ArrayBuffer;\n } else {\n data = payload.data;\n }\n const cmd: WebSocketCommand = {\n type: payload.type,\n connectionId: payload.connectionId,\n data,\n code: payload.code,\n reason: payload.reason,\n };\n for (const cb of callbacks) {\n cb(cmd);\n }\n }\n break;\n }\n case IsolateEvents.WS_CLIENT_CONNECT: {\n const payload = message.payload as WsClientConnectPayload;\n handleClientWsConnect(message.isolateId, payload, state);\n break;\n }\n case IsolateEvents.WS_CLIENT_SEND: {\n const payload = message.payload as WsClientSendPayload;\n handleClientWsSend(message.isolateId, payload, state);\n break;\n }\n case IsolateEvents.WS_CLIENT_CLOSE: {\n const payload = message.payload as WsClientClosePayload;\n handleClientWsClose(message.isolateId, payload, state);\n break;\n }\n default: {\n // User-defined events: dispatch to per-isolate event listeners\n const listeners = isolateEventListeners.get(message.isolateId);\n if (listeners) {\n const eventListeners = listeners.get(message.event);\n if (eventListeners) {\n for (const cb of eventListeners) {\n cb(message.payload);\n }\n }\n }\n break;\n }\n }\n}\n\n// ============================================================================\n// Client WebSocket Handlers (outbound connections from isolate)\n// ============================================================================\n\n/**\n * Handle client WebSocket connect command from daemon.\n * Creates a real WebSocket connection and sets up event handlers.\n * If a WebSocket callback is registered, it's used to create/proxy the connection.\n */\nfunction handleClientWsConnect(\n isolateId: string,\n payload: WsClientConnectPayload,\n state: ConnectionState\n): void {\n const { socketId, url, protocols } = payload;\n\n // Get or create the WebSocket map for this isolate\n let sockets = isolateClientWebSockets.get(isolateId);\n if (!sockets) {\n sockets = new Map();\n isolateClientWebSockets.set(isolateId, sockets);\n }\n\n // Helper to set up event handlers on a WebSocket\n const setupWebSocket = (ws: WebSocket) => {\n // Track the socket\n sockets!.set(socketId, ws);\n\n // Set up event handlers\n ws.onopen = () => {\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_OPENED,\n payload: { socketId, protocol: ws.protocol || \"\", extensions: ws.extensions || \"\" },\n } as ClientEventMessage);\n };\n\n ws.onmessage = (event) => {\n let data: string | Uint8Array;\n if (typeof event.data === \"string\") {\n data = event.data;\n } else if (event.data instanceof ArrayBuffer) {\n data = new Uint8Array(event.data);\n } else if (event.data instanceof Blob) {\n // Read blob asynchronously\n event.data.arrayBuffer().then((buffer) => {\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_MESSAGE,\n payload: { socketId, data: new Uint8Array(buffer) },\n } as ClientEventMessage);\n });\n return;\n } else {\n // Unknown data type, convert to string\n data = String(event.data);\n }\n\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_MESSAGE,\n payload: { socketId, data },\n } as ClientEventMessage);\n };\n\n ws.onerror = () => {\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_ERROR,\n payload: { socketId },\n } as ClientEventMessage);\n };\n\n ws.onclose = (event) => {\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_CLOSED,\n payload: { socketId, code: event.code, reason: event.reason, wasClean: event.wasClean },\n } as ClientEventMessage);\n\n // Clean up the socket\n sockets?.delete(socketId);\n if (sockets?.size === 0) {\n isolateClientWebSockets.delete(isolateId);\n }\n };\n };\n\n // Helper to send connection blocked/failed events\n const sendConnectionFailed = (reason: string) => {\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_ERROR,\n payload: { socketId },\n } as ClientEventMessage);\n\n sendMessage(state.socket, {\n type: MessageType.CLIENT_EVENT,\n isolateId,\n event: ClientEvents.WS_CLIENT_CLOSED,\n payload: { socketId, code: 1006, reason, wasClean: false },\n } as ClientEventMessage);\n };\n\n // Check if a WebSocket callback is registered for this isolate\n const callback = isolateWebSocketCallbacks.get(isolateId);\n\n if (callback) {\n // Use the callback to create/proxy the WebSocket\n try {\n const result = callback(url, protocols || []);\n\n if (result instanceof Promise) {\n // Handle async callback\n result\n .then((ws) => {\n if (ws === null) {\n // Connection blocked by callback\n sendConnectionFailed(\"Connection blocked\");\n } else {\n setupWebSocket(ws);\n }\n })\n .catch(() => {\n sendConnectionFailed(\"Callback error\");\n });\n } else if (result === null) {\n // Connection blocked by callback\n sendConnectionFailed(\"Connection blocked\");\n } else {\n // Callback returned a WebSocket synchronously\n setupWebSocket(result);\n }\n } catch {\n sendConnectionFailed(\"Callback error\");\n }\n } else {\n // No callback, create WebSocket directly (default behavior)\n try {\n const ws =\n protocols && protocols.length > 0\n ? new WebSocket(url, protocols)\n : new WebSocket(url);\n setupWebSocket(ws);\n } catch {\n sendConnectionFailed(\"Connection failed\");\n }\n }\n}\n\n/**\n * Handle client WebSocket send command from daemon.\n * Sends data on an existing WebSocket connection.\n */\nfunction handleClientWsSend(\n isolateId: string,\n payload: WsClientSendPayload,\n state: ConnectionState\n): void {\n const { socketId, data } = payload;\n\n const sockets = isolateClientWebSockets.get(isolateId);\n const ws = sockets?.get(socketId);\n\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return; // Silently ignore if socket not found or not open\n }\n\n // Handle binary data (check for __BINARY__ marker from isolate)\n if (typeof data === \"string\" && data.startsWith(\"__BINARY__\")) {\n const base64 = data.slice(10);\n const binary = Buffer.from(base64, \"base64\");\n ws.send(binary);\n } else if (data instanceof Uint8Array) {\n ws.send(data);\n } else {\n ws.send(data as string);\n }\n}\n\n/**\n * Handle client WebSocket close command from daemon.\n * Closes an existing WebSocket connection.\n */\nfunction handleClientWsClose(\n isolateId: string,\n payload: WsClientClosePayload,\n state: ConnectionState\n): void {\n const { socketId, code, reason } = payload;\n\n const sockets = isolateClientWebSockets.get(isolateId);\n const ws = sockets?.get(socketId);\n\n if (!ws) {\n return; // Silently ignore if socket not found\n }\n\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close(code ?? 1000, reason ?? \"\");\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "A84790A2E8D5115464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/index.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// packages/isolate-client/src/index.ts
|
|
2
|
-
import { connect } from "./connection.mjs";
|
|
2
|
+
import { connect, isBenignDisposeError } from "./connection.mjs";
|
|
3
3
|
export {
|
|
4
|
+
isBenignDisposeError,
|
|
4
5
|
connect
|
|
5
6
|
};
|
|
6
7
|
|
|
7
|
-
//# debugId=
|
|
8
|
+
//# debugId=CD4E420B3A40C13E64756E2164756E21
|
package/dist/mjs/index.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * @ricsam/isolate-client\n *\n * Client library for connecting to the isolate daemon.\n * Works with Bun, Node.js, and other JavaScript runtimes.\n */\n\nexport { connect } from \"./connection.mjs\";\nexport type {\n ConnectOptions,\n DaemonConnection,\n Namespace,\n RuntimeOptions,\n RemoteRuntime,\n RemoteFetchHandle,\n RemoteTimersHandle,\n RemoteConsoleHandle,\n RemoteTestEnvironmentHandle,\n RemotePlaywrightHandle,\n DispatchOptions,\n ConsoleCallbacks,\n FetchCallback,\n FileSystemCallbacks,\n PlaywrightOptions,\n PlaywrightEvent,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n CollectedData,\n ConsoleEntry,\n CustomFunctions,\n UpgradeRequest,\n} from \"./types.mjs\";\n"
|
|
5
|
+
"/**\n * @ricsam/isolate-client\n *\n * Client library for connecting to the isolate daemon.\n * Works with Bun, Node.js, and other JavaScript runtimes.\n */\n\nexport { connect, isBenignDisposeError } from \"./connection.mjs\";\nexport type {\n ConnectOptions,\n DaemonConnection,\n Namespace,\n RuntimeOptions,\n RemoteRuntime,\n RemoteFetchHandle,\n RemoteTimersHandle,\n RemoteConsoleHandle,\n RemoteTestEnvironmentHandle,\n RemotePlaywrightHandle,\n DispatchOptions,\n ConsoleCallbacks,\n FetchCallback,\n FileSystemCallbacks,\n PlaywrightOptions,\n PlaywrightEvent,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n CollectedData,\n ConsoleEntry,\n CustomFunctions,\n UpgradeRequest,\n WebSocketCommand,\n} from \"./types.mjs\";\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";AAOA;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "CD4E420B3A40C13E64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* Client library for connecting to the isolate daemon.
|
|
5
5
|
* Works with Bun, Node.js, and other JavaScript runtimes.
|
|
6
6
|
*/
|
|
7
|
-
export { connect } from "./connection.ts";
|
|
8
|
-
export type { ConnectOptions, DaemonConnection, Namespace, RuntimeOptions, RemoteRuntime, RemoteFetchHandle, RemoteTimersHandle, RemoteConsoleHandle, RemoteTestEnvironmentHandle, RemotePlaywrightHandle, DispatchOptions, ConsoleCallbacks, FetchCallback, FileSystemCallbacks, PlaywrightOptions, PlaywrightEvent, TestEnvironmentOptions, RunResults, TestResult, TestInfo, TestError, TestEvent, SuiteInfo, SuiteResult, CollectedData, ConsoleEntry, CustomFunctions, UpgradeRequest, } from "./types.ts";
|
|
7
|
+
export { connect, isBenignDisposeError } from "./connection.ts";
|
|
8
|
+
export type { ConnectOptions, DaemonConnection, Namespace, RuntimeOptions, RemoteRuntime, RemoteFetchHandle, RemoteTimersHandle, RemoteConsoleHandle, RemoteTestEnvironmentHandle, RemotePlaywrightHandle, DispatchOptions, ConsoleCallbacks, FetchCallback, FileSystemCallbacks, PlaywrightOptions, PlaywrightEvent, TestEnvironmentOptions, RunResults, TestResult, TestInfo, TestError, TestEvent, SuiteInfo, SuiteResult, CollectedData, ConsoleEntry, CustomFunctions, UpgradeRequest, WebSocketCommand, } from "./types.ts";
|