capnweb 0.6.1 → 0.8.0

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,2 +1,2 @@
1
- export { RpcCompatible, RpcPromise, RpcSession, RpcSessionOptions, RpcStub, RpcTarget, RpcTransport, deserialize, newHttpBatchRpcResponse, newHttpBatchRpcSession, newMessagePortRpcSession, newWebSocketRpcSession, newWorkersRpcResponse, newWorkersWebSocketRpcResponse, nodeHttpBatchRpcResponse, serialize } from './index.cjs';
1
+ export { c as RpcCompatible, e as RpcPromise, f as RpcSession, b as RpcSessionOptions, d as RpcStub, g as RpcTarget, R as RpcTransport, h as deserialize, n as newHttpBatchRpcResponse, i as newHttpBatchRpcSession, j as newMessagePortRpcSession, k as newWebSocketRpcSession, l as newWorkersRpcResponse, m as newWorkersWebSocketRpcResponse, o as nodeHttpBatchRpcResponse, s as serialize } from './index-workers-CiDKhXAE.cjs';
2
2
  import 'node:http';
@@ -1,2 +1,2 @@
1
- export { RpcCompatible, RpcPromise, RpcSession, RpcSessionOptions, RpcStub, RpcTarget, RpcTransport, deserialize, newHttpBatchRpcResponse, newHttpBatchRpcSession, newMessagePortRpcSession, newWebSocketRpcSession, newWorkersRpcResponse, newWorkersWebSocketRpcResponse, nodeHttpBatchRpcResponse, serialize } from './index.js';
1
+ export { c as RpcCompatible, e as RpcPromise, f as RpcSession, b as RpcSessionOptions, d as RpcStub, g as RpcTarget, R as RpcTransport, h as deserialize, n as newHttpBatchRpcResponse, i as newHttpBatchRpcSession, j as newMessagePortRpcSession, k as newWebSocketRpcSession, l as newWorkersRpcResponse, m as newWorkersWebSocketRpcResponse, o as nodeHttpBatchRpcResponse, s as serialize } from './index-workers-CiDKhXAE.js';
2
2
  import 'node:http';
