@ricsam/isolate-client 0.1.4 → 0.1.5

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.
@@ -35,7 +35,7 @@ __export(exports_connection, {
35
35
  module.exports = __toCommonJS(exports_connection);
36
36
  var import_node_net = require("net");
37
37
  var import_isolate_protocol = require("@ricsam/isolate-protocol");
38
- var import_isolate_playwright = require("@ricsam/isolate-playwright");
38
+ var import_client = require("@ricsam/isolate-playwright/client");
39
39
  var DEFAULT_TIMEOUT = 30000;
40
40
  var isolateWsCallbacks = new Map;
41
41
  async function connect(options = {}) {
@@ -173,10 +173,58 @@ function handleMessage(message, state) {
173
173
  streamId: msg.streamId,
174
174
  requestId: msg.requestId,
175
175
  metadata: msg.metadata,
176
- chunks: [],
177
- totalBytes: 0
176
+ controller: null,
177
+ state: "active",
178
+ pendingChunks: []
178
179
  };
180
+ const readableStream = new ReadableStream({
181
+ start(controller) {
182
+ receiver.controller = controller;
183
+ },
184
+ pull(_controller) {
185
+ while (receiver.pendingChunks.length > 0) {
186
+ const chunk = receiver.pendingChunks.shift();
187
+ receiver.controller.enqueue(chunk);
188
+ }
189
+ if (receiver.state === "closed") {
190
+ receiver.controller.close();
191
+ return;
192
+ }
193
+ if (receiver.state === "errored") {
194
+ return;
195
+ }
196
+ sendMessage(state.socket, {
197
+ type: import_isolate_protocol.MessageType.STREAM_PULL,
198
+ streamId: msg.streamId,
199
+ maxBytes: import_isolate_protocol.STREAM_DEFAULT_CREDIT
200
+ });
201
+ return new Promise((resolve) => {
202
+ receiver.pullResolver = resolve;
203
+ });
204
+ },
205
+ cancel(_reason) {
206
+ receiver.state = "errored";
207
+ sendMessage(state.socket, {
208
+ type: import_isolate_protocol.MessageType.STREAM_ERROR,
209
+ streamId: msg.streamId,
210
+ error: "Stream cancelled by consumer"
211
+ });
212
+ state.streamResponses.delete(msg.streamId);
213
+ }
214
+ });
179
215
  state.streamResponses.set(msg.streamId, receiver);
216
+ const pending = state.pendingRequests.get(msg.requestId);
217
+ if (pending) {
218
+ state.pendingRequests.delete(msg.requestId);
219
+ if (pending.timeoutId)
220
+ clearTimeout(pending.timeoutId);
221
+ const response = new Response(readableStream, {
222
+ status: msg.metadata?.status ?? 200,
223
+ statusText: msg.metadata?.statusText ?? "OK",
224
+ headers: msg.metadata?.headers
225
+ });
226
+ pending.resolve({ response, __streaming: true });
227
+ }
180
228
  sendMessage(state.socket, {
181
229
  type: import_isolate_protocol.MessageType.STREAM_PULL,
182
230
  streamId: msg.streamId,
@@ -187,14 +235,15 @@ function handleMessage(message, state) {
187
235
  case import_isolate_protocol.MessageType.RESPONSE_STREAM_CHUNK: {
188
236
  const msg = message;
189
237
  const receiver = state.streamResponses.get(msg.streamId);
190
- if (receiver) {
191
- receiver.chunks.push(msg.chunk);
192
- receiver.totalBytes += msg.chunk.length;
193
- sendMessage(state.socket, {
194
- type: import_isolate_protocol.MessageType.STREAM_PULL,
195
- streamId: msg.streamId,
196
- maxBytes: import_isolate_protocol.STREAM_DEFAULT_CREDIT
197
- });
238
+ if (receiver && receiver.state === "active") {
239
+ if (receiver.pullResolver) {
240
+ receiver.controller.enqueue(msg.chunk);
241
+ const resolver = receiver.pullResolver;
242
+ receiver.pullResolver = undefined;
243
+ resolver();
244
+ } else {
245
+ receiver.pendingChunks.push(msg.chunk);
246
+ }
198
247
  }
199
248
  break;
200
249
  }
@@ -202,20 +251,16 @@ function handleMessage(message, state) {
202
251
  const msg = message;
203
252
  const receiver = state.streamResponses.get(msg.streamId);
204
253
  if (receiver) {
205
- const body = concatUint8Arrays(receiver.chunks);
206
- const pending = state.pendingRequests.get(receiver.requestId);
207
- if (pending) {
208
- state.pendingRequests.delete(receiver.requestId);
209
- if (pending.timeoutId)
210
- clearTimeout(pending.timeoutId);
211
- pending.resolve({
212
- response: {
213
- status: receiver.metadata?.status ?? 200,
214
- statusText: receiver.metadata?.statusText ?? "OK",
215
- headers: receiver.metadata?.headers ?? [],
216
- body
217
- }
218
- });
254
+ receiver.state = "closed";
255
+ while (receiver.pendingChunks.length > 0) {
256
+ const chunk = receiver.pendingChunks.shift();
257
+ receiver.controller.enqueue(chunk);
258
+ }
259
+ receiver.controller.close();
260
+ if (receiver.pullResolver) {
261
+ const resolver = receiver.pullResolver;
262
+ receiver.pullResolver = undefined;
263
+ resolver();
219
264
  }
220
265
  state.streamResponses.delete(msg.streamId);
221
266
  }
@@ -242,12 +287,12 @@ function handleMessage(message, state) {
242
287
  }
243
288
  const receiver = state.streamResponses.get(msg.streamId);
244
289
  if (receiver) {
245
- const pending = state.pendingRequests.get(receiver.requestId);
246
- if (pending) {
247
- state.pendingRequests.delete(receiver.requestId);
248
- if (pending.timeoutId)
249
- clearTimeout(pending.timeoutId);
250
- pending.reject(new Error(msg.error));
290
+ receiver.state = "errored";
291
+ receiver.controller.error(new Error(msg.error));
292
+ if (receiver.pullResolver) {
293
+ const resolver = receiver.pullResolver;
294
+ receiver.pullResolver = undefined;
295
+ resolver();
251
296
  }
252
297
  state.streamResponses.delete(msg.streamId);
253
298
  }
@@ -257,16 +302,6 @@ function handleMessage(message, state) {
257
302
  console.warn(`Unexpected message type: ${message.type}`);
258
303
  }
259
304
  }
260
- function concatUint8Arrays(arrays) {
261
- const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
262
- const result = new Uint8Array(totalLength);
263
- let offset = 0;
264
- for (const arr of arrays) {
265
- result.set(arr, offset);
266
- offset += arr.length;
267
- }
268
- return result;
269
- }
270
305
  async function handleCallbackInvoke(invoke, state) {
271
306
  const callback = state.callbacks.get(invoke.callbackId);
272
307
  const response = {
@@ -335,7 +370,7 @@ async function createRuntime(state, options = {}) {
335
370
  }
336
371
  let playwrightHandler;
337
372
  if (options.playwright) {
338
- playwrightHandler = import_isolate_playwright.createPlaywrightHandler(options.playwright.page, {
373
+ playwrightHandler = import_client.createPlaywrightHandler(options.playwright.page, {
339
374
  timeout: options.playwright.timeout,
340
375
  baseUrl: options.playwright.baseUrl
341
376
  });
@@ -458,15 +493,21 @@ async function createRuntime(state, options = {}) {
458
493
  request: serializableRequest,
459
494
  options: opts
460
495
  };
496
+ const handleResponse = (res) => {
497
+ if (res.__streaming && res.response instanceof Response) {
498
+ return res.response;
499
+ }
500
+ return deserializeResponse(res.response);
501
+ };
461
502
  if (serialized.bodyStreamId !== undefined && bodyStream) {
462
503
  const streamId = serialized.bodyStreamId;
463
504
  const responsePromise = sendRequest(state, request2, opts?.timeout ?? DEFAULT_TIMEOUT);
464
505
  await sendBodyStream(state, streamId, bodyStream);
465
506
  const res = await responsePromise;
466
- return deserializeResponse(res.response);
507
+ return handleResponse(res);
467
508
  } else {
468
509
  const res = await sendRequest(state, request2, opts?.timeout ?? DEFAULT_TIMEOUT);
469
- return deserializeResponse(res.response);
510
+ return handleResponse(res);
470
511
  }
471
512
  },
472
513
  async getUpgradeRequest() {
@@ -1141,4 +1182,4 @@ async function sendBodyStream(state, streamId, body) {
1141
1182
  }
1142
1183
  })
1143
1184
 
1144
- //# debugId=7380B90E2B96832A64756E2164756E21
1185
+ //# debugId=5325684CDAEFBA9A64756E2164756E21
@@ -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 marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createPlaywrightHandler, type PlaywrightCallback } from \"@ricsam/isolate-playwright\";\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} 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 collecting streamed response chunks */\ninterface StreamResponseReceiver {\n streamId: number;\n requestId: number;\n metadata?: {\n status?: number;\n statusText?: string;\n headers?: [string, string][];\n };\n chunks: Uint8Array[];\n totalBytes: number;\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 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}\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 nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n connected: true,\n streamResponses: new Map(),\n uploadStreams: new Map(),\n };\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests\n for (const [, pending] of state.pendingRequests) {\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\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 // Create a receiver to collect chunks\n const receiver: StreamResponseReceiver = {\n streamId: msg.streamId,\n requestId: msg.requestId,\n metadata: msg.metadata,\n chunks: [],\n totalBytes: 0,\n };\n state.streamResponses.set(msg.streamId, receiver);\n // Send initial credit to allow daemon to start sending\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) {\n receiver.chunks.push(msg.chunk);\n receiver.totalBytes += msg.chunk.length;\n // Send more credit\n sendMessage(state.socket, {\n type: MessageType.STREAM_PULL,\n streamId: msg.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\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 // Concatenate all chunks\n const body = concatUint8Arrays(receiver.chunks);\n // Resolve pending request with the streamed response\n const pending = state.pendingRequests.get(receiver.requestId);\n if (pending) {\n state.pendingRequests.delete(receiver.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n pending.resolve({\n response: {\n status: receiver.metadata?.status ?? 200,\n statusText: receiver.metadata?.statusText ?? \"OK\",\n headers: receiver.metadata?.headers ?? [],\n body,\n },\n });\n }\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\n const receiver = state.streamResponses.get(msg.streamId);\n if (receiver) {\n const pending = state.pendingRequests.get(receiver.requestId);\n if (pending) {\n state.pendingRequests.delete(receiver.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n pending.reject(new Error(msg.error));\n }\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 * Helper to concatenate Uint8Arrays.\n */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\n/**\n * 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 } else {\n try {\n const result = await callback(...invoke.args);\n response.result = result;\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 }\n }\n\n sendMessage(state.socket, response);\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): 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 },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\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 // 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 }>(\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 deserializeResponse(res.response);\n } else {\n const res = await sendRequest<{ response: SerializedResponse }>(\n state,\n request,\n opts?.timeout ?? DEFAULT_TIMEOUT\n );\n return deserializeResponse(res.response);\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\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/**\n * Register fetch callback.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (serialized: unknown) => {\n const request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", type: 'async' };\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 */\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 return callback(moduleName as string);\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 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} 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 pullResolver?: () => void; // Resolves when consumer wants more data\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 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}\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 nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n connected: true,\n streamResponses: new Map(),\n uploadStreams: new Map(),\n };\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests\n for (const [, pending] of state.pendingRequests) {\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\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 };\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 // 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 receiver.controller.close();\n return;\n }\n if (receiver.state === \"errored\") {\n return;\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.pullResolver = resolve;\n });\n },\n cancel(_reason) {\n // Consumer cancelled the stream - notify daemon\n receiver.state = \"errored\";\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 });\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.pullResolver) {\n // Consumer is waiting for data - enqueue directly and resolve\n receiver.controller.enqueue(msg.chunk);\n const resolver = receiver.pullResolver;\n receiver.pullResolver = undefined;\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\n receiver.controller.close();\n\n // Resolve any pending pull\n if (receiver.pullResolver) {\n const resolver = receiver.pullResolver;\n receiver.pullResolver = undefined;\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\n receiver.state = \"errored\";\n\n // Error the stream controller\n receiver.controller.error(new Error(msg.error));\n\n // Resolve any pending pull\n if (receiver.pullResolver) {\n const resolver = receiver.pullResolver;\n receiver.pullResolver = undefined;\n resolver();\n }\n\n // Clean up\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 } else {\n try {\n const result = await callback(...invoke.args);\n response.result = result;\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 }\n }\n\n sendMessage(state.socket, response);\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): 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 },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\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\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/**\n * Register fetch callback.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (serialized: unknown) => {\n const request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", type: 'async' };\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 */\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 return callback(moduleName as string);\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": "7380B90E2B96832A64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "5325684CDAEFBA9A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "type": "commonjs"
5
5
  }
@@ -10,7 +10,7 @@ import {
10
10
  STREAM_DEFAULT_CREDIT,
11
11
  marshalValue
12
12
  } from "@ricsam/isolate-protocol";
13
- import { createPlaywrightHandler } from "@ricsam/isolate-playwright";
13
+ import { createPlaywrightHandler } from "@ricsam/isolate-playwright/client";
14
14
  var DEFAULT_TIMEOUT = 30000;
15
15
  var isolateWsCallbacks = new Map;
16
16
  async function connect(options = {}) {
@@ -148,10 +148,58 @@ function handleMessage(message, state) {
148
148
  streamId: msg.streamId,
149
149
  requestId: msg.requestId,
150
150
  metadata: msg.metadata,
151
- chunks: [],
152
- totalBytes: 0
151
+ controller: null,
152
+ state: "active",
153
+ pendingChunks: []
153
154
  };
155
+ const readableStream = new ReadableStream({
156
+ start(controller) {
157
+ receiver.controller = controller;
158
+ },
159
+ pull(_controller) {
160
+ while (receiver.pendingChunks.length > 0) {
161
+ const chunk = receiver.pendingChunks.shift();
162
+ receiver.controller.enqueue(chunk);
163
+ }
164
+ if (receiver.state === "closed") {
165
+ receiver.controller.close();
166
+ return;
167
+ }
168
+ if (receiver.state === "errored") {
169
+ return;
170
+ }
171
+ sendMessage(state.socket, {
172
+ type: MessageType.STREAM_PULL,
173
+ streamId: msg.streamId,
174
+ maxBytes: STREAM_DEFAULT_CREDIT
175
+ });
176
+ return new Promise((resolve) => {
177
+ receiver.pullResolver = resolve;
178
+ });
179
+ },
180
+ cancel(_reason) {
181
+ receiver.state = "errored";
182
+ sendMessage(state.socket, {
183
+ type: MessageType.STREAM_ERROR,
184
+ streamId: msg.streamId,
185
+ error: "Stream cancelled by consumer"
186
+ });
187
+ state.streamResponses.delete(msg.streamId);
188
+ }
189
+ });
154
190
  state.streamResponses.set(msg.streamId, receiver);
191
+ const pending = state.pendingRequests.get(msg.requestId);
192
+ if (pending) {
193
+ state.pendingRequests.delete(msg.requestId);
194
+ if (pending.timeoutId)
195
+ clearTimeout(pending.timeoutId);
196
+ const response = new Response(readableStream, {
197
+ status: msg.metadata?.status ?? 200,
198
+ statusText: msg.metadata?.statusText ?? "OK",
199
+ headers: msg.metadata?.headers
200
+ });
201
+ pending.resolve({ response, __streaming: true });
202
+ }
155
203
  sendMessage(state.socket, {
156
204
  type: MessageType.STREAM_PULL,
157
205
  streamId: msg.streamId,
@@ -162,14 +210,15 @@ function handleMessage(message, state) {
162
210
  case MessageType.RESPONSE_STREAM_CHUNK: {
163
211
  const msg = message;
164
212
  const receiver = state.streamResponses.get(msg.streamId);
165
- if (receiver) {
166
- receiver.chunks.push(msg.chunk);
167
- receiver.totalBytes += msg.chunk.length;
168
- sendMessage(state.socket, {
169
- type: MessageType.STREAM_PULL,
170
- streamId: msg.streamId,
171
- maxBytes: STREAM_DEFAULT_CREDIT
172
- });
213
+ if (receiver && receiver.state === "active") {
214
+ if (receiver.pullResolver) {
215
+ receiver.controller.enqueue(msg.chunk);
216
+ const resolver = receiver.pullResolver;
217
+ receiver.pullResolver = undefined;
218
+ resolver();
219
+ } else {
220
+ receiver.pendingChunks.push(msg.chunk);
221
+ }
173
222
  }
174
223
  break;
175
224
  }
@@ -177,20 +226,16 @@ function handleMessage(message, state) {
177
226
  const msg = message;
178
227
  const receiver = state.streamResponses.get(msg.streamId);
179
228
  if (receiver) {
180
- const body = concatUint8Arrays(receiver.chunks);
181
- const pending = state.pendingRequests.get(receiver.requestId);
182
- if (pending) {
183
- state.pendingRequests.delete(receiver.requestId);
184
- if (pending.timeoutId)
185
- clearTimeout(pending.timeoutId);
186
- pending.resolve({
187
- response: {
188
- status: receiver.metadata?.status ?? 200,
189
- statusText: receiver.metadata?.statusText ?? "OK",
190
- headers: receiver.metadata?.headers ?? [],
191
- body
192
- }
193
- });
229
+ receiver.state = "closed";
230
+ while (receiver.pendingChunks.length > 0) {
231
+ const chunk = receiver.pendingChunks.shift();
232
+ receiver.controller.enqueue(chunk);
233
+ }
234
+ receiver.controller.close();
235
+ if (receiver.pullResolver) {
236
+ const resolver = receiver.pullResolver;
237
+ receiver.pullResolver = undefined;
238
+ resolver();
194
239
  }
195
240
  state.streamResponses.delete(msg.streamId);
196
241
  }
@@ -217,12 +262,12 @@ function handleMessage(message, state) {
217
262
  }
218
263
  const receiver = state.streamResponses.get(msg.streamId);
219
264
  if (receiver) {
220
- const pending = state.pendingRequests.get(receiver.requestId);
221
- if (pending) {
222
- state.pendingRequests.delete(receiver.requestId);
223
- if (pending.timeoutId)
224
- clearTimeout(pending.timeoutId);
225
- pending.reject(new Error(msg.error));
265
+ receiver.state = "errored";
266
+ receiver.controller.error(new Error(msg.error));
267
+ if (receiver.pullResolver) {
268
+ const resolver = receiver.pullResolver;
269
+ receiver.pullResolver = undefined;
270
+ resolver();
226
271
  }
227
272
  state.streamResponses.delete(msg.streamId);
228
273
  }
@@ -232,16 +277,6 @@ function handleMessage(message, state) {
232
277
  console.warn(`Unexpected message type: ${message.type}`);
233
278
  }
234
279
  }
235
- function concatUint8Arrays(arrays) {
236
- const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
237
- const result = new Uint8Array(totalLength);
238
- let offset = 0;
239
- for (const arr of arrays) {
240
- result.set(arr, offset);
241
- offset += arr.length;
242
- }
243
- return result;
244
- }
245
280
  async function handleCallbackInvoke(invoke, state) {
246
281
  const callback = state.callbacks.get(invoke.callbackId);
247
282
  const response = {
@@ -433,15 +468,21 @@ async function createRuntime(state, options = {}) {
433
468
  request: serializableRequest,
434
469
  options: opts
435
470
  };
471
+ const handleResponse = (res) => {
472
+ if (res.__streaming && res.response instanceof Response) {
473
+ return res.response;
474
+ }
475
+ return deserializeResponse(res.response);
476
+ };
436
477
  if (serialized.bodyStreamId !== undefined && bodyStream) {
437
478
  const streamId = serialized.bodyStreamId;
438
479
  const responsePromise = sendRequest(state, request2, opts?.timeout ?? DEFAULT_TIMEOUT);
439
480
  await sendBodyStream(state, streamId, bodyStream);
440
481
  const res = await responsePromise;
441
- return deserializeResponse(res.response);
482
+ return handleResponse(res);
442
483
  } else {
443
484
  const res = await sendRequest(state, request2, opts?.timeout ?? DEFAULT_TIMEOUT);
444
- return deserializeResponse(res.response);
485
+ return handleResponse(res);
445
486
  }
446
487
  },
447
488
  async getUpgradeRequest() {
@@ -1118,4 +1159,4 @@ export {
1118
1159
  connect
1119
1160
  };
1120
1161
 
1121
- //# debugId=8168995DA414336764756E2164756E21
1162
+ //# debugId=2BAB1C12EE66984164756E2164756E21
@@ -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 marshalValue,\n type MarshalContext,\n} from \"@ricsam/isolate-protocol\";\nimport { createPlaywrightHandler, type PlaywrightCallback } from \"@ricsam/isolate-playwright\";\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} 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 collecting streamed response chunks */\ninterface StreamResponseReceiver {\n streamId: number;\n requestId: number;\n metadata?: {\n status?: number;\n statusText?: string;\n headers?: [string, string][];\n };\n chunks: Uint8Array[];\n totalBytes: number;\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 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}\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 nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n connected: true,\n streamResponses: new Map(),\n uploadStreams: new Map(),\n };\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests\n for (const [, pending] of state.pendingRequests) {\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\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 // Create a receiver to collect chunks\n const receiver: StreamResponseReceiver = {\n streamId: msg.streamId,\n requestId: msg.requestId,\n metadata: msg.metadata,\n chunks: [],\n totalBytes: 0,\n };\n state.streamResponses.set(msg.streamId, receiver);\n // Send initial credit to allow daemon to start sending\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) {\n receiver.chunks.push(msg.chunk);\n receiver.totalBytes += msg.chunk.length;\n // Send more credit\n sendMessage(state.socket, {\n type: MessageType.STREAM_PULL,\n streamId: msg.streamId,\n maxBytes: STREAM_DEFAULT_CREDIT,\n } as StreamPull);\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 // Concatenate all chunks\n const body = concatUint8Arrays(receiver.chunks);\n // Resolve pending request with the streamed response\n const pending = state.pendingRequests.get(receiver.requestId);\n if (pending) {\n state.pendingRequests.delete(receiver.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n pending.resolve({\n response: {\n status: receiver.metadata?.status ?? 200,\n statusText: receiver.metadata?.statusText ?? \"OK\",\n headers: receiver.metadata?.headers ?? [],\n body,\n },\n });\n }\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\n const receiver = state.streamResponses.get(msg.streamId);\n if (receiver) {\n const pending = state.pendingRequests.get(receiver.requestId);\n if (pending) {\n state.pendingRequests.delete(receiver.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n pending.reject(new Error(msg.error));\n }\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 * Helper to concatenate Uint8Arrays.\n */\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\n/**\n * 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 } else {\n try {\n const result = await callback(...invoke.args);\n response.result = result;\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 }\n }\n\n sendMessage(state.socket, response);\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): 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 },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\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 // 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 }>(\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 deserializeResponse(res.response);\n } else {\n const res = await sendRequest<{ response: SerializedResponse }>(\n state,\n request,\n opts?.timeout ?? DEFAULT_TIMEOUT\n );\n return deserializeResponse(res.response);\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\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/**\n * Register fetch callback.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (serialized: unknown) => {\n const request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", type: 'async' };\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 */\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 return callback(moduleName as string);\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 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} 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 pullResolver?: () => void; // Resolves when consumer wants more data\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 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}\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 nextRequestId: 1,\n nextCallbackId: 1,\n nextStreamId: 1,\n connected: true,\n streamResponses: new Map(),\n uploadStreams: new Map(),\n };\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests\n for (const [, pending] of state.pendingRequests) {\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\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 };\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 // 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 receiver.controller.close();\n return;\n }\n if (receiver.state === \"errored\") {\n return;\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.pullResolver = resolve;\n });\n },\n cancel(_reason) {\n // Consumer cancelled the stream - notify daemon\n receiver.state = \"errored\";\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 });\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.pullResolver) {\n // Consumer is waiting for data - enqueue directly and resolve\n receiver.controller.enqueue(msg.chunk);\n const resolver = receiver.pullResolver;\n receiver.pullResolver = undefined;\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\n receiver.controller.close();\n\n // Resolve any pending pull\n if (receiver.pullResolver) {\n const resolver = receiver.pullResolver;\n receiver.pullResolver = undefined;\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\n receiver.state = \"errored\";\n\n // Error the stream controller\n receiver.controller.error(new Error(msg.error));\n\n // Resolve any pending pull\n if (receiver.pullResolver) {\n const resolver = receiver.pullResolver;\n receiver.pullResolver = undefined;\n resolver();\n }\n\n // Clean up\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 } else {\n try {\n const result = await callback(...invoke.args);\n response.result = result;\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 }\n }\n\n sendMessage(state.socket, response);\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): 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 },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\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\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/**\n * Register fetch callback.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (serialized: unknown) => {\n const request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", type: 'async' };\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 */\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 return callback(moduleName as string);\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": "8168995DA414336764756E2164756E21",
7
+ "mappings": ";;AAIA,oBAAS;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwDA;AAuBA,IAAM,kBAAkB;AAGxB,IAAM,qBAAqB,IAAI;AAkD/B,eAAsB,OAAO,CAAC,UAA0B,CAAC,GAA8B;AAAA,EACrF,MAAM,SAAS,MAAM,aAAa,OAAO;AAAA,EAEzC,MAAM,QAAyB;AAAA,IAC7B;AAAA,IACA,iBAAiB,IAAI;AAAA,IACrB,WAAW,IAAI;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB,IAAI;AAAA,IACrB,eAAe,IAAI;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,kBAAkB;AAAA,EAEjC,OAAO,GAAG,QAAQ,CAAC,SAAS;AAAA,IAC1B,IAAI;AAAA,MACF,WAAW,SAAS,OAAO,KAAK,IAAI,WAAW,IAAI,CAAC,GAAG;AAAA,QACrD,cAAc,MAAM,SAAS,KAAK;AAAA,MACpC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,QAAQ,MAAM,wBAAwB,GAAG;AAAA;AAAA,GAE5C;AAAA,EAED,OAAO,GAAG,SAAS,MAAM;AAAA,IACvB,MAAM,YAAY;AAAA,IAElB,cAAc,YAAY,MAAM,iBAAiB;AAAA,MAC/C,QAAQ,OAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,IAC/C;AAAA,IACA,MAAM,gBAAgB,MAAM;AAAA,GAC7B;AAAA,EAED,OAAO,GAAG,SAAS,CAAC,QAAQ;AAAA,IAC1B,QAAQ,MAAM,iBAAiB,GAAG;AAAA,GACnC;AAAA,EAED,OAAO;AAAA,IACL,eAAe,CAAC,mBACd,cAAc,OAAO,cAAc;AAAA,IACrC,OAAO,YAAY;AAAA,MACjB,MAAM,YAAY;AAAA,MAClB,OAAO,QAAQ;AAAA;AAAA,IAEjB,aAAa,MAAM,MAAM;AAAA,EAC3B;AAAA;AAMF,SAAS,YAAY,CAAC,SAA0C;AAAA,EAC9D,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,MAAM,UAAU,QAAQ,WAAW;AAAA,IAEnC,IAAI;AAAA,IAEJ,MAAM,UAAU,CAAC,QAAe;AAAA,MAC9B,OAAO,GAAG;AAAA;AAAA,IAGZ,MAAM,YAAY,MAAM;AAAA,MACtB,OAAO,eAAe,SAAS,OAAO;AAAA,MACtC,QAAQ,MAAM;AAAA;AAAA,IAGhB,IAAI,QAAQ,QAAQ;AAAA,MAClB,SAAS,WAAW,QAAQ,QAAQ,SAAS;AAAA,IAC/C,EAAO;AAAA,MACL,SAAS,WACP,QAAQ,QAAQ,OAChB,QAAQ,QAAQ,aAChB,SACF;AAAA;AAAA,IAGF,OAAO,GAAG,SAAS,OAAO;AAAA,IAG1B,MAAM,YAAY,WAAW,MAAM;AAAA,MACjC,OAAO,QAAQ;AAAA,MACf,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,OACrC,OAAO;AAAA,IAEV,OAAO,KAAK,WAAW,MAAM;AAAA,MAC3B,aAAa,SAAS;AAAA,KACvB;AAAA,GACF;AAAA;AAMH,SAAS,aAAa,CAAC,SAAkB,OAA8B;AAAA,EACrE,QAAQ,QAAQ;AAAA,SACT,YAAY,aAAa;AAAA,MAC5B,MAAM,WAAW;AAAA,MACjB,MAAM,UAAU,MAAM,gBAAgB,IAAI,SAAS,SAAS;AAAA,MAC5D,IAAI,SAAS;AAAA,QACX,MAAM,gBAAgB,OAAO,SAAS,SAAS;AAAA,QAC/C,IAAI,QAAQ;AAAA,UAAW,aAAa,QAAQ,SAAS;AAAA,QACrD,QAAQ,QAAQ,SAAS,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,SAEK,YAAY,gBAAgB;AAAA,MAC/B,MAAM,WAAW;AAAA,MACjB,MAAM,UAAU,MAAM,gBAAgB,IAAI,SAAS,SAAS;AAAA,MAC5D,IAAI,SAAS;AAAA,QACX,MAAM,gBAAgB,OAAO,SAAS,SAAS;AAAA,QAC/C,IAAI,QAAQ;AAAA,UAAW,aAAa,QAAQ,SAAS;AAAA,QACrD,MAAM,QAAQ,IAAI,MAAM,SAAS,OAAO;AAAA,QACxC,IAAI,SAAS,SAAS;AAAA,UACpB,MAAM,OAAO,SAAS,QAAQ;AAAA,UAC9B,IAAI,SAAS,QAAQ,OAAO;AAAA,YAC1B,MAAM,QAAQ,SAAS,QAAQ;AAAA,UACjC;AAAA,QACF;AAAA,QACA,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,SAEK,YAAY,iBAAiB;AAAA,MAChC,MAAM,SAAS;AAAA,MACf,qBAAqB,QAAQ,KAAK;AAAA,MAClC;AAAA,IACF;AAAA,SAEK,YAAY;AAAA,MAEf;AAAA,SAEG,YAAY,YAAY;AAAA,MAC3B,MAAM,MAAM;AAAA,MACZ,MAAM,YAAY,mBAAmB,IAAI,IAAI,SAAS;AAAA,MACtD,IAAI,WAAW;AAAA,QAEb,IAAI;AAAA,QACJ,IAAI,IAAI,QAAQ,gBAAgB,YAAY;AAAA,UAC1C,OAAO,IAAI,QAAQ,KAAK,OAAO,MAC7B,IAAI,QAAQ,KAAK,YACjB,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,UACjD;AAAA,QACF,EAAO;AAAA,UACL,OAAO,IAAI,QAAQ;AAAA;AAAA,QAErB,MAAM,MAAwB;AAAA,UAC5B,MAAM,IAAI,QAAQ;AAAA,UAClB,cAAc,IAAI,QAAQ;AAAA,UAC1B;AAAA,UACA,MAAM,IAAI,QAAQ;AAAA,UAClB,QAAQ,IAAI,QAAQ;AAAA,QACtB;AAAA,QACA,WAAW,MAAM,WAAW;AAAA,UAC1B,GAAG,GAAG;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,SAGK,YAAY,uBAAuB;AAAA,MACtC,MAAM,MAAM;AAAA,MAGZ,MAAM,WAAmC;AAAA,QACvC,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf,UAAU,IAAI;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,eAAe,CAAC;AAAA,MAClB;AAAA,MAGA,MAAM,iBAAiB,IAAI,eAA2B;AAAA,QACpD,KAAK,CAAC,YAAY;AAAA,UAEhB,SAAS,aAAa;AAAA;AAAA,QAExB,IAAI,CAAC,aAAa;AAAA,UAGhB,OAAO,SAAS,cAAc,SAAS,GAAG;AAAA,YACxC,MAAM,QAAQ,SAAS,cAAc,MAAM;AAAA,YAC3C,SAAS,WAAW,QAAQ,KAAK;AAAA,UACnC;AAAA,UAGA,IAAI,SAAS,UAAU,UAAU;AAAA,YAC/B,SAAS,WAAW,MAAM;AAAA,YAC1B;AAAA,UACF;AAAA,UACA,IAAI,SAAS,UAAU,WAAW;AAAA,YAChC;AAAA,UACF;AAAA,UAGA,YAAY,MAAM,QAAQ;AAAA,YACxB,MAAM,YAAY;AAAA,YAClB,UAAU,IAAI;AAAA,YACd,UAAU;AAAA,UACZ,CAAe;AAAA,UAGf,OAAO,IAAI,QAAc,CAAC,YAAY;AAAA,YACpC,SAAS,eAAe;AAAA,WACzB;AAAA;AAAA,QAEH,MAAM,CAAC,SAAS;AAAA,UAEd,SAAS,QAAQ;AAAA,UACjB,YAAY,MAAM,QAAQ;AAAA,YACxB,MAAM,YAAY;AAAA,YAClB,UAAU,IAAI;AAAA,YACd,OAAO;AAAA,UACT,CAAgB;AAAA,UAChB,MAAM,gBAAgB,OAAO,IAAI,QAAQ;AAAA;AAAA,MAE7C,CAAC;AAAA,MAED,MAAM,gBAAgB,IAAI,IAAI,UAAU,QAAQ;AAAA,MAGhD,MAAM,UAAU,MAAM,gBAAgB,IAAI,IAAI,SAAS;AAAA,MACvD,IAAI,SAAS;AAAA,QACX,MAAM,gBAAgB,OAAO,IAAI,SAAS;AAAA,QAC1C,IAAI,QAAQ;AAAA,UAAW,aAAa,QAAQ,SAAS;AAAA,QAErD,MAAM,WAAW,IAAI,SAAS,gBAAgB;AAAA,UAC5C,QAAQ,IAAI,UAAU,UAAU;AAAA,UAChC,YAAY,IAAI,UAAU,cAAc;AAAA,UACxC,SAAS,IAAI,UAAU;AAAA,QACzB,CAAC;AAAA,QAGD,QAAQ,QAAQ,EAAE,UAAU,aAAa,KAAK,CAAC;AAAA,MACjD;AAAA,MAGA,YAAY,MAAM,QAAQ;AAAA,QACxB,MAAM,YAAY;AAAA,QAClB,UAAU,IAAI;AAAA,QACd,UAAU;AAAA,MACZ,CAAe;AAAA,MACf;AAAA,IACF;AAAA,SAEK,YAAY,uBAAuB;AAAA,MACtC,MAAM,MAAM;AAAA,MACZ,MAAM,WAAW,MAAM,gBAAgB,IAAI,IAAI,QAAQ;AAAA,MACvD,IAAI,YAAY,SAAS,UAAU,UAAU;AAAA,QAC3C,IAAI,SAAS,cAAc;AAAA,UAEzB,SAAS,WAAW,QAAQ,IAAI,KAAK;AAAA,UACrC,MAAM,WAAW,SAAS;AAAA,UAC1B,SAAS,eAAe;AAAA,UACxB,SAAS;AAAA,QACX,EAAO;AAAA,UAEL,SAAS,cAAc,KAAK,IAAI,KAAK;AAAA;AAAA,MAEzC;AAAA,MACA;AAAA,IACF;AAAA,SAEK,YAAY,qBAAqB;AAAA,MACpC,MAAM,MAAM;AAAA,MACZ,MAAM,WAAW,MAAM,gBAAgB,IAAI,IAAI,QAAQ;AAAA,MACvD,IAAI,UAAU;AAAA,QAEZ,SAAS,QAAQ;AAAA,QAGjB,OAAO,SAAS,cAAc,SAAS,GAAG;AAAA,UACxC,MAAM,QAAQ,SAAS,cAAc,MAAM;AAAA,UAC3C,SAAS,WAAW,QAAQ,KAAK;AAAA,QACnC;AAAA,QAGA,SAAS,WAAW,MAAM;AAAA,QAG1B,IAAI,SAAS,cAAc;AAAA,UACzB,MAAM,WAAW,SAAS;AAAA,UAC1B,SAAS,eAAe;AAAA,UACxB,SAAS;AAAA,QACX;AAAA,QAGA,MAAM,gBAAgB,OAAO,IAAI,QAAQ;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,SAEK,YAAY,aAAa;AAAA,MAC5B,MAAM,MAAM;AAAA,MACZ,MAAM,UAAU,MAAM,cAAc,IAAI,IAAI,QAAQ;AAAA,MACpD,IAAI,SAAS;AAAA,QACX,QAAQ,UAAU,IAAI;AAAA,QAEtB,IAAI,QAAQ,gBAAgB;AAAA,UAC1B,QAAQ,eAAe;AAAA,UACvB,QAAQ,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,SAEK,YAAY,cAAc;AAAA,MAC7B,MAAM,MAAM;AAAA,MAEZ,MAAM,gBAAgB,MAAM,cAAc,IAAI,IAAI,QAAQ;AAAA,MAC1D,IAAI,eAAe;AAAA,QACjB,cAAc,QAAQ;AAAA,QACtB,MAAM,cAAc,OAAO,IAAI,QAAQ;AAAA,MACzC;AAAA,MAEA,MAAM,WAAW,MAAM,gBAAgB,IAAI,IAAI,QAAQ;AAAA,MACvD,IAAI,UAAU;AAAA,QAEZ,SAAS,QAAQ;AAAA,QAGjB,SAAS,WAAW,MAAM,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,QAG9C,IAAI,SAAS,cAAc;AAAA,UACzB,MAAM,WAAW,SAAS;AAAA,UAC1B,SAAS,eAAe;AAAA,UACxB,SAAS;AAAA,QACX;AAAA,QAGA,MAAM,gBAAgB,OAAO,IAAI,QAAQ;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA;AAAA,MAGE,QAAQ,KAAK,4BAA4B,QAAQ,MAAM;AAAA;AAAA;AAO7D,eAAe,oBAAoB,CACjC,QACA,OACe;AAAA,EACf,MAAM,WAAW,MAAM,UAAU,IAAI,OAAO,UAAU;AAAA,EAEtD,MAAM,WAAgC;AAAA,IACpC,MAAM,YAAY;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB;AAAA,EAEA,IAAI,CAAC,UAAU;AAAA,IACb,SAAS,QAAQ;AAAA,MACf,MAAM;AAAA,MACN,SAAS,qBAAqB,OAAO;AAAA,IACvC;AAAA,EACF,EAAO;AAAA,IACL,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,SAAS,GAAG,OAAO,IAAI;AAAA,MAC5C,SAAS,SAAS;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,QACf,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA,MACf;AAAA;AAAA;AAAA,EAIJ,YAAY,MAAM,QAAQ,QAAQ;AAAA;AAMpC,SAAS,WAAW,CAAC,QAAgB,SAAwB;AAAA,EAC3D,MAAM,QAAQ,WAAW,OAAO;AAAA,EAChC,OAAO,MAAM,KAAK;AAAA;AAMpB,SAAS,WAAc,CACrB,OACA,SACA,UAAU,iBACE;AAAA,EACZ,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,IAAI,CAAC,MAAM,WAAW;AAAA,MACpB,OAAO,IAAI,MAAM,eAAe,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IAEA,MAAM,YAAa,QAAkC;AAAA,IAErD,MAAM,YAAY,WAAW,MAAM;AAAA,MACjC,MAAM,gBAAgB,OAAO,SAAS;AAAA,MACtC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AAAA,OAClC,OAAO;AAAA,IAEV,MAAM,gBAAgB,IAAI,WAAW;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IAED,YAAY,MAAM,QAAQ,OAAO;AAAA,GAClC;AAAA;AAMH,eAAe,aAAa,CAC1B,OACA,UAA0B,CAAC,GACH;AAAA,EAExB,MAAM,YAA0C,CAAC;AAAA,EAEjD,IAAI,QAAQ,SAAS;AAAA,IACnB,UAAU,UAAU,yBAAyB,OAAO,QAAQ,OAAO;AAAA,EACrE;AAAA,EAEA,IAAI,QAAQ,OAAO;AAAA,IACjB,UAAU,QAAQ,sBAAsB,OAAO,QAAQ,KAAK;AAAA,EAC9D;AAAA,EAEA,IAAI,QAAQ,IAAI;AAAA,IACd,UAAU,KAAK,oBAAoB,OAAO,QAAQ,EAAE;AAAA,EACtD;AAAA,EAEA,IAAI,QAAQ,cAAc;AAAA,IACxB,UAAU,eAAe,6BACvB,OACA,QAAQ,YACV;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ,iBAAiB;AAAA,IAC3B,UAAU,SAAS,wBAAwB,OAAO,QAAQ,eAAe;AAAA,EAC3E;AAAA,EAGA,IAAI;AAAA,EACJ,IAAI,QAAQ,YAAY;AAAA,IACtB,oBAAoB,wBAAwB,QAAQ,WAAW,MAAM;AAAA,MACnE,SAAS,QAAQ,WAAW;AAAA,MAC5B,SAAS,QAAQ,WAAW;AAAA,IAC9B,CAAC;AAAA,IAED,MAAM,oBAAoB,MAAM;AAAA,IAChC,MAAM,UAAU,IAAI,mBAAmB,OAAO,WAAoB;AAAA,MAChE,MAAM,KAAK,KAAK,MAAM,MAAgB;AAAA,MACtC,MAAM,UAAS,MAAM,kBAAmB,EAAE;AAAA,MAC1C,OAAO,KAAK,UAAU,OAAM;AAAA,KAC7B;AAAA,IAGD,MAAM,aAAa,CAAC,CAAC,QAAQ,WAAW;AAAA,IACxC,MAAM,oBAAoB,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAAA,IAGzE,IAAI;AAAA,IACJ,IAAI,cAAc,mBAAmB;AAAA,MACnC,8BAA8B,sBAAsB,OAAO,CAAC,UAAmB;AAAA,QAC7E,MAAM,eAAe;AAAA,QAErB,IAAI,QAAQ,WAAY,SAAS;AAAA,UAC/B,QAAQ,WAAY,QAAQ;AAAA,YAC1B,MAAM;AAAA,YACN,OAAO,aAAa;AAAA,YACpB,MAAM,aAAa;AAAA,YACnB,WAAW,aAAa;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QAGA,IAAI,QAAQ,WAAY,WAAW,QAAQ,SAAS,SAAS;AAAA,UAC3D,QAAQ,QAAQ,QAAQ;AAAA,YACtB,MAAM;AAAA,YACN,OAAO,aAAa;AAAA,YACpB,MAAM,aAAa;AAAA,YACnB,WAAW,aAAa;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,OACD;AAAA,IACH;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,YAAY;AAAA,MACd,2BAA2B,sBAAsB,OAAO,CAAC,SAAkB;AAAA,QACzE,MAAM,UAAU;AAAA,QAEhB,QAAQ,WAAY,QAAS;AAAA,UAC3B,MAAM;AAAA,UACN,KAAK,QAAQ;AAAA,UACb,QAAQ,QAAQ;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,UAAU,QAAQ;AAAA,UAClB,cAAc,QAAQ;AAAA,UACtB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,OACF;AAAA,IACH;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,YAAY;AAAA,MACd,4BAA4B,sBAAsB,OAAO,CAAC,SAAkB;AAAA,QAC1E,MAAM,UAAU;AAAA,QAEhB,QAAQ,WAAY,QAAS;AAAA,UAC3B,MAAM;AAAA,UACN,KAAK,QAAQ;AAAA,UACb,QAAQ,QAAQ;AAAA,UAChB,YAAY,QAAQ;AAAA,UACpB,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,OACF;AAAA,IACH;AAAA,IAEA,UAAU,aAAa;AAAA,MACrB;AAAA,MAEA,SAAS,QAAQ,WAAW,WAAW,CAAC,QAAQ,SAAS;AAAA,MACzD,+BAA+B;AAAA,MAC/B,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA,IAC/B;AAAA,EACF;AAAA,EAGA,IAAI;AAAA,EACJ,IAAI,QAAQ,iBAAiB;AAAA,IAC3B,IAAI,OAAO,QAAQ,oBAAoB,UAAU;AAAA,MAC/C,MAAM,iBAAiB,QAAQ;AAAA,MAC/B,MAAM,mBAAyD,CAAC;AAAA,MAEhE,IAAI,eAAe,SAAS;AAAA,QAC1B,MAAM,cAAc,eAAe;AAAA,QACnC,MAAM,oBAAoB,sBAAsB,OAAO,CAAC,cAAuB;AAAA,UAC7E,MAAM,QAAQ,KAAK,MAAM,SAAmB;AAAA,UAC5C,YAAY,KAAK;AAAA,SAClB;AAAA,QACD,iBAAiB,UAAU;AAAA,UACzB,YAAY;AAAA,UACZ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,wBAAwB;AAAA,QACtB,WAAW;AAAA,QACX,aAAa,eAAe;AAAA,MAC9B;AAAA,IACF,EAAO;AAAA,MACL,wBAAwB;AAAA;AAAA,EAE5B;AAAA,EAEA,MAAM,YAAY,MAAM;AAAA,EACxB,MAAM,UAAgC;AAAA,IACpC,MAAM,YAAY;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,MACP,eAAe,QAAQ;AAAA,MACvB,KAAK,QAAQ;AAAA,MACb;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAM,YAAiC,OAAO,OAAO;AAAA,EACpE,MAAM,YAAY,OAAO;AAAA,EAGzB,MAAM,qBAA2D,IAAI;AAAA,EACrE,mBAAmB,IAAI,WAAW,kBAAkB;AAAA,EAGpD,MAAM,cAAiC;AAAA,SAC/B,gBAAe,CAAC,KAAc,MAAwB;AAAA,MAC1D,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,aAAa,MAAM,8BAA8B,OAAO,GAAG;AAAA,MAGjE,QAAQ,eAAe,wBAAwB;AAAA,MAE/C,MAAM,WAAkC;AAAA,QACtC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MAGA,MAAM,iBAAiB,CAAC,QAAsF;AAAA,QAE5G,IAAI,IAAI,eAAe,IAAI,oBAAoB,UAAU;AAAA,UACvD,OAAO,IAAI;AAAA,QACb;AAAA,QAEA,OAAO,oBAAoB,IAAI,QAA8B;AAAA;AAAA,MAI/D,IAAI,WAAW,iBAAiB,aAAa,YAAY;AAAA,QACvD,MAAM,WAAW,WAAW;AAAA,QAG5B,MAAM,kBAAkB,YACtB,OACA,UACA,MAAM,WAAW,eACnB;AAAA,QAGA,MAAM,eAAe,OAAO,UAAU,UAAU;AAAA,QAGhD,MAAM,MAAM,MAAM;AAAA,QAClB,OAAO,eAAe,GAAG;AAAA,MAC3B,EAAO;AAAA,QACL,MAAM,MAAM,MAAM,YAChB,OACA,UACA,MAAM,WAAW,eACnB;AAAA,QACA,OAAO,eAAe,GAAG;AAAA;AAAA;AAAA,SAIvB,kBAAiB,GAAmC;AAAA,MACxD,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAqC;AAAA,QACzC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAAmC,OAAO,GAAG;AAAA;AAAA,SAGhD,sBAAqB,CAAC,cAAqC;AAAA,MAC/D,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAqB;AAAA,QACzB,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,SAGxB,yBAAwB,CAAC,cAAsB,SAA8C;AAAA,MACjG,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,OAAO,mBAAmB,cAAc,IAAI,WAAW,OAAO,IAAI;AAAA,MACxE,MAAM,MAAwB;AAAA,QAC5B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,SAGxB,uBAAsB,CAAC,cAAsB,MAAc,QAA+B;AAAA,MAC9F,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAsB;AAAA,QAC1B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,SAGxB,uBAAsB,CAAC,cAAsB,OAA6B;AAAA,MAC9E,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA2B;AAAA,QAC/B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,OAAO,MAAM;AAAA,MACf;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,IAG9B,kBAAkB,CAAC,UAAuD;AAAA,MACxE,mBAAmB,IAAI,QAAQ;AAAA,MAC/B,OAAO,MAAM;AAAA,QACX,mBAAmB,OAAO,QAAQ;AAAA;AAAA;AAAA,SAIhC,gBAAe,GAAqB;AAAA,MACxC,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAmC;AAAA,QACvC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAAqB,OAAO,GAAG;AAAA;AAAA,SAGlC,qBAAoB,GAAqB;AAAA,MAC7C,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAwC;AAAA,QAC5C,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAAqB,OAAO,GAAG;AAAA;AAAA,EAE1C;AAAA,EAGA,MAAM,eAAmC;AAAA,SACjC,SAAQ,GAAkB;AAAA,MAC9B,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA6B;AAAA,QACjC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,EAEhC;AAAA,EAGA,MAAM,gBAAqC;AAAA,SACnC,MAAK,GAAkB;AAAA,MAC3B,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA2B;AAAA,QAC/B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,SAGxB,UAAS,GAAiC;AAAA,MAC9C,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA+B;AAAA,QACnC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,UAAS,MAAM,YAAoC,OAAO,GAAG;AAAA,MACnE,OAAO,IAAI,IAAI,OAAO,QAAQ,OAAM,CAAC;AAAA;AAAA,SAGjC,YAAW,GAAiC;AAAA,MAChD,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAiC;AAAA,QACrC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,UAAS,MAAM,YAAoC,OAAO,GAAG;AAAA,MACnE,OAAO,IAAI,IAAI,OAAO,QAAQ,OAAM,CAAC;AAAA;AAAA,SAGjC,cAAa,GAAoB;AAAA,MACrC,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAmC;AAAA,QACvC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAAoB,OAAO,GAAG;AAAA;AAAA,EAEzC;AAAA,EAGA,MAAM,yBAAyB,CAAC,CAAC,QAAQ;AAAA,EACzC,MAAM,oBAAoB,CAAC,CAAC,QAAQ;AAAA,EAGpC,MAAM,wBAAqD;AAAA,SACnD,SAAQ,CAAC,SAA2C;AAAA,MACxD,IAAI,CAAC,wBAAwB;AAAA,QAC3B,MAAM,IAAI,MAAM,mFAAmF;AAAA,MACrG;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAuB;AAAA,QAC3B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,YAA4B,OAAO,KAAK,WAAW,eAAe;AAAA;AAAA,SAGrE,SAAQ,GAAqB;AAAA,MACjC,IAAI,CAAC,wBAAwB;AAAA,QAC3B,MAAM,IAAI,MAAM,mFAAmF;AAAA,MACrG;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAuB;AAAA,QAC3B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAAqB,OAAO,GAAG;AAAA;AAAA,SAGlC,aAAY,GAAoB;AAAA,MACpC,IAAI,CAAC,wBAAwB;AAAA,QAC3B,MAAM,IAAI,MAAM,mFAAmF;AAAA,MACrG;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA2B;AAAA,QAC/B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAAoB,OAAO,GAAG;AAAA;AAAA,SAGjC,MAAK,GAAkB;AAAA,MAC3B,IAAI,CAAC,wBAAwB;AAAA,QAC3B,MAAM,IAAI,MAAM,mFAAmF;AAAA,MACrG;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA2B;AAAA,QAC/B,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,EAEhC;AAAA,EAGA,MAAM,mBAA2C;AAAA,SACzC,iBAAgB,GAA2B;AAAA,MAC/C,IAAI,CAAC,mBAAmB;AAAA,QACtB,MAAM,IAAI,MAAM,8EAA8E;AAAA,MAChG;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA+B;AAAA,QACnC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAO,YAA2B,OAAO,GAAG;AAAA;AAAA,SAGxC,mBAAkB,GAAkB;AAAA,MACxC,IAAI,CAAC,mBAAmB;AAAA,QACtB,MAAM,IAAI,MAAM,8EAA8E;AAAA,MAChG;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAAiC;AAAA,QACrC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,EAEhC;AAAA,EAEA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IAGA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,YAAY;AAAA,IAEZ,MAAM,OACJ,MACA,sBACkB;AAAA,MAClB,MAAM,QAAQ,MAAM;AAAA,MAEpB,MAAM,WACJ,OAAO,sBAAsB,WACzB,EAAE,UAAU,kBAAkB,IAC9B;AAAA,MACN,MAAM,MAAmB;AAAA,QACvB,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,UAAS;AAAA,QACnB,gBAAgB,UAAS;AAAA,QACzB,QAAQ;AAAA,MACV;AAAA,MACA,MAAM,YAAgC,OAAO,GAAG;AAAA;AAAA,IAIlD,SAAS,YAAY;AAAA,MAEnB,mBAAmB,OAAO,SAAS;AAAA,MAEnC,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,MAA6B;AAAA,QACjC,MAAM,YAAY;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,YAAY,OAAO,GAAG;AAAA;AAAA,EAEhC;AAAA;AAMF,SAAS,qBAAqB,CAC5B,OACA,SACQ;AAAA,EACR,MAAM,aAAa,MAAM;AAAA,EACzB,MAAM,UAAU,IAAI,YAAY,CAAC,SAAkB;AAAA,IACjD,QAAQ,IAAI;AAAA,IACZ;AAAA,GACD;AAAA,EACD,OAAO;AAAA;AAMT,SAAS,wBAAwB,CAC/B,OACA,WACsC;AAAA,EACtC,MAAM,gBAAsD,CAAC;AAAA,EAE7D,IAAI,UAAU,SAAS;AAAA,IACrB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,CAAC,UAAmB;AAAA,MAClD,UAAU,QAAS,KAAgD;AAAA,KACpE;AAAA,IACD,cAAc,UAAU,EAAE,YAAY,MAAM,WAAW,MAAM,OAAO;AAAA,EACtE;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,qBAAqB,CAC5B,OACA,UACsB;AAAA,EACtB,MAAM,aAAa,MAAM;AAAA,EAEzB,MAAM,UAAU,IAAI,YAAY,OAAO,eAAwB;AAAA,IAC7D,MAAM,UAAU,mBAAmB,UAAmC;AAAA,IACtE,MAAM,WAAW,MAAM,SAAS,OAAO;AAAA,IACvC,OAAO,kBAAkB,QAAQ;AAAA,GAClC;AAAA,EAED,OAAO,EAAE,YAAY,MAAM,SAAS,MAAM,QAAQ;AAAA;AAMpD,SAAS,mBAAmB,CAC1B,OACA,WACsC;AAAA,EACtC,MAAM,gBAAsD,CAAC;AAAA,EAG7D,IAAI,UAAU,UAAU;AAAA,IACtB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,SAAkB;AAAA,MACvD,MAAM,SAAS,MAAM,UAAU,SAAU,IAAc;AAAA,MAEvD,OAAO,IAAI,WAAW,MAAM;AAAA,KAC7B;AAAA,IACD,cAAc,WAAW,EAAE,YAAY,MAAM,YAAY,MAAM,QAAQ;AAAA,EACzE;AAAA,EAGA,IAAI,UAAU,WAAW;AAAA,IACvB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,MAAe,SAAkB;AAAA,MAEtE,IAAI;AAAA,MACJ,IAAI,gBAAgB,YAAY;AAAA,QAC9B,SAAS,KAAK,OAAO,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;AAAA,MAC/E,EAAO,SAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,QAC9B,SAAS,IAAI,WAAW,IAAgB,EAAE;AAAA,MAC5C,EAAO,SAAI,gBAAgB,aAAa;AAAA,QACtC,SAAS;AAAA,MACX,EAAO;AAAA,QACL,SAAS,IAAI,YAAY,CAAC;AAAA;AAAA,MAE5B,MAAM,UAAU,UAAW,MAAgB,MAAM;AAAA,KAClD;AAAA,IACD,cAAc,YAAY,EAAE,YAAY,MAAM,aAAa,MAAM,QAAQ;AAAA,EAC3E;AAAA,EAGA,IAAI,UAAU,QAAQ;AAAA,IACpB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,SAAkB;AAAA,MACvD,MAAM,UAAU,OAAQ,IAAc;AAAA,KACvC;AAAA,IACD,cAAc,SAAS,EAAE,YAAY,MAAM,UAAU,MAAM,QAAQ;AAAA,EACrE;AAAA,EAGA,IAAI,UAAU,SAAS;AAAA,IACrB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,SAAkB;AAAA,MACvD,OAAO,UAAU,QAAS,IAAc;AAAA,KACzC;AAAA,IACD,cAAc,UAAU,EAAE,YAAY,MAAM,WAAW,MAAM,QAAQ;AAAA,EACvE;AAAA,EAGA,IAAI,UAAU,OAAO;AAAA,IACnB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,MAAe,YAAqB;AAAA,MACzE,MAAM,UAAU,MAAO,MAAgB,OAAkC;AAAA,KAC1E;AAAA,IACD,cAAc,QAAQ,EAAE,YAAY,MAAM,SAAS,MAAM,QAAQ;AAAA,EACnE;AAAA,EAGA,IAAI,UAAU,OAAO;AAAA,IACnB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,SAAkB;AAAA,MACvD,MAAM,UAAU,MAAO,IAAc;AAAA,KACtC;AAAA,IACD,cAAc,QAAQ,EAAE,YAAY,MAAM,SAAS,MAAM,QAAQ;AAAA,EACnE;AAAA,EAGA,IAAI,UAAU,MAAM;AAAA,IAClB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,SAAkB;AAAA,MACvD,OAAO,UAAU,KAAM,IAAc;AAAA,KACtC;AAAA,IACD,cAAc,OAAO,EAAE,YAAY,MAAM,QAAQ,MAAM,QAAQ;AAAA,EACjE;AAAA,EAGA,IAAI,UAAU,QAAQ;AAAA,IACpB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,UAAU,IAAI,YAAY,OAAO,MAAe,OAAgB;AAAA,MACpE,MAAM,UAAU,OAAQ,MAAgB,EAAY;AAAA,KACrD;AAAA,IACD,cAAc,SAAS,EAAE,YAAY,MAAM,UAAU,MAAM,QAAQ;AAAA,EACrE;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,4BAA4B,CACnC,OACA,UACsB;AAAA,EACtB,MAAM,aAAa,MAAM;AAAA,EAEzB,MAAM,UAAU,IAAI,YAAY,OAAO,eAAwB;AAAA,IAC7D,OAAO,SAAS,UAAoB;AAAA,GACrC;AAAA,EAED,OAAO,EAAE,YAAY,MAAM,gBAAgB,MAAM,QAAQ;AAAA;AAQ3D,IAAM,yBAAyB,IAAI;AACnC,IAAI,uBAAuB;AAI3B,IAAM,0BAA0B,IAAI;AACpC,IAAM,2BAA2B,IAAI;AAKrC,SAAS,YAAY,CAAC,OAAsE;AAAA,EAC1F,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA8B,WAAW;AAAA;AAO9C,SAAS,kBAAkB,CAAC,OAA6E;AAAA,EACvG,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA8B,WAAW;AAAA;AAO9C,SAAS,uBAAuB,CAC9B,OACA,iBACsC;AAAA,EACtC,MAAM,gBAAsD,CAAC;AAAA,EAE7D,YAAY,MAAM,QAAQ,OAAO,QAAQ,eAAe,GAAG;AAAA,IACzD,IAAI,IAAI,SAAS,iBAAiB;AAAA,MAKhC,MAAM,kBAAkB,MAAM;AAAA,MAC9B,MAAM,UAAU,IAAI,iBAAiB,UAAU,SAAoB;AAAA,QACjE,IAAI;AAAA,UACF,MAAM,KAAK,IAAI;AAAA,UACf,MAAM,WAAW,GAAG,GAAG,IAAI;AAAA,UAC3B,MAAM,aAAa;AAAA,UACnB,uBAAuB,IAAI,YAAY,EAAE,SAAS,CAAC;AAAA,UACnD,OAAO,EAAE,WAAW;AAAA,UACpB,OAAO,OAAgB;AAAA,UACvB,MAAM;AAAA;AAAA,OAET;AAAA,MAGD,MAAM,iBAAiB,MAAM;AAAA,MAC7B,MAAM,UAAU,IAAI,gBAAgB,OAAO,eAAwB;AAAA,QACjE,MAAM,UAAU,uBAAuB,IAAI,UAAoB;AAAA,QAC/D,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,IAAI,MAAM,oBAAoB,sBAAsB;AAAA,QAC5D;AAAA,QACA,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,SAAS,KAAK;AAAA,UAC3C,IAAI,OAAO,MAAM;AAAA,YACf,uBAAuB,OAAO,UAAoB;AAAA,UACpD;AAAA,UACA,OAAO,EAAE,MAAM,OAAO,MAAM,OAAO,MAAM,aAAa,OAAO,KAAK,EAAE;AAAA,UACpE,OAAO,OAAgB;AAAA,UACvB,uBAAuB,OAAO,UAAoB;AAAA,UAClD,MAAM;AAAA;AAAA,OAET;AAAA,MAGD,MAAM,mBAAmB,MAAM;AAAA,MAC/B,MAAM,UAAU,IAAI,kBAAkB,OAAO,YAAqB,UAAmB;AAAA,QACnF,MAAM,UAAU,uBAAuB,IAAI,UAAoB;AAAA,QAC/D,IAAI,CAAC,SAAS;AAAA,UACZ,OAAO,EAAE,MAAM,MAAM,OAAO,MAAM,aAAa,SAAS,EAAE;AAAA,QAC5D;AAAA,QACA,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,SAAS,SAAS,KAAK;AAAA,UACpD,uBAAuB,OAAO,UAAoB;AAAA,UAClD,OAAO,EAAE,MAAM,MAAM,OAAO,MAAM,aAAa,QAAQ,KAAK,EAAE;AAAA,UAC9D,OAAO,OAAgB;AAAA,UACvB,uBAAuB,OAAO,UAAoB;AAAA,UAClD,MAAM;AAAA;AAAA,OAET;AAAA,MAGD,MAAM,kBAAkB,MAAM;AAAA,MAC9B,MAAM,UAAU,IAAI,iBAAiB,OAAO,YAAqB,cAAuB;AAAA,QACtF,MAAM,UAAU,uBAAuB,IAAI,UAAoB;AAAA,QAC/D,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,IAAI,MAAM,oBAAoB,sBAAsB;AAAA,QAC5D;AAAA,QACA,IAAI;AAAA,UACF,MAAM,UAAU;AAAA,UAChB,MAAM,QAAQ,OAAO,OAAO,IAAI,MAAM,QAAQ,OAAO,GAAG,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,UAC9E,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA,UACnD,uBAAuB,OAAO,UAAoB;AAAA,UAClD,OAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM,OAAO,MAAM,aAAa,QAAQ,KAAK,EAAE;AAAA,UAC9E,OAAO,OAAgB;AAAA,UACvB,uBAAuB,OAAO,UAAoB;AAAA,UAClD,MAAM;AAAA;AAAA,OAET;AAAA,MAGD,cAAc,GAAG,gBAAgB,EAAE,YAAY,iBAAiB,MAAM,GAAG,cAAc,MAAM,QAAQ;AAAA,MACrG,cAAc,GAAG,eAAe,EAAE,YAAY,gBAAgB,MAAM,GAAG,aAAa,MAAM,QAAQ;AAAA,MAClG,cAAc,GAAG,iBAAiB,EAAE,YAAY,kBAAkB,MAAM,GAAG,eAAe,MAAM,QAAQ;AAAA,MACxG,cAAc,GAAG,gBAAgB,EAAE,YAAY,iBAAiB,MAAM,GAAG,cAAc,MAAM,QAAQ;AAAA,MAGrG,cAAc,QAAQ;AAAA,QACpB,YAAY;AAAA,QACZ;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF,EAAO;AAAA,MACL,MAAM,aAAa,MAAM;AAAA,MAKzB,MAAM,UAAU,IAAI,YAAY,UAAU,SAAoB;AAAA,QAC5D,MAAM,SAAS,MAAM,IAAI,GAAG,GAAG,IAAI;AAAA,QAGnC,MAAM,uBAAuB,CAAC,UAA4B;AAAA,UACxD,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAAA,YAC/C,OAAO;AAAA,UACT;AAAA,UAGA,IAAI,aAAa,KAAK,GAAG;AAAA,YAEvB,MAAM,oBAAoB,MAAM;AAAA,YAChC,MAAM,UAAU,IAAI,mBAAmB,UAAU,UAAoB;AAAA,cACnE,MAAM,YAAY,MAAK;AAAA,cACvB,MAAM,UAAU,wBAAwB,IAAI,SAAS;AAAA,cACrD,IAAI,CAAC,SAAS;AAAA,gBACZ,MAAM,IAAI,MAAM,WAAW,qBAAqB;AAAA,cAClD;AAAA,cACA,MAAM,gBAAgB,MAAM;AAAA,cAE5B,wBAAwB,OAAO,SAAS;AAAA,cAExC,MAAM,mBAAmB,MAAM,aAAa,eAAe,UAAU;AAAA,cACrE,OAAO,qBAAqB,gBAAgB;AAAA,aAC7C;AAAA,YACD,OAAO;AAAA,iBACF;AAAA,cACH,qBAAqB;AAAA,YACvB;AAAA,UACF;AAAA,UAGA,IAAI,mBAAmB,KAAK,GAAG;AAAA,YAE7B,MAAM,iBAAiB,MAAM;AAAA,YAC7B,MAAM,UAAU,IAAI,gBAAgB,UAAU,UAAoB;AAAA,cAChE,MAAM,aAAa,MAAK;AAAA,cACxB,MAAM,WAAW,yBAAyB,IAAI,UAAU;AAAA,cACxD,IAAI,CAAC,UAAU;AAAA,gBACb,MAAM,IAAI,MAAM,YAAY,sBAAsB;AAAA,cACpD;AAAA,cACA,MAAM,aAAa,MAAM,SAAS,KAAK;AAAA,cACvC,IAAI,WAAW,MAAM;AAAA,gBACnB,yBAAyB,OAAO,UAAU;AAAA,cAC5C;AAAA,cAEA,MAAM,kBAAkB,MAAM,aAAa,WAAW,OAAO,UAAU;AAAA,cACvE,OAAO;AAAA,gBACL,MAAM,WAAW;AAAA,gBACjB,OAAO,qBAAqB,eAAe;AAAA,cAC7C;AAAA,aACD;AAAA,YAGD,MAAM,mBAAmB,MAAM;AAAA,YAC/B,MAAM,UAAU,IAAI,kBAAkB,UAAU,UAAoB;AAAA,cAClE,MAAM,aAAa,MAAK;AAAA,cACxB,MAAM,cAAc,MAAK;AAAA,cACzB,MAAM,WAAW,yBAAyB,IAAI,UAAU;AAAA,cACxD,yBAAyB,OAAO,UAAU;AAAA,cAC1C,IAAI,CAAC,YAAY,CAAC,SAAS,QAAQ;AAAA,gBACjC,OAAO,EAAE,MAAM,MAAM,OAAO,UAAU;AAAA,cACxC;AAAA,cACA,MAAM,aAAa,MAAM,SAAS,OAAO,WAAW;AAAA,cACpD,MAAM,kBAAkB,MAAM,aAAa,WAAW,OAAO,UAAU;AAAA,cACvE,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,qBAAqB,eAAe;AAAA,cAC7C;AAAA,aACD;AAAA,YAED,OAAO;AAAA,iBACF;AAAA,cACH,kBAAkB;AAAA,cAClB,oBAAoB;AAAA,YACtB;AAAA,UACF;AAAA,UAGA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,YACxB,OAAO,MAAM,IAAI,UAAQ,qBAAqB,IAAI,CAAC;AAAA,UACrD;AAAA,UAGA,MAAM,YAAqC,CAAC;AAAA,UAC5C,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAAA,YACpC,UAAU,OAAO,qBAAsB,MAAkC,IAAI;AAAA,UAC/E;AAAA,UACA,OAAO;AAAA;AAAA,QAKT,MAAM,aAA6B;AAAA,UACjC,kBAAkB,CAAC,OAAyB;AAAA,YAC1C,MAAM,qBAAqB,MAAM;AAAA,YAEjC,MAAM,UAAU,IAAI,oBAAoB,UAAU,UAAoB;AAAA,cACpE,MAAM,WAAW,MAAM,GAAG,GAAG,KAAI;AAAA,cACjC,MAAM,mBAAmB,MAAM,aAAa,UAAU,UAAU;AAAA,cAChE,OAAO,qBAAqB,gBAAgB;AAAA,aAC7C;AAAA,YACD,OAAO;AAAA;AAAA,UAET,iBAAiB,CAAC,YAAsC;AAAA,YACtD,MAAM,YAAY,MAAM;AAAA,YAExB,wBAAwB,IAAI,WAAW,OAAO;AAAA,YAC9C,OAAO;AAAA;AAAA,UAET,kBAAkB,CAAC,aAA6C;AAAA,YAC9D,MAAM,aAAa,MAAM;AAAA,YAEzB,yBAAyB,IAAI,YAAY,QAAQ;AAAA,YACjD,OAAO;AAAA;AAAA,QAEX;AAAA,QAEA,MAAM,aAAa,MAAM,aAAa,QAAQ,UAAU;AAAA,QACxD,MAAM,kBAAkB,qBAAqB,UAAU;AAAA,QACvD,OAAO;AAAA,OACR;AAAA,MAED,cAAc,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,QACA,MAAM,IAAI;AAAA,MACZ;AAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AAAA;AAwCT,eAAe,iBAAiB,CAAC,UAAqD;AAAA,EACpF,MAAM,UAA8B,CAAC;AAAA,EACrC,SAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAAA,IACvC,QAAQ,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,GAC1B;AAAA,EAED,IAAI,OAA0B;AAAA,EAC9B,IAAI,SAAS,MAAM;AAAA,IACjB,OAAO,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,EACpD;AAAA,EAEA,OAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,kBAAkB,CAAC,MAAsC;AAAA,EAChE,OAAO,IAAI,QAAQ,KAAK,KAAK;AAAA,IAC3B,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,EACb,CAAC;AAAA;AAGH,SAAS,mBAAmB,CAAC,MAAoC;AAAA,EAC/D,OAAO,IAAI,SAAS,KAAK,MAAoC;AAAA,IAC3D,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,SAAS,KAAK;AAAA,EAChB,CAAC;AAAA;AAeH,eAAe,6BAA6B,CAC1C,OACA,SACsC;AAAA,EACtC,MAAM,UAA8B,CAAC;AAAA,EACrC,QAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAAA,IACtC,QAAQ,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,GAC1B;AAAA,EAED,IAAI,OAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,IAAI;AAAA,EAEJ,IAAI,QAAQ,MAAM;AAAA,IAEhB,MAAM,gBAAgB,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,IAC1D,MAAM,YAAY,gBAAgB,SAAS,eAAe,EAAE,IAAI;AAAA,IAEhE,IAAI,cAAc,QAAQ,YAAY,kBAAkB;AAAA,MAEtD,eAAe,MAAM;AAAA,MACrB,aAAa,QAAQ;AAAA,IACvB,EAAO;AAAA,MAEL,MAAM,gBAAgB,QAAQ,MAAM;AAAA,MACpC,IAAI;AAAA,QACF,OAAO,IAAI,WAAW,MAAM,QAAQ,YAAY,CAAC;AAAA,QAGjD,IAAI,KAAK,SAAS,kBAAkB;AAAA,UAElC,eAAe,MAAM;AAAA,UACrB,aAAa,cAAc;AAAA,UAC3B,OAAO;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QAEN,eAAe,MAAM;AAAA,QACrB,aAAa,cAAc;AAAA;AAAA;AAAA,EAGjC;AAAA,EAEA,MAAM,SAAsC;AAAA,IAC1C,QAAQ,QAAQ;AAAA,IAChB,KAAK,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAAA,EAGA,IAAI,iBAAiB,WAAW;AAAA,IAC9B,OAAO,eAAe;AAAA,IACtB,OAAO,aAAa;AAAA,EACtB;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,mBAAmB,CAAC,SAA6C;AAAA,EACxE,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,IAC9B,QAAQ,iBAAiB;AAAA,GAC1B;AAAA;AAMH,eAAe,cAAc,CAC3B,OACA,UACA,MACe;AAAA,EAEf,MAAM,UAA+B;AAAA,IACnC;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,cAAc,IAAI,UAAU,OAAO;AAAA,EAEzC,MAAM,SAAS,KAAK,UAAU;AAAA,EAE9B,IAAI;AAAA,IACF,OAAO,MAAM;AAAA,MACX,IAAI,QAAQ,UAAU,UAAU;AAAA,QAC9B,MAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAAA,MAGA,OAAO,QAAQ,SAAS,qBAAqB,QAAQ,UAAU,UAAU;AAAA,QACvE,MAAM,oBAAoB,OAAO;AAAA,MACnC;AAAA,MAEA,IAAI,QAAQ,UAAU,UAAU;AAAA,QAC9B,MAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAAA,MAEA,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,MAE1C,IAAI,MAAM;AAAA,QAER,YAAY,MAAM,QAAQ;AAAA,UACxB,MAAM,YAAY;AAAA,UAClB;AAAA,QACF,CAAgB;AAAA,QAChB;AAAA,MACF;AAAA,MAGA,SAAS,SAAS,EAAG,SAAS,MAAM,QAAQ,UAAU,mBAAmB;AAAA,QACvE,MAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,iBAAiB;AAAA,QAE5D,YAAY,MAAM,QAAQ;AAAA,UACxB,MAAM,YAAY;AAAA,UAClB;AAAA,UACA;AAAA,QACF,CAAe;AAAA,QAEf,QAAQ,UAAU,MAAM;AAAA,QACxB,QAAQ,oBAAoB,MAAM;AAAA,MACpC;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,YAAY,MAAM,QAAQ;AAAA,MACxB,MAAM,YAAY;AAAA,MAClB;AAAA,MACA,OAAQ,IAAc;AAAA,IACxB,CAAgB;AAAA,IAChB,MAAM;AAAA,YACN;AAAA,IACA,OAAO,YAAY;AAAA,IACnB,MAAM,cAAc,OAAO,QAAQ;AAAA;AAAA;",
8
+ "debugId": "2BAB1C12EE66984164756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "type": "module"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {