@ricsam/isolate-daemon 0.1.8 → 0.1.10

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.
@@ -62,7 +62,8 @@ function handleConnection(socket, state) {
62
62
  nextCallbackId: 1,
63
63
  nextStreamId: 1,
64
64
  activeStreams: new Map,
65
- streamReceivers: new Map
65
+ streamReceivers: new Map,
66
+ callbackStreamReceivers: new Map
66
67
  };
67
68
  state.connections.set(socket, connection);
68
69
  const parser = import_isolate_protocol.createFrameParser();
@@ -223,6 +224,15 @@ async function handleMessage(message, connection, state) {
223
224
  case import_isolate_protocol.MessageType.STREAM_ERROR:
224
225
  handleStreamError(message, connection);
225
226
  break;
227
+ case import_isolate_protocol.MessageType.CALLBACK_STREAM_START:
228
+ handleCallbackStreamStart(message, connection);
229
+ break;
230
+ case import_isolate_protocol.MessageType.CALLBACK_STREAM_CHUNK:
231
+ handleCallbackStreamChunk(message, connection);
232
+ break;
233
+ case import_isolate_protocol.MessageType.CALLBACK_STREAM_END:
234
+ handleCallbackStreamEnd(message, connection);
235
+ break;
226
236
  default:
227
237
  sendError(connection.socket, message.requestId ?? 0, import_isolate_protocol.ErrorCode.UNKNOWN_MESSAGE_TYPE, `Unknown message type: ${message.type}`);
228
238
  }
@@ -414,7 +424,12 @@ async function handleCreateRuntime(message, connection, state) {
414
424
  throw new Error("Fetch callback not available");
415
425
  }
416
426
  const serialized = await serializeRequest(request);
417
- const result = await invokeClientCallback(conn, callbackId, [serialized]);
427
+ const result = await invokeClientCallback(conn, callbackId, [serialized], 60000);
428
+ if (result && typeof result === "object" && result.__streamingResponse) {
429
+ const response = result.response;
430
+ response.__isCallbackStream = true;
431
+ return response;
432
+ }
418
433
  return deserializeResponse(result);
419
434
  }
420
435
  },
