@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.
package/dist/cjs/connection.cjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
177
|
-
|
|
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.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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 =
|
|
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
|
|
507
|
+
return handleResponse(res);
|
|
467
508
|
} else {
|
|
468
509
|
const res = await sendRequest(state, request2, opts?.timeout ?? DEFAULT_TIMEOUT);
|
|
469
|
-
return
|
|
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=
|
|
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": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "5325684CDAEFBA9A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
package/dist/mjs/connection.mjs
CHANGED
|
@@ -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
|
-
|
|
152
|
-
|
|
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.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
|
482
|
+
return handleResponse(res);
|
|
442
483
|
} else {
|
|
443
484
|
const res = await sendRequest(state, request2, opts?.timeout ?? DEFAULT_TIMEOUT);
|
|
444
|
-
return
|
|
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=
|
|
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": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "2BAB1C12EE66984164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED