@ricsam/isolate-client 0.1.8 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -333,7 +333,7 @@ const runtime = await client.createRuntime({
333
333
  onEvent: (event) => {
334
334
  // Unified event handler for all playwright events
335
335
  if (event.type === "browserConsoleLog") {
336
- console.log(`[browser:${event.level}]`, ...event.args);
336
+ console.log(`[browser:${event.level}]`, event.stdout);
337
337
  } else if (event.type === "networkRequest") {
338
338
  console.log(`[request] ${event.method} ${event.url}`);
339
339
  } else if (event.type === "networkResponse") {
@@ -373,9 +373,9 @@ const runtime = await client.createRuntime({
373
373
  console: {
374
374
  onEntry: (entry) => {
375
375
  if (entry.type === "output") {
376
- console.log(`[sandbox:${entry.level}]`, ...entry.args);
376
+ console.log(`[sandbox:${entry.level}]`, entry.stdout);
377
377
  } else if (entry.type === "browserOutput") {
378
- console.log(`[browser:${entry.level}]`, ...entry.args);
378
+ console.log(`[browser:${entry.level}]`, entry.stdout);
379
379
  }
380
380
  },
381
381
  },
@@ -442,7 +442,7 @@ async function createRuntime(state, options = {}, namespaceId) {
442
442
  options.playwright.onEvent({
443
443
  type: "browserConsoleLog",
444
444
  level: browserEntry.level,
445
- args: browserEntry.args,
445
+ stdout: browserEntry.stdout,
446
446
  timestamp: browserEntry.timestamp
447
447
  });
448
448
  }
@@ -450,7 +450,7 @@ async function createRuntime(state, options = {}, namespaceId) {
450
450
  options.console.onEntry({
451
451
  type: "browserOutput",
452
452
  level: browserEntry.level,
453
- args: browserEntry.args,
453
+ stdout: browserEntry.stdout,
454
454
  timestamp: browserEntry.timestamp
455
455
  });
456
456
  }
@@ -1302,4 +1302,4 @@ async function sendBodyStream(state, streamId, body) {
1302
1302
  }
1303
1303
  }
1304
1304
 
1305
- //# debugId=0009D22A3EE8E48864756E2164756E21
1305
+ //# debugId=88982DC84A5B7DE464756E2164756E21
@@ -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 {\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 GetCollectedDataRequest,\n type CollectedData,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\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 marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createPlaywrightHandler, type PlaywrightCallback } 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.cjs\";\n\nconst DEFAULT_TIMEOUT = 30000;\n\n// Track WebSocket command callbacks per isolate for handling WS_COMMAND messages\nconst isolateWsCallbacks = new Map<string, Set<(cmd: WebSocketCommand) => void>>();\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}\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 };\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.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 // 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(\n state: ConnectionState,\n options: RuntimeOptions = {},\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);\n }\n\n // Playwright callback registration - client owns the browser\n let playwrightHandler: PlaywrightCallback | undefined;\n if (options.playwright) {\n playwrightHandler = createPlaywrightHandler(options.playwright.page, {\n timeout: options.playwright.timeout,\n baseUrl: options.playwright.baseUrl,\n });\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 // Determine if we need event callbacks\n const hasOnEvent = !!options.playwright.onEvent;\n const hasConsoleHandler = options.playwright.console && options.console?.onEntry;\n\n // Browser console log callback\n let browserConsoleLogCallbackId: number | undefined;\n if (hasOnEvent || hasConsoleHandler) {\n browserConsoleLogCallbackId = registerEventCallback(state, (entry: unknown) => {\n const browserEntry = entry as { level: string; args: unknown[]; timestamp: number };\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"browserConsoleLog\",\n level: browserEntry.level,\n args: browserEntry.args,\n timestamp: browserEntry.timestamp,\n });\n }\n\n // Route through console handler as browserOutput entry if console: true\n if (options.playwright!.console && options.console?.onEntry) {\n options.console.onEntry({\n type: \"browserOutput\",\n level: browserEntry.level,\n args: browserEntry.args,\n timestamp: browserEntry.timestamp,\n });\n }\n });\n }\n\n // Network request callback\n let networkRequestCallbackId: number | undefined;\n if (hasOnEvent) {\n networkRequestCallbackId = registerEventCallback(state, (info: unknown) => {\n const reqInfo = info as { url: string; method: string; headers: Record<string, string>; postData?: string; resourceType?: string; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkRequest\",\n url: reqInfo.url,\n method: reqInfo.method,\n headers: reqInfo.headers,\n postData: reqInfo.postData,\n resourceType: reqInfo.resourceType,\n timestamp: reqInfo.timestamp,\n });\n });\n }\n\n // Network response callback\n let networkResponseCallbackId: number | undefined;\n if (hasOnEvent) {\n networkResponseCallbackId = registerEventCallback(state, (info: unknown) => {\n const resInfo = info as { url: string; status: number; statusText?: string; headers: Record<string, string>; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkResponse\",\n url: resInfo.url,\n status: resInfo.status,\n statusText: resInfo.statusText,\n headers: resInfo.headers,\n timestamp: resInfo.timestamp,\n });\n });\n }\n\n callbacks.playwright = {\n handlerCallbackId,\n // Don't let daemon print directly if we're routing through console handler\n console: options.playwright.console && !options.console?.onEntry,\n onBrowserConsoleLogCallbackId: browserConsoleLogCallbackId,\n onNetworkRequestCallbackId: networkRequestCallbackId,\n onNetworkResponseCallbackId: networkResponseCallbackId,\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 // 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 return sendRequest<RunTestsResult>(state, req, timeout ?? DEFAULT_TIMEOUT);\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 async getCollectedData(): Promise<CollectedData> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: GetCollectedDataRequest = {\n type: MessageType.GET_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<CollectedData>(state, req);\n },\n\n async clearCollectedData(): Promise<void> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: ClearCollectedDataRequest = {\n type: MessageType.CLEAR_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n return {\n id: isolateId,\n 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 // Support both new signature (filename string) and old signature (EvalOptions)\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 module: true, // Always use module mode\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 WebSocket callbacks\n isolateWsCallbacks.delete(isolateId);\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 request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\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\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 // Send error\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n } finally {\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) => {\n const specifier = moduleName as string;\n\n // Check cache first\n const cached = state.moduleSourceCache.get(specifier);\n if (cached !== undefined) {\n return cached;\n }\n\n // Call the user's module loader\n const source = await callback(specifier);\n\n // Cache the source code\n state.moduleSourceCache.set(specifier, source);\n\n return source;\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"
5
+ "/**\n * Connection handling for the isolate client.\n */\n\nimport { connect as netConnect, type Socket } from \"node:net\";\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 GetCollectedDataRequest,\n type CollectedData,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\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 marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createPlaywrightHandler, type PlaywrightCallback } 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.cjs\";\n\nconst DEFAULT_TIMEOUT = 30000;\n\n// Track WebSocket command callbacks per isolate for handling WS_COMMAND messages\nconst isolateWsCallbacks = new Map<string, Set<(cmd: WebSocketCommand) => void>>();\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}\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 };\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.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 // 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 if (options.playwright) {\n playwrightHandler = createPlaywrightHandler(options.playwright.page, {\n timeout: options.playwright.timeout,\n baseUrl: options.playwright.baseUrl,\n });\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 // Determine if we need event callbacks\n const hasOnEvent = !!options.playwright.onEvent;\n const hasConsoleHandler = options.playwright.console && options.console?.onEntry;\n\n // Browser console log callback\n let browserConsoleLogCallbackId: number | undefined;\n if (hasOnEvent || hasConsoleHandler) {\n browserConsoleLogCallbackId = registerEventCallback(state, (entry: unknown) => {\n const browserEntry = entry as { level: string; stdout: string; timestamp: number };\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"browserConsoleLog\",\n level: browserEntry.level,\n stdout: browserEntry.stdout,\n timestamp: browserEntry.timestamp,\n });\n }\n\n // Route through console handler as browserOutput entry if console: true\n if (options.playwright!.console && options.console?.onEntry) {\n options.console.onEntry({\n type: \"browserOutput\",\n level: browserEntry.level,\n stdout: browserEntry.stdout,\n timestamp: browserEntry.timestamp,\n });\n }\n });\n }\n\n // Network request callback\n let networkRequestCallbackId: number | undefined;\n if (hasOnEvent) {\n networkRequestCallbackId = registerEventCallback(state, (info: unknown) => {\n const reqInfo = info as { url: string; method: string; headers: Record<string, string>; postData?: string; resourceType?: string; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkRequest\",\n url: reqInfo.url,\n method: reqInfo.method,\n headers: reqInfo.headers,\n postData: reqInfo.postData,\n resourceType: reqInfo.resourceType,\n timestamp: reqInfo.timestamp,\n });\n });\n }\n\n // Network response callback\n let networkResponseCallbackId: number | undefined;\n if (hasOnEvent) {\n networkResponseCallbackId = registerEventCallback(state, (info: unknown) => {\n const resInfo = info as { url: string; status: number; statusText?: string; headers: Record<string, string>; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkResponse\",\n url: resInfo.url,\n status: resInfo.status,\n statusText: resInfo.statusText,\n headers: resInfo.headers,\n timestamp: resInfo.timestamp,\n });\n });\n }\n\n callbacks.playwright = {\n handlerCallbackId,\n // Don't let daemon print directly if we're routing through console handler\n console: options.playwright.console && !options.console?.onEntry,\n onBrowserConsoleLogCallbackId: browserConsoleLogCallbackId,\n onNetworkRequestCallbackId: networkRequestCallbackId,\n onNetworkResponseCallbackId: networkResponseCallbackId,\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 // 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 return sendRequest<RunTestsResult>(state, req, timeout ?? DEFAULT_TIMEOUT);\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 async getCollectedData(): Promise<CollectedData> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: GetCollectedDataRequest = {\n type: MessageType.GET_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<CollectedData>(state, req);\n },\n\n async clearCollectedData(): Promise<void> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: ClearCollectedDataRequest = {\n type: MessageType.CLEAR_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n return {\n id: isolateId,\n 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 // Support both new signature (filename string) and old signature (EvalOptions)\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 module: true, // Always use module mode\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 WebSocket callbacks\n isolateWsCallbacks.delete(isolateId);\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 request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\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\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 // Send error\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n } finally {\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) => {\n const specifier = moduleName as string;\n\n // Check cache first\n const cached = state.moduleSourceCache.get(specifier);\n if (cached !== undefined) {\n return cached;\n }\n\n // Call the user's module loader\n const source = await callback(specifier);\n\n // Cache the source code\n state.moduleSourceCache.set(specifier, source);\n\n return source;\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"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "0009D22A3EE8E48864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "88982DC84A5B7DE464756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "type": "commonjs"
5
5
  }
@@ -417,7 +417,7 @@ async function createRuntime(state, options = {}, namespaceId) {
417
417
  options.playwright.onEvent({
418
418
  type: "browserConsoleLog",
419
419
  level: browserEntry.level,
420
- args: browserEntry.args,
420
+ stdout: browserEntry.stdout,
421
421
  timestamp: browserEntry.timestamp
422
422
  });
423
423
  }
@@ -425,7 +425,7 @@ async function createRuntime(state, options = {}, namespaceId) {
425
425
  options.console.onEntry({
426
426
  type: "browserOutput",
427
427
  level: browserEntry.level,
428
- args: browserEntry.args,
428
+ stdout: browserEntry.stdout,
429
429
  timestamp: browserEntry.timestamp
430
430
  });
431
431
  }
@@ -1280,4 +1280,4 @@ export {
1280
1280
  connect
1281
1281
  };
1282
1282
 
1283
- //# debugId=53C8FC5AA13F480B64756E2164756E21
1283
+ //# debugId=3C4C993A49BD89A964756E2164756E21
@@ -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 {\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 GetCollectedDataRequest,\n type CollectedData,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\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 marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createPlaywrightHandler, type PlaywrightCallback } 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;\n\n// Track WebSocket command callbacks per isolate for handling WS_COMMAND messages\nconst isolateWsCallbacks = new Map<string, Set<(cmd: WebSocketCommand) => void>>();\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}\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 };\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.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 // 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(\n state: ConnectionState,\n options: RuntimeOptions = {},\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);\n }\n\n // Playwright callback registration - client owns the browser\n let playwrightHandler: PlaywrightCallback | undefined;\n if (options.playwright) {\n playwrightHandler = createPlaywrightHandler(options.playwright.page, {\n timeout: options.playwright.timeout,\n baseUrl: options.playwright.baseUrl,\n });\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 // Determine if we need event callbacks\n const hasOnEvent = !!options.playwright.onEvent;\n const hasConsoleHandler = options.playwright.console && options.console?.onEntry;\n\n // Browser console log callback\n let browserConsoleLogCallbackId: number | undefined;\n if (hasOnEvent || hasConsoleHandler) {\n browserConsoleLogCallbackId = registerEventCallback(state, (entry: unknown) => {\n const browserEntry = entry as { level: string; args: unknown[]; timestamp: number };\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"browserConsoleLog\",\n level: browserEntry.level,\n args: browserEntry.args,\n timestamp: browserEntry.timestamp,\n });\n }\n\n // Route through console handler as browserOutput entry if console: true\n if (options.playwright!.console && options.console?.onEntry) {\n options.console.onEntry({\n type: \"browserOutput\",\n level: browserEntry.level,\n args: browserEntry.args,\n timestamp: browserEntry.timestamp,\n });\n }\n });\n }\n\n // Network request callback\n let networkRequestCallbackId: number | undefined;\n if (hasOnEvent) {\n networkRequestCallbackId = registerEventCallback(state, (info: unknown) => {\n const reqInfo = info as { url: string; method: string; headers: Record<string, string>; postData?: string; resourceType?: string; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkRequest\",\n url: reqInfo.url,\n method: reqInfo.method,\n headers: reqInfo.headers,\n postData: reqInfo.postData,\n resourceType: reqInfo.resourceType,\n timestamp: reqInfo.timestamp,\n });\n });\n }\n\n // Network response callback\n let networkResponseCallbackId: number | undefined;\n if (hasOnEvent) {\n networkResponseCallbackId = registerEventCallback(state, (info: unknown) => {\n const resInfo = info as { url: string; status: number; statusText?: string; headers: Record<string, string>; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkResponse\",\n url: resInfo.url,\n status: resInfo.status,\n statusText: resInfo.statusText,\n headers: resInfo.headers,\n timestamp: resInfo.timestamp,\n });\n });\n }\n\n callbacks.playwright = {\n handlerCallbackId,\n // Don't let daemon print directly if we're routing through console handler\n console: options.playwright.console && !options.console?.onEntry,\n onBrowserConsoleLogCallbackId: browserConsoleLogCallbackId,\n onNetworkRequestCallbackId: networkRequestCallbackId,\n onNetworkResponseCallbackId: networkResponseCallbackId,\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 // 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 return sendRequest<RunTestsResult>(state, req, timeout ?? DEFAULT_TIMEOUT);\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 async getCollectedData(): Promise<CollectedData> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: GetCollectedDataRequest = {\n type: MessageType.GET_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<CollectedData>(state, req);\n },\n\n async clearCollectedData(): Promise<void> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: ClearCollectedDataRequest = {\n type: MessageType.CLEAR_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n return {\n id: isolateId,\n 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 // Support both new signature (filename string) and old signature (EvalOptions)\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 module: true, // Always use module mode\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 WebSocket callbacks\n isolateWsCallbacks.delete(isolateId);\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 request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\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\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 // Send error\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n } finally {\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) => {\n const specifier = moduleName as string;\n\n // Check cache first\n const cached = state.moduleSourceCache.get(specifier);\n if (cached !== undefined) {\n return cached;\n }\n\n // Call the user's module loader\n const source = await callback(specifier);\n\n // Cache the source code\n state.moduleSourceCache.set(specifier, source);\n\n return source;\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"
5
+ "/**\n * Connection handling for the isolate client.\n */\n\nimport { connect as netConnect, type Socket } from \"node:net\";\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 GetCollectedDataRequest,\n type CollectedData,\n type ResetTestEnvRequest,\n type ClearCollectedDataRequest,\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 marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createPlaywrightHandler, type PlaywrightCallback } 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;\n\n// Track WebSocket command callbacks per isolate for handling WS_COMMAND messages\nconst isolateWsCallbacks = new Map<string, Set<(cmd: WebSocketCommand) => void>>();\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}\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 };\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.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 // 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 if (options.playwright) {\n playwrightHandler = createPlaywrightHandler(options.playwright.page, {\n timeout: options.playwright.timeout,\n baseUrl: options.playwright.baseUrl,\n });\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 // Determine if we need event callbacks\n const hasOnEvent = !!options.playwright.onEvent;\n const hasConsoleHandler = options.playwright.console && options.console?.onEntry;\n\n // Browser console log callback\n let browserConsoleLogCallbackId: number | undefined;\n if (hasOnEvent || hasConsoleHandler) {\n browserConsoleLogCallbackId = registerEventCallback(state, (entry: unknown) => {\n const browserEntry = entry as { level: string; stdout: string; timestamp: number };\n\n if (options.playwright!.onEvent) {\n options.playwright!.onEvent({\n type: \"browserConsoleLog\",\n level: browserEntry.level,\n stdout: browserEntry.stdout,\n timestamp: browserEntry.timestamp,\n });\n }\n\n // Route through console handler as browserOutput entry if console: true\n if (options.playwright!.console && options.console?.onEntry) {\n options.console.onEntry({\n type: \"browserOutput\",\n level: browserEntry.level,\n stdout: browserEntry.stdout,\n timestamp: browserEntry.timestamp,\n });\n }\n });\n }\n\n // Network request callback\n let networkRequestCallbackId: number | undefined;\n if (hasOnEvent) {\n networkRequestCallbackId = registerEventCallback(state, (info: unknown) => {\n const reqInfo = info as { url: string; method: string; headers: Record<string, string>; postData?: string; resourceType?: string; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkRequest\",\n url: reqInfo.url,\n method: reqInfo.method,\n headers: reqInfo.headers,\n postData: reqInfo.postData,\n resourceType: reqInfo.resourceType,\n timestamp: reqInfo.timestamp,\n });\n });\n }\n\n // Network response callback\n let networkResponseCallbackId: number | undefined;\n if (hasOnEvent) {\n networkResponseCallbackId = registerEventCallback(state, (info: unknown) => {\n const resInfo = info as { url: string; status: number; statusText?: string; headers: Record<string, string>; timestamp: number };\n\n options.playwright!.onEvent!({\n type: \"networkResponse\",\n url: resInfo.url,\n status: resInfo.status,\n statusText: resInfo.statusText,\n headers: resInfo.headers,\n timestamp: resInfo.timestamp,\n });\n });\n }\n\n callbacks.playwright = {\n handlerCallbackId,\n // Don't let daemon print directly if we're routing through console handler\n console: options.playwright.console && !options.console?.onEntry,\n onBrowserConsoleLogCallbackId: browserConsoleLogCallbackId,\n onNetworkRequestCallbackId: networkRequestCallbackId,\n onNetworkResponseCallbackId: networkResponseCallbackId,\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 // 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 return sendRequest<RunTestsResult>(state, req, timeout ?? DEFAULT_TIMEOUT);\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 async getCollectedData(): Promise<CollectedData> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: GetCollectedDataRequest = {\n type: MessageType.GET_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<CollectedData>(state, req);\n },\n\n async clearCollectedData(): Promise<void> {\n if (!playwrightEnabled) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n const reqId = state.nextRequestId++;\n const req: ClearCollectedDataRequest = {\n type: MessageType.CLEAR_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n\n return {\n id: isolateId,\n 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 // Support both new signature (filename string) and old signature (EvalOptions)\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 module: true, // Always use module mode\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 WebSocket callbacks\n isolateWsCallbacks.delete(isolateId);\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 request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\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\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 // Send error\n sendMessage(state.socket, {\n type: MessageType.STREAM_ERROR,\n streamId,\n error: (err as Error).message,\n } as StreamError);\n } finally {\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) => {\n const specifier = moduleName as string;\n\n // Check cache first\n const cached = state.moduleSourceCache.get(specifier);\n if (cached !== undefined) {\n return cached;\n }\n\n // Call the user's module loader\n const source = await callback(specifier);\n\n // Cache the source code\n state.moduleSourceCache.set(specifier, source);\n\n return source;\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"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "53C8FC5AA13F480B64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "3C4C993A49BD89A964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "type": "module"
5
5
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Types for the isolate client.
3
3
  */
4
- import type { RunTestsResult, TestResult as ProtocolTestResult, TestInfo as ProtocolTestInfo, TestError as ProtocolTestError, TestEvent as ProtocolTestEvent, SuiteInfo as ProtocolSuiteInfo, SuiteResult as ProtocolSuiteResult, CollectedData as ProtocolCollectedData, ConsoleEntry as ProtocolConsoleEntry, PlaywrightEvent as ProtocolPlaywrightEvent, CustomFunctionType } from "@ricsam/isolate-protocol";
4
+ import type { RunTestsResult, TestResult as ProtocolTestResult, TestInfo as ProtocolTestInfo, TestError as ProtocolTestError, TestEvent as ProtocolTestEvent, SuiteInfo as ProtocolSuiteInfo, SuiteResult as ProtocolSuiteResult, CollectedData as ProtocolCollectedData, ConsoleEntry as ProtocolConsoleEntry, PlaywrightEvent as ProtocolPlaywrightEvent, CustomFunctionType, EvalOptions as ProtocolEvalOptions, TestEnvironmentOptions as ProtocolTestEnvironmentOptions, PlaywrightOptions as ProtocolPlaywrightOptions, BaseRuntimeOptions, ConsoleCallbacks, FetchCallback, FileSystemCallbacks, ModuleLoaderCallback, CustomFunction, CustomAsyncGeneratorFunction, CustomFunctionDefinition, CustomFunctions, DispatchOptions } from "@ricsam/isolate-protocol";
5
5
  export type RunResults = RunTestsResult;
6
6
  export type TestResult = ProtocolTestResult;
7
7
  export type TestInfo = ProtocolTestInfo;
@@ -12,6 +12,10 @@ export type SuiteResult = ProtocolSuiteResult;
12
12
  export type CollectedData = ProtocolCollectedData;
13
13
  export type ConsoleEntry = ProtocolConsoleEntry;
14
14
  export type PlaywrightEvent = ProtocolPlaywrightEvent;
15
+ export type EvalOptions = ProtocolEvalOptions;
16
+ export type TestEnvironmentOptions = ProtocolTestEnvironmentOptions;
17
+ export type PlaywrightOptions = ProtocolPlaywrightOptions;
18
+ export type { ConsoleCallbacks, FetchCallback, FileSystemCallbacks, ModuleLoaderCallback, CustomFunction, CustomAsyncGeneratorFunction, CustomFunctionDefinition, CustomFunctions, CustomFunctionType, DispatchOptions, };
15
19
  /**
16
20
  * Options for connecting to the daemon.
17
21
  */
@@ -48,127 +52,13 @@ export interface DaemonConnection {
48
52
  /** Check if connected */
49
53
  isConnected(): boolean;
50
54
  }
51
- /**
52
- * Test environment options for createRuntime.
53
- */
54
- export interface TestEnvironmentOptions {
55
- /** Receive test lifecycle events */
56
- onEvent?: (event: TestEvent) => void;
57
- /** Timeout for individual tests (ms) */
58
- testTimeout?: number;
59
- }
60
55
  /**
61
56
  * Options for creating a runtime.
57
+ * Extends BaseRuntimeOptions and adds client-specific fs type.
62
58
  */
63
- export interface RuntimeOptions {
64
- /** Memory limit in megabytes (optional) */
65
- memoryLimitMB?: number;
66
- /** Console callback handlers */
67
- console?: ConsoleCallbacks;
68
- /** Fetch callback handler */
69
- fetch?: FetchCallback;
59
+ export interface RuntimeOptions<T extends Record<string, any[]> = Record<string, unknown[]>> extends BaseRuntimeOptions<T> {
70
60
  /** File system callback handlers */
71
61
  fs?: FileSystemCallbacks;
72
- /** Module loader callback for resolving dynamic imports */
73
- moduleLoader?: ModuleLoaderCallback;
74
- /** Custom functions callable from within the isolate */
75
- customFunctions?: CustomFunctions;
76
- /** Current working directory for path.resolve(). Defaults to "/" */
77
- cwd?: string;
78
- /** Enable test environment (describe, it, expect, etc.) */
79
- testEnvironment?: boolean | TestEnvironmentOptions;
80
- /** Playwright options - user provides page */
81
- playwright?: PlaywrightOptions;
82
- }
83
- /**
84
- * Options for Playwright integration.
85
- * User provides the page object - client owns the browser.
86
- */
87
- export interface PlaywrightOptions {
88
- /** Playwright page object */
89
- page: import("playwright").Page;
90
- /** Default timeout for operations in ms */
91
- timeout?: number;
92
- /** Base URL for navigation */
93
- baseUrl?: string;
94
- /** If true, browser console logs are routed through console handler (or printed to stdout if no handler) */
95
- console?: boolean;
96
- /** Unified event callback for all playwright events */
97
- onEvent?: (event: PlaywrightEvent) => void;
98
- }
99
- /**
100
- * Console callback handlers with single structured callback.
101
- */
102
- export interface ConsoleCallbacks {
103
- /**
104
- * Callback invoked for each console operation.
105
- * Receives a structured entry with all data needed to render the output.
106
- */
107
- onEntry?: (entry: ConsoleEntry) => void;
108
- }
109
- /**
110
- * Fetch callback type.
111
- */
112
- export type FetchCallback = (request: Request) => Response | Promise<Response>;
113
- /**
114
- * File system callback handlers.
115
- */
116
- export interface FileSystemCallbacks {
117
- readFile?: (path: string) => Promise<ArrayBuffer>;
118
- writeFile?: (path: string, data: ArrayBuffer) => Promise<void>;
119
- unlink?: (path: string) => Promise<void>;
120
- readdir?: (path: string) => Promise<string[]>;
121
- mkdir?: (path: string, options?: {
122
- recursive?: boolean;
123
- }) => Promise<void>;
124
- rmdir?: (path: string) => Promise<void>;
125
- stat?: (path: string) => Promise<{
126
- isFile: boolean;
127
- isDirectory: boolean;
128
- size: number;
129
- }>;
130
- rename?: (from: string, to: string) => Promise<void>;
131
- }
132
- /**
133
- * Module loader callback type.
134
- * Called when the isolate imports a module dynamically.
135
- * Returns the JavaScript source code for the module.
136
- */
137
- export type ModuleLoaderCallback = (moduleName: string) => string | Promise<string>;
138
- export type { CustomFunctionType };
139
- /**
140
- * A custom function that can be called from within the isolate.
141
- */
142
- export type CustomFunction = (...args: unknown[]) => unknown | Promise<unknown>;
143
- /**
144
- * An async generator function that can be consumed in the isolate via for await...of.
145
- */
146
- export type CustomAsyncGeneratorFunction = (...args: unknown[]) => AsyncGenerator<unknown, unknown, unknown>;
147
- /**
148
- * Custom function definition with metadata.
149
- */
150
- export interface CustomFunctionDefinition {
151
- /** The function implementation */
152
- fn: CustomFunction | CustomAsyncGeneratorFunction;
153
- /** Function type: 'sync', 'async', or 'asyncIterator' */
154
- type: CustomFunctionType;
155
- }
156
- /**
157
- * Custom functions to register in the runtime.
158
- */
159
- export type CustomFunctions = Record<string, CustomFunctionDefinition>;
160
- /**
161
- * Options for eval() method.
162
- */
163
- export interface EvalOptions {
164
- /** Filename for stack traces */
165
- filename?: string;
166
- /** Maximum execution time in milliseconds. If exceeded, throws a timeout error. */
167
- maxExecutionMs?: number;
168
- /**
169
- * @deprecated Always uses module mode now. This option is ignored.
170
- */
171
- module?: boolean;
172
62
  }
173
63
  /**
174
64
  * WebSocket upgrade request info.
@@ -294,10 +184,3 @@ export interface RemotePlaywrightHandle {
294
184
  /** Clear collected data */
295
185
  clearCollectedData(): Promise<void>;
296
186
  }
297
- /**
298
- * Options for dispatching a request.
299
- */
300
- export interface DispatchOptions {
301
- /** Request timeout in ms */
302
- timeout?: number;
303
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {