capnweb 0.7.0 → 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.
package/dist/index.d.cts CHANGED
@@ -1,2 +1,2 @@
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-C1na2_sM.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';
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
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-C1na2_sM.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';
package/dist/index.js CHANGED
@@ -68,6 +68,8 @@ function typeForRpc(value) {
68
68
  return "request";
69
69
  case Response.prototype:
70
70
  return "response";
71
+ case Blob.prototype:
72
+ return "blob";
71
73
  // TODO: All other structured clone types.
72
74
  case RpcStub.prototype:
73
75
  return "stub";
@@ -538,6 +540,7 @@ var RpcPayload = class _RpcPayload {
538
540
  case "bigint":
539
541
  case "date":
540
542
  case "bytes":
543
+ case "blob":
541
544
  case "error":
542
545
  case "undefined":
543
546
  return value;
@@ -774,6 +777,7 @@ var RpcPayload = class _RpcPayload {
774
777
  case "primitive":
775
778
  case "bigint":
776
779
  case "bytes":
780
+ case "blob":
777
781
  case "date":
778
782
  case "error":
779
783
  case "undefined":
@@ -876,6 +880,7 @@ var RpcPayload = class _RpcPayload {
876
880
  case "primitive":
877
881
  case "bigint":
878
882
  case "bytes":
883
+ case "blob":
879
884
  case "date":
880
885
  case "error":
881
886
  case "undefined":
@@ -967,6 +972,7 @@ function followPath(value, parent, path, owner) {
967
972
  case "primitive":
968
973
  case "bigint":
969
974
  case "bytes":
975
+ case "blob":
970
976
  case "date":
971
977
  case "error":
972
978
  case "headers":
@@ -1293,6 +1299,10 @@ var NullExporter = class {
1293
1299
  }
1294
1300
  };
1295
1301
  var NULL_EXPORTER = new NullExporter();
1302
+ async function streamToBlob(stream, type) {
1303
+ let b = await new Response(stream).blob();
1304
+ return b.type === type ? b : b.slice(0, b.size, type);
1305
+ }
1296
1306
  var ERROR_TYPES = {
1297
1307
  Error,
1298
1308
  EvalError,
@@ -1380,8 +1390,10 @@ var Devaluator = class _Devaluator {
1380
1390
  }
1381
1391
  case "bigint":
1382
1392
  return ["bigint", value.toString()];
1383
- case "date":
1384
- return ["date", value.getTime()];
1393
+ case "date": {
1394
+ const time = value.getTime();
1395
+ return ["date", Number.isNaN(time) ? null : time];
1396
+ }
1385
1397
  case "bytes": {
1386
1398
  let bytes = value;
1387
1399
  if (bytes.toBase64) {
@@ -1467,14 +1479,52 @@ var Devaluator = class _Devaluator {
1467
1479
  }
1468
1480
  return ["response", body, init];
1469
1481
  }
1482
+ case "blob": {
1483
+ let blob = value;
1484
+ let readable = blob.stream();
1485
+ let hook = streamImpl.createReadableStreamHook(readable);
1486
+ let importId = this.exporter.createPipe(readable, hook);
1487
+ return ["blob", blob.type, ["readable", importId]];
1488
+ }
1470
1489
  case "error": {
1471
1490
  let e = value;
1472
1491
  let rewritten = this.exporter.onSendError(e);
1473
1492
  if (rewritten) {
1474
1493
  e = rewritten;
1475
1494
  }
1495
+ let anyE = e;
1496
+ let props;
1497
+ let captureProp = (key, val) => {
1498
+ let exportsBefore = this.exports?.length ?? 0;
1499
+ try {
1500
+ let encoded = this.devaluateImpl(val, e, depth + 1);
1501
+ if (!props) props = {};
1502
+ props[key] = encoded;
1503
+ } catch (err) {
1504
+ if (this.exports && this.exports.length > exportsBefore) {
1505
+ let tail = this.exports.splice(exportsBefore);
1506
+ try {
1507
+ this.exporter.unexport(tail);
1508
+ } catch (err2) {
1509
+ }
1510
+ }
1511
+ }
1512
+ };
1513
+ for (let key of Object.keys(e)) {
1514
+ if (key === "name" || key === "message" || key === "stack") continue;
1515
+ captureProp(key, anyE[key]);
1516
+ }
1517
+ if ("cause" in e) {
1518
+ captureProp("cause", anyE.cause);
1519
+ }
1520
+ if (e instanceof AggregateError) {
1521
+ captureProp("errors", e.errors);
1522
+ }
1476
1523
  let result = ["error", e.name, e.message];
1477
- if (rewritten && rewritten.stack) {
1524
+ if (props) {
1525
+ result.push(rewritten && rewritten.stack ? rewritten.stack : null);
1526
+ result.push(props);
1527
+ } else if (rewritten && rewritten.stack) {
1478
1528
  result.push(rewritten.stack);
1479
1529
  }
1480
1530
  return result;
@@ -1574,6 +1624,12 @@ function fixBrokenRequestBody(request, body) {
1574
1624
  });
1575
1625
  return new RpcPromise(new PromiseStubHook(promise), []);
1576
1626
  }
1627
+ function streamToBlobPromise(stream, type) {
1628
+ let promise = streamToBlob(stream, type).then((blob) => {
1629
+ return new PayloadStubHook(RpcPayload.fromAppReturn(blob));
1630
+ });
1631
+ return new RpcPromise(new PromiseStubHook(promise), []);
1632
+ }
1577
1633
  var Evaluator = class _Evaluator {
1578
1634
  constructor(importer) {
1579
1635
  this.importer = importer;
@@ -1609,6 +1665,9 @@ var Evaluator = class _Evaluator {
1609
1665
  }
1610
1666
  break;
1611
1667
  case "date":
1668
+ if (value[1] === null) {
1669
+ return /* @__PURE__ */ new Date(NaN);
1670
+ }
1612
1671
  if (typeof value[1] == "number") {
1613
1672
  return new Date(value[1]);
1614
1673
  }
@@ -1634,10 +1693,22 @@ var Evaluator = class _Evaluator {
1634
1693
  case "error":
1635
1694
  if (value.length >= 3 && typeof value[1] === "string" && typeof value[2] === "string") {
1636
1695
  let cls = ERROR_TYPES[value[1]] || Error;
1637
- let result = new cls(value[2]);
1696
+ let result = cls === AggregateError ? new cls([], value[2]) : new cls(value[2]);
1638
1697
  if (typeof value[3] === "string") {
1639
1698
  result.stack = value[3];
1640
1699
  }
1700
+ if (value.length >= 5) {
1701
+ let props = value[4];
1702
+ if (!props || typeof props !== "object" || Array.isArray(props)) {
1703
+ break;
1704
+ }
1705
+ let anyResult = result;
1706
+ let propsObj = props;
1707
+ for (let key of Object.keys(propsObj)) {
1708
+ if (key === "name" || key === "message" || key === "stack") continue;
1709
+ anyResult[key] = this.evaluateImpl(propsObj[key], result, key);
1710
+ }
1711
+ }
1641
1712
  return result;
1642
1713
  }
1643
1714
  break;
@@ -1702,6 +1773,17 @@ var Evaluator = class _Evaluator {
1702
1773
  }
1703
1774
  return new Response(body, init);
1704
1775
  }
1776
+ case "blob": {
1777
+ if (value.length !== 3 || typeof value[1] !== "string") break;
1778
+ let contentType = value[1];
1779
+ let content = this.evaluateImpl(value[2], parent, property);
1780
+ if (!(content instanceof ReadableStream)) {
1781
+ throw new TypeError("Blob content must be serialized as a ReadableStream.");
1782
+ }
1783
+ let promise = streamToBlobPromise(content, contentType);
1784
+ this.promises.push({ promise, parent, property });
1785
+ return promise;
1786
+ }
1705
1787
  case "import":
1706
1788
  case "pipeline": {
1707
1789
  if (value.length < 2 || value.length > 4) {
@@ -2042,12 +2124,7 @@ var RpcSessionImpl = class {
2042
2124
  this.options = options;
2043
2125
  this.exports.push({ hook: mainHook, refcount: 1 });
2044
2126
  this.imports.push(new ImportTableEntry(this, 0, false));
2045
- let rejectFunc;
2046
- let abortPromise = new Promise((resolve, reject) => {
2047
- rejectFunc = reject;
2048
- });
2049
- this.cancelReadLoop = rejectFunc;
2050
- this.readLoop(abortPromise).catch((err) => this.abort(err));
2127
+ this.readLoop().catch((err) => this.abort(err));
2051
2128
  }
2052
2129
  exports = [];
2053
2130
  reverseExports = /* @__PURE__ */ new Map();
@@ -2331,7 +2408,8 @@ var RpcSessionImpl = class {
2331
2408
  }
2332
2409
  abort(error, trySendAbortMessage = true) {
2333
2410
  if (this.abortReason !== void 0) return;
2334
- this.cancelReadLoop(error);
2411
+ this.cancelReadLoop?.(error);
2412
+ this.cancelReadLoop = void 0;
2335
2413
  if (trySendAbortMessage) {
2336
2414
  try {
2337
2415
  this.transport.send(JSON.stringify(["abort", Devaluator.devaluate(error, void 0, this)])).catch((err) => {
@@ -2367,9 +2445,19 @@ var RpcSessionImpl = class {
2367
2445
  this.exports[i].hook.dispose();
2368
2446
  }
2369
2447
  }
2370
- async readLoop(abortPromise) {
2448
+ async readLoop() {
2371
2449
  while (!this.abortReason) {
2372
- let msg = JSON.parse(await Promise.race([this.transport.receive(), abortPromise]));
2450
+ let readCanceled = Promise.withResolvers();
2451
+ this.cancelReadLoop = readCanceled.reject;
2452
+ let msgText;
2453
+ try {
2454
+ msgText = await Promise.race([this.transport.receive(), readCanceled.promise]);
2455
+ } finally {
2456
+ if (this.cancelReadLoop === readCanceled.reject) {
2457
+ this.cancelReadLoop = void 0;
2458
+ }
2459
+ }
2460
+ let msg = JSON.parse(msgText);
2373
2461
  if (this.abortReason) break;
2374
2462
  if (msg instanceof Array) {
2375
2463
  switch (msg[0]) {