@@ -517,7 +532,7 @@ async function handleCreateRuntime(message, connection, state) {
517
532
  console: playwrightCallbacks.console,
518
533
  onEvent: (event) => {
519
534
  if (event.type === "browserConsoleLog" && playwrightCallbacks.onBrowserConsoleLogCallbackId) {
520
- const promise = invokeClientCallback(connection, playwrightCallbacks.onBrowserConsoleLogCallbackId, [{ level: event.level, args: event.args, timestamp: event.timestamp }]).catch(() => {});
535
+ const promise = invokeClientCallback(connection, playwrightCallbacks.onBrowserConsoleLogCallbackId, [{ level: event.level, stdout: event.stdout, timestamp: event.timestamp }]).catch(() => {});
521
536
  pendingCallbacks.push(promise);
522
537
  } else if (event.type === "networkRequest" && playwrightCallbacks.onNetworkRequestCallbackId) {
523
538
  const promise = invokeClientCallback(connection, playwrightCallbacks.onNetworkRequestCallbackId, [event]).catch(() => {});
@@ -1462,6 +1477,115 @@ function handleStreamError(message, connection) {
1462
1477
  session.state = "closed";
1463
1478
  connection.activeStreams.delete(message.streamId);
1464
1479
  }
1480
+ const callbackReceiver = connection.callbackStreamReceivers.get(message.streamId);
1481
+ if (callbackReceiver && callbackReceiver.state === "active") {
1482
+ callbackReceiver.state = "errored";
1483
+ callbackReceiver.error = new Error(message.error);
1484
+ const resolvers = callbackReceiver.pullResolvers.splice(0);
1485
+ for (const resolver of resolvers) {
1486
+ resolver();
1487
+ }
1488
+ connection.callbackStreamReceivers.delete(message.streamId);
1489
+ }
1490
+ }
1491
+ function handleCallbackStreamStart(message, connection) {
1492
+ const receiver = {
1493
+ streamId: message.streamId,
1494
+ requestId: message.requestId,
1495
+ metadata: message.metadata,
1496
+ controller: null,
1497
+ state: "active",
1498
+ pendingChunks: [],
1499
+ pullResolvers: [],
1500
+ controllerFinalized: false
1501
+ };
1502
+ const readableStream = new ReadableStream({
1503
+ start(controller) {
1504
+ receiver.controller = controller;
1505
+ },
1506
+ pull(_controller) {
1507
+ if (receiver.controllerFinalized) {
1508
+ return;
1509
+ }
1510
+ if (receiver.pendingChunks.length > 0) {
1511
+ const chunk = receiver.pendingChunks.shift();
1512
+ receiver.controller.enqueue(chunk);
1513
+ return Promise.resolve();
1514
+ }
1515
+ if (receiver.state === "closed") {
1516
+ if (!receiver.controllerFinalized) {
1517
+ receiver.controllerFinalized = true;
1518
+ receiver.controller.close();
1519
+ }
1520
+ return Promise.resolve();
1521
+ }
1522
+ if (receiver.state === "errored") {
1523
+ if (!receiver.controllerFinalized && receiver.error) {
1524
+ receiver.controllerFinalized = true;
1525
+ receiver.controller.error(receiver.error);
1526
+ }
1527
+ return Promise.resolve();
1528
+ }
1529
+ return new Promise((resolve) => {
1530
+ receiver.pullResolvers.push(resolve);
1531
+ });
1532
+ },
1533
+ cancel(_reason) {
1534
+ receiver.state = "closed";
1535
+ receiver.controllerFinalized = true;
1536
+ const resolvers = receiver.pullResolvers.splice(0);
1537
+ for (const resolver of resolvers) {
1538
+ resolver();
1539
+ }
1540
+ connection.callbackStreamReceivers.delete(message.streamId);
1541
+ return Promise.resolve();
1542
+ }
1543
+ });
1544
+ connection.callbackStreamReceivers.set(message.streamId, receiver);
1545
+ const pending = connection.pendingCallbacks.get(message.requestId);
1546
+ if (pending) {
1547
+ connection.pendingCallbacks.delete(message.requestId);
1548
+ if (pending.timeoutId) {
1549
+ clearTimeout(pending.timeoutId);
1550
+ }
1551
+ const response = new Response(readableStream, {
1552
+ status: message.metadata.status,
1553
+ statusText: message.metadata.statusText,
1554
+ headers: message.metadata.headers
1555
+ });
1556
+ pending.resolve({ __streamingResponse: true, response });
1557
+ }
1558
+ }
1559
+ function handleCallbackStreamChunk(message, connection) {
1560
+ const receiver = connection.callbackStreamReceivers.get(message.streamId);
1561
+ if (receiver && receiver.state === "active") {
1562
+ if (receiver.pullResolvers.length > 0) {
1563
+ receiver.controller.enqueue(message.chunk);
1564
+ const resolver = receiver.pullResolvers.shift();
1565
+ resolver();
1566
+ } else {
1567
+ receiver.pendingChunks.push(message.chunk);
1568
+ }
1569
+ }
1570
+ }
1571
+ function handleCallbackStreamEnd(message, connection) {
1572
+ const receiver = connection.callbackStreamReceivers.get(message.streamId);
1573
+ if (receiver) {
1574
+ receiver.state = "closed";
1575
+ while (receiver.pendingChunks.length > 0) {
1576
+ const chunk = receiver.pendingChunks.shift();
1577
+ receiver.controller.enqueue(chunk);
1578
+ }
1579
+ if (!receiver.controllerFinalized) {
1580
+ receiver.controllerFinalized = true;
1581
+ receiver.controller.close();
1582
+ }
1583
+ const resolvers = receiver.pullResolvers.splice(0);
1584
+ for (const resolver of resolvers) {
1585
+ resolver();
1586
+ }
1587
+ connection.callbackStreamReceivers.delete(message.streamId);
1588
+ }
1465
1589
  }
1466
1590
  function waitForCredit(session) {
1467
1591
  return new Promise((resolve) => {
@@ -1686,4 +1810,4 @@ async function handleClearCollectedData(message, connection, state) {
1686
1810
  }
1687
1811
  }
1688
1812
 
1689
- //# debugId=C667CC1CB551E01464756E2164756E21
1813
+ //# debugId=DE5E35C70F14FD3964756E2164756E21