@ricsam/isolate-daemon 0.1.8 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-daemon",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "type": "commonjs"
5
5
  }
@@ -34,7 +34,8 @@ function handleConnection(socket, state) {
34
34
  nextCallbackId: 1,
35
35
  nextStreamId: 1,
36
36
  activeStreams: new Map,
37
- streamReceivers: new Map
37
+ streamReceivers: new Map,
38
+ callbackStreamReceivers: new Map
38
39
  };
39
40
  state.connections.set(socket, connection);
40
41
  const parser = createFrameParser();
@@ -195,6 +196,15 @@ async function handleMessage(message, connection, state) {
195
196
  case MessageType.STREAM_ERROR:
196
197
  handleStreamError(message, connection);
197
198
  break;
199
+ case MessageType.CALLBACK_STREAM_START:
200
+ handleCallbackStreamStart(message, connection);
201
+ break;
202
+ case MessageType.CALLBACK_STREAM_CHUNK:
203
+ handleCallbackStreamChunk(message, connection);
204
+ break;
205
+ case MessageType.CALLBACK_STREAM_END:
206
+ handleCallbackStreamEnd(message, connection);
207
+ break;
198
208
  default:
199
209
  sendError(connection.socket, message.requestId ?? 0, ErrorCode.UNKNOWN_MESSAGE_TYPE, `Unknown message type: ${message.type}`);
200
210
  }
@@ -386,7 +396,12 @@ async function handleCreateRuntime(message, connection, state) {
386
396
  throw new Error("Fetch callback not available");
387
397
  }
388
398
  const serialized = await serializeRequest(request);
389
- const result = await invokeClientCallback(conn, callbackId, [serialized]);
399
+ const result = await invokeClientCallback(conn, callbackId, [serialized], 60000);
400
+ if (result && typeof result === "object" && result.__streamingResponse) {
401
+ const response = result.response;
402
+ response.__isCallbackStream = true;
403
+ return response;
404
+ }
390
405
  return deserializeResponse(result);
391
406
  }
392
407
  },
@@ -1434,6 +1449,115 @@ function handleStreamError(message, connection) {
1434
1449
  session.state = "closed";
1435
1450
  connection.activeStreams.delete(message.streamId);
1436
1451
  }
1452
+ const callbackReceiver = connection.callbackStreamReceivers.get(message.streamId);
1453
+ if (callbackReceiver && callbackReceiver.state === "active") {
1454
+ callbackReceiver.state = "errored";
1455
+ callbackReceiver.error = new Error(message.error);
1456
+ const resolvers = callbackReceiver.pullResolvers.splice(0);
1457
+ for (const resolver of resolvers) {
1458
+ resolver();
1459
+ }
1460
+ connection.callbackStreamReceivers.delete(message.streamId);
1461
+ }
1462
+ }
1463
+ function handleCallbackStreamStart(message, connection) {
1464
+ const receiver = {
1465
+ streamId: message.streamId,
1466
+ requestId: message.requestId,
1467
+ metadata: message.metadata,
1468
+ controller: null,
1469
+ state: "active",
1470
+ pendingChunks: [],
1471
+ pullResolvers: [],
1472
+ controllerFinalized: false
1473
+ };
1474
+ const readableStream = new ReadableStream({
1475
+ start(controller) {
1476
+ receiver.controller = controller;
1477
+ },
1478
+ pull(_controller) {
1479
+ if (receiver.controllerFinalized) {
1480
+ return;
1481
+ }
1482
+ if (receiver.pendingChunks.length > 0) {
1483
+ const chunk = receiver.pendingChunks.shift();
1484
+ receiver.controller.enqueue(chunk);
1485
+ return Promise.resolve();
1486
+ }
1487
+ if (receiver.state === "closed") {
1488
+ if (!receiver.controllerFinalized) {
1489
+ receiver.controllerFinalized = true;
1490
+ receiver.controller.close();
1491
+ }
1492
+ return Promise.resolve();
1493
+ }
1494
+ if (receiver.state === "errored") {
1495
+ if (!receiver.controllerFinalized && receiver.error) {
1496
+ receiver.controllerFinalized = true;
1497
+ receiver.controller.error(receiver.error);
1498
+ }
1499
+ return Promise.resolve();
1500
+ }
1501
+ return new Promise((resolve) => {
1502
+ receiver.pullResolvers.push(resolve);
1503
+ });
1504
+ },
1505
+ cancel(_reason) {
1506
+ receiver.state = "closed";
1507
+ receiver.controllerFinalized = true;
1508
+ const resolvers = receiver.pullResolvers.splice(0);
1509
+ for (const resolver of resolvers) {
1510
+ resolver();
1511
+ }
1512
+ connection.callbackStreamReceivers.delete(message.streamId);
1513
+ return Promise.resolve();
1514
+ }
1515
+ });
1516
+ connection.callbackStreamReceivers.set(message.streamId, receiver);
1517
+ const pending = connection.pendingCallbacks.get(message.requestId);
1518
+ if (pending) {
1519
+ connection.pendingCallbacks.delete(message.requestId);
1520
+ if (pending.timeoutId) {
1521
+ clearTimeout(pending.timeoutId);
1522
+ }
1523
+ const response = new Response(readableStream, {
1524
+ status: message.metadata.status,
1525
+ statusText: message.metadata.statusText,
1526
+ headers: message.metadata.headers
1527
+ });
1528
+ pending.resolve({ __streamingResponse: true, response });
1529
+ }
1530
+ }
1531
+ function handleCallbackStreamChunk(message, connection) {
1532
+ const receiver = connection.callbackStreamReceivers.get(message.streamId);
1533
+ if (receiver && receiver.state === "active") {
1534
+ if (receiver.pullResolvers.length > 0) {
1535
+ receiver.controller.enqueue(message.chunk);
1536
+ const resolver = receiver.pullResolvers.shift();
1537
+ resolver();
1538
+ } else {
1539
+ receiver.pendingChunks.push(message.chunk);
1540
+ }
1541
+ }
1542
+ }
1543
+ function handleCallbackStreamEnd(message, connection) {
1544
+ const receiver = connection.callbackStreamReceivers.get(message.streamId);
1545
+ if (receiver) {
1546
+ receiver.state = "closed";
1547
+ while (receiver.pendingChunks.length > 0) {
1548
+ const chunk = receiver.pendingChunks.shift();
1549
+ receiver.controller.enqueue(chunk);
1550
+ }
1551
+ if (!receiver.controllerFinalized) {
1552
+ receiver.controllerFinalized = true;
1553
+ receiver.controller.close();
1554
+ }
1555
+ const resolvers = receiver.pullResolvers.splice(0);
1556
+ for (const resolver of resolvers) {
1557
+ resolver();
1558
+ }
1559
+ connection.callbackStreamReceivers.delete(message.streamId);
1560
+ }
1437
1561
  }
1438
1562
  function waitForCredit(session) {
1439
1563
  return new Promise((resolve) => {
@@ -1661,4 +1785,4 @@ export {
1661
1785
  handleConnection
1662
1786
  };
1663
1787
 
1664
- //# debugId=E63E520A2BD6529F64756E2164756E21
1788
+ //# debugId=9E949C5B88C72B2F64756E2164756E21