@@ -71,6 +71,8 @@ function typeForRpc(value) {
71
71
  return "request";
72
72
  case Response.prototype:
73
73
  return "response";
74
+ case Blob.prototype:
75
+ return "blob";
74
76
  // TODO: All other structured clone types.
75
77
  case RpcStub.prototype:
76
78
  return "stub";
@@ -541,6 +543,7 @@ var RpcPayload = class _RpcPayload {
541
543
  case "bigint":
542
544
  case "date":
543
545
  case "bytes":
546
+ case "blob":
544
547
  case "error":
545
548
  case "undefined":
546
549
  return value;
@@ -777,6 +780,7 @@ var RpcPayload = class _RpcPayload {
777
780
  case "primitive":
778
781
  case "bigint":
779
782
  case "bytes":
783
+ case "blob":
780
784
  case "date":
781
785
  case "error":
782
786
  case "undefined":
@@ -879,6 +883,7 @@ var RpcPayload = class _RpcPayload {
879
883
  case "primitive":
880
884
  case "bigint":
881
885
  case "bytes":
886
+ case "blob":
882
887
  case "date":
883
888
  case "error":
884
889
  case "undefined":
@@ -970,6 +975,7 @@ function followPath(value, parent, path, owner) {
970
975
  case "primitive":
971
976
  case "bigint":
972
977
  case "bytes":
978
+ case "blob":
973
979
  case "date":
974
980
  case "error":
975
981
  case "headers":
@@ -1296,6 +1302,10 @@ var NullExporter = class {
1296
1302
  }
1297
1303
  };
1298
1304
  var NULL_EXPORTER = new NullExporter();
1305
+ async function streamToBlob(stream, type) {
1306
+ let b = await new Response(stream).blob();
1307
+ return b.type === type ? b : b.slice(0, b.size, type);
1308
+ }
1299
1309
  var ERROR_TYPES = {
1300
1310
  Error,
1301
1311
  EvalError,
@@ -1383,8 +1393,10 @@ var Devaluator = class _Devaluator {
1383
1393
  }
1384
1394
  case "bigint":
1385
1395
  return ["bigint", value.toString()];
1386
- case "date":
1387
- return ["date", value.getTime()];
1396
+ case "date": {
1397
+ const time = value.getTime();
1398
+ return ["date", Number.isNaN(time) ? null : time];
1399
+ }
1388
1400
  case "bytes": {
1389
1401
  let bytes = value;
1390
1402
  if (bytes.toBase64) {
@@ -1470,14 +1482,52 @@ var Devaluator = class _Devaluator {
1470
1482
  }
1471
1483
  return ["response", body, init];
1472
1484
  }
1485
+ case "blob": {
1486
+ let blob = value;
1487
+ let readable = blob.stream();
1488
+ let hook = streamImpl.createReadableStreamHook(readable);
1489
+ let importId = this.exporter.createPipe(readable, hook);
1490
+ return ["blob", blob.type, ["readable", importId]];
1491
+ }
1473
1492
  case "error": {
1474
1493
  let e = value;
1475
1494
  let rewritten = this.exporter.onSendError(e);
1476
1495
  if (rewritten) {
1477
1496
  e = rewritten;
1478
1497
  }
1498
+ let anyE = e;
1499
+ let props;
1500
+ let captureProp = (key, val) => {
1501
+ let exportsBefore = this.exports?.length ?? 0;
1502
+ try {
1503
+ let encoded = this.devaluateImpl(val, e, depth + 1);
1504
+ if (!props) props = {};
1505
+ props[key] = encoded;
1506
+ } catch (err) {
1507
+ if (this.exports && this.exports.length > exportsBefore) {
1508
+ let tail = this.exports.splice(exportsBefore);
1509
+ try {
1510
+ this.exporter.unexport(tail);
1511
+ } catch (err2) {
1512
+ }
1513
+ }
1514
+ }
1515
+ };
1516
+ for (let key of Object.keys(e)) {
1517
+ if (key === "name" || key === "message" || key === "stack") continue;
1518
+ captureProp(key, anyE[key]);
1519
+ }
1520
+ if ("cause" in e) {
1521
+ captureProp("cause", anyE.cause);
1522
+ }
1523
+ if (e instanceof AggregateError) {
1524
+ captureProp("errors", e.errors);
1525
+ }
1479
1526
  let result = ["error", e.name, e.message];
1480
- if (rewritten && rewritten.stack) {
1527
+ if (props) {
1528
+ result.push(rewritten && rewritten.stack ? rewritten.stack : null);
1529
+ result.push(props);
1530
+ } else if (rewritten && rewritten.stack) {
1481
1531
  result.push(rewritten.stack);
1482
1532
  }
1483
1533
  return result;
@@ -1577,6 +1627,12 @@ function fixBrokenRequestBody(request, body) {
1577
1627
  });
1578
1628
  return new RpcPromise(new PromiseStubHook(promise), []);
1579
1629
  }
1630
+ function streamToBlobPromise(stream, type) {
1631
+ let promise = streamToBlob(stream, type).then((blob) => {
1632
+ return new PayloadStubHook(RpcPayload.fromAppReturn(blob));
1633
+ });
1634
+ return new RpcPromise(new PromiseStubHook(promise), []);
1635
+ }
1580
1636
  var Evaluator = class _Evaluator {
1581
1637
  constructor(importer) {
1582
1638
  this.importer = importer;
@@ -1612,6 +1668,9 @@ var Evaluator = class _Evaluator {
1612
1668
  }
1613
1669
  break;
1614
1670
  case "date":
1671
+ if (value[1] === null) {
1672
+ return /* @__PURE__ */ new Date(NaN);
1673
+ }
1615
1674
  if (typeof value[1] == "number") {
1616
1675
  return new Date(value[1]);
1617
1676
  }
@@ -1637,10 +1696,22 @@ var Evaluator = class _Evaluator {
1637
1696
  case "error":
1638
1697
  if (value.length >= 3 && typeof value[1] === "string" && typeof value[2] === "string") {
1639
1698
  let cls = ERROR_TYPES[value[1]] || Error;
1640
- let result = new cls(value[2]);
1699
+ let result = cls === AggregateError ? new cls([], value[2]) : new cls(value[2]);
1641
1700
  if (typeof value[3] === "string") {
1642
1701
  result.stack = value[3];
1643
1702
  }
1703
+ if (value.length >= 5) {
1704
+ let props = value[4];
1705
+ if (!props || typeof props !== "object" || Array.isArray(props)) {
1706
+ break;
1707
+ }
1708
+ let anyResult = result;
1709
+ let propsObj = props;
1710
+ for (let key of Object.keys(propsObj)) {
1711
+ if (key === "name" || key === "message" || key === "stack") continue;
1712
+ anyResult[key] = this.evaluateImpl(propsObj[key], result, key);
1713
+ }
1714
+ }
1644
1715
  return result;
1645
1716
  }
1646
1717
  break;
@@ -1705,6 +1776,17 @@ var Evaluator = class _Evaluator {
1705
1776
  }
1706
1777
  return new Response(body, init);
1707
1778
  }
1779
+ case "blob": {
1780
+ if (value.length !== 3 || typeof value[1] !== "string") break;
1781
+ let contentType = value[1];
1782
+ let content = this.evaluateImpl(value[2], parent, property);
1783
+ if (!(content instanceof ReadableStream)) {
1784
+ throw new TypeError("Blob content must be serialized as a ReadableStream.");
1785
+ }
1786
+ let promise = streamToBlobPromise(content, contentType);
1787
+ this.promises.push({ promise, parent, property });
1788
+ return promise;
1789
+ }
1708
1790
  case "import":
1709
1791
  case "pipeline": {
1710
1792
  if (value.length < 2 || value.length > 4) {
@@ -2045,12 +2127,7 @@ var RpcSessionImpl = class {
2045
2127
  this.options = options;
2046
2128
  this.exports.push({ hook: mainHook, refcount: 1 });
2047
2129
  this.imports.push(new ImportTableEntry(this, 0, false));
2048
- let rejectFunc;
2049
- let abortPromise = new Promise((resolve, reject) => {
2050
- rejectFunc = reject;
2051
- });
2052
- this.cancelReadLoop = rejectFunc;
2053
- this.readLoop(abortPromise).catch((err) => this.abort(err));
2130
+ this.readLoop().catch((err) => this.abort(err));
2054
2131
  }
2055
2132
  exports = [];
2056
2133
  reverseExports = /* @__PURE__ */ new Map();
@@ -2334,7 +2411,8 @@ var RpcSessionImpl = class {
2334
2411
  }
2335
2412
  abort(error, trySendAbortMessage = true) {
2336
2413
  if (this.abortReason !== void 0) return;
2337
- this.cancelReadLoop(error);
2414
+ this.cancelReadLoop?.(error);
2415
+ this.cancelReadLoop = void 0;
2338
2416
  if (trySendAbortMessage) {
2339
2417
  try {
2340
2418
  this.transport.send(JSON.stringify(["abort", Devaluator.devaluate(error, void 0, this)])).catch((err) => {
@@ -2370,9 +2448,19 @@ var RpcSessionImpl = class {
2370
2448
  this.exports[i].hook.dispose();
2371
2449
  }
2372
2450
  }
2373
- async readLoop(abortPromise) {
2451
+ async readLoop() {
2374
2452
  while (!this.abortReason) {
2375
- let msg = JSON.parse(await Promise.race([this.transport.receive(), abortPromise]));
2453
+ let readCanceled = Promise.withResolvers();
2454
+ this.cancelReadLoop = readCanceled.reject;
2455
+ let msgText;
2456
+ try {
2457
+ msgText = await Promise.race([this.transport.receive(), readCanceled.promise]);
2458
+ } finally {
2459
+ if (this.cancelReadLoop === readCanceled.reject) {
2460
+ this.cancelReadLoop = void 0;
2461
+ }
2462
+ }
2463
+ let msg = JSON.parse(msgText);
2376
2464
  if (this.abortReason) break;
2377
2465
  if (msg instanceof Array) {
2378
2466
  switch (msg[0]) {