@vastblast/capnweb 0.4.2 → 0.5.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.js CHANGED
@@ -60,6 +60,12 @@ function typeForRpc(value) {
60
60
  return "writable";
61
61
  case ReadableStream.prototype:
62
62
  return "readable";
63
+ case Headers.prototype:
64
+ return "headers";
65
+ case Request.prototype:
66
+ return "request";
67
+ case Response.prototype:
68
+ return "response";
63
69
  // TODO: All other structured clone types.
64
70
  case RpcStub.prototype:
65
71
  return "stub";
@@ -613,6 +619,22 @@ var RpcPayload = class _RpcPayload {
613
619
  this.hooks.push(hook);
614
620
  return stream;
615
621
  }
622
+ case "headers":
623
+ return new Headers(value);
624
+ case "request": {
625
+ let req = value;
626
+ if (req.body) {
627
+ this.deepCopy(req.body, req, "body", req, dupStubs, owner);
628
+ }
629
+ return new Request(req);
630
+ }
631
+ case "response": {
632
+ let resp = value;
633
+ if (resp.body) {
634
+ this.deepCopy(resp.body, resp, "body", resp, dupStubs, owner);
635
+ }
636
+ return new Response(resp.body, resp);
637
+ }
616
638
  default:
617
639
  throw new Error("unreachable");
618
640
  }
@@ -792,6 +814,18 @@ var RpcPayload = class _RpcPayload {
792
814
  }
793
815
  case "rpc-thenable":
794
816
  return;
817
+ case "headers":
818
+ return;
819
+ case "request": {
820
+ let req = value;
821
+ if (req.body) this.disposeImpl(req.body, req);
822
+ return;
823
+ }
824
+ case "response": {
825
+ let resp = value;
826
+ if (resp.body) this.disposeImpl(resp.body, resp);
827
+ return;
828
+ }
795
829
  case "writable": {
796
830
  let stream = value;
797
831
  let hook = this.rpcTargets?.get(stream);
@@ -847,6 +881,9 @@ var RpcPayload = class _RpcPayload {
847
881
  case "rpc-target":
848
882
  case "writable":
849
883
  case "readable":
884
+ case "headers":
885
+ case "request":
886
+ case "response":
850
887
  return;
851
888
  case "array": {
852
889
  let array = value;
@@ -930,6 +967,9 @@ function followPath(value, parent, path, owner) {
930
967
  case "bytes":
931
968
  case "date":
932
969
  case "error":
970
+ case "headers":
971
+ case "request":
972
+ case "response":
933
973
  value = void 0;
934
974
  break;
935
975
  case "undefined":
@@ -1351,6 +1391,73 @@ var Devaluator = class _Devaluator {
1351
1391
  ];
1352
1392
  }
1353
1393
  }
1394
+ case "headers":
1395
+ return ["headers", [...value]];
1396
+ case "request": {
1397
+ let req = value;
1398
+ let init = {};
1399
+ if (req.method !== "GET") init.method = req.method;
1400
+ let headers = [...req.headers];
1401
+ if (headers.length > 0) {
1402
+ init.headers = headers;
1403
+ }
1404
+ if (req.body) {
1405
+ init.body = this.devaluateImpl(req.body, req, depth + 1);
1406
+ init.duplex = req.duplex || "half";
1407
+ } else if (req.body === void 0 && !["GET", "HEAD", "OPTIONS", "TRACE", "DELETE"].includes(req.method)) {
1408
+ let bodyPromise = req.arrayBuffer();
1409
+ let readable = new ReadableStream({
1410
+ async start(controller) {
1411
+ try {
1412
+ controller.enqueue(new Uint8Array(await bodyPromise));
1413
+ controller.close();
1414
+ } catch (err) {
1415
+ controller.error(err);
1416
+ }
1417
+ }
1418
+ });
1419
+ let hook = streamImpl.createReadableStreamHook(readable);
1420
+ let importId = this.exporter.createPipe(readable, hook);
1421
+ init.body = ["readable", importId];
1422
+ init.duplex = req.duplex || "half";
1423
+ }
1424
+ if (req.cache && req.cache !== "default") init.cache = req.cache;
1425
+ if (req.redirect !== "follow") init.redirect = req.redirect;
1426
+ if (req.integrity) init.integrity = req.integrity;
1427
+ if (req.mode && req.mode !== "cors") init.mode = req.mode;
1428
+ if (req.credentials && req.credentials !== "same-origin") {
1429
+ init.credentials = req.credentials;
1430
+ }
1431
+ if (req.referrer && req.referrer !== "about:client") init.referrer = req.referrer;
1432
+ if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy;
1433
+ if (req.keepalive) init.keepalive = req.keepalive;
1434
+ let cfReq = req;
1435
+ if (cfReq.cf) init.cf = cfReq.cf;
1436
+ if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== "automatic") {
1437
+ init.encodeResponseBody = cfReq.encodeResponseBody;
1438
+ }
1439
+ return ["request", req.url, init];
1440
+ }
1441
+ case "response": {
1442
+ let resp = value;
1443
+ let body = this.devaluateImpl(resp.body, resp, depth + 1);
1444
+ let init = {};
1445
+ if (resp.status !== 200) init.status = resp.status;
1446
+ if (resp.statusText) init.statusText = resp.statusText;
1447
+ let headers = [...resp.headers];
1448
+ if (headers.length > 0) {
1449
+ init.headers = headers;
1450
+ }
1451
+ let cfResp = resp;
1452
+ if (cfResp.cf) init.cf = cfResp.cf;
1453
+ if (cfResp.encodeBody && cfResp.encodeBody !== "automatic") {
1454
+ init.encodeBody = cfResp.encodeBody;
1455
+ }
1456
+ if (cfResp.webSocket) {
1457
+ throw new TypeError("Can't serialize a Response containing a webSocket.");
1458
+ }
1459
+ return ["response", body, init];
1460
+ }
1354
1461
  case "error": {
1355
1462
  let e = value;
1356
1463
  let rewritten = this.exporter.onSendError(e);
@@ -1450,6 +1557,14 @@ var NullImporter = class {
1450
1557
  }
1451
1558
  };
1452
1559
  var NULL_IMPORTER = new NullImporter();
1560
+ function fixBrokenRequestBody(request, body) {
1561
+ let promise = new Response(body).arrayBuffer().then((arrayBuffer) => {
1562
+ let bytes = new Uint8Array(arrayBuffer);
1563
+ let result = new Request(request, { body: bytes });
1564
+ return new PayloadStubHook(RpcPayload.fromAppReturn(result));
1565
+ });
1566
+ return new RpcPromise(new PromiseStubHook(promise), []);
1567
+ }
1453
1568
  var Evaluator = class _Evaluator {
1454
1569
  constructor(importer) {
1455
1570
  this.importer = importer;
@@ -1527,6 +1642,56 @@ var Evaluator = class _Evaluator {
1527
1642
  return -Infinity;
1528
1643
  case "nan":
1529
1644
  return NaN;
1645
+ case "headers":
1646
+ if (value.length === 2 && value[1] instanceof Array) {
1647
+ return new Headers(value[1]);
1648
+ }
1649
+ break;
1650
+ case "request": {
1651
+ if (value.length !== 3 || typeof value[1] !== "string") break;
1652
+ let url = value[1];
1653
+ let init = value[2];
1654
+ if (typeof init !== "object" || init === null) break;
1655
+ if (init.body) {
1656
+ init.body = this.evaluateImpl(init.body, init, "body");
1657
+ if (init.body === null || typeof init.body === "string" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ; else {
1658
+ throw new TypeError("Request body must be of type ReadableStream.");
1659
+ }
1660
+ }
1661
+ if (init.signal) {
1662
+ init.signal = this.evaluateImpl(init.signal, init, "signal");
1663
+ if (!(init.signal instanceof AbortSignal)) {
1664
+ throw new TypeError("Request siganl must be of type AbortSignal.");
1665
+ }
1666
+ }
1667
+ if (init.headers && !(init.headers instanceof Array)) {
1668
+ throw new TypeError("Request headers must be serialized as an array of pairs.");
1669
+ }
1670
+ let result = new Request(url, init);
1671
+ if (init.body instanceof ReadableStream && result.body === void 0) {
1672
+ let promise = fixBrokenRequestBody(result, init.body);
1673
+ this.promises.push({ promise, parent, property });
1674
+ return promise;
1675
+ } else {
1676
+ return result;
1677
+ }
1678
+ }
1679
+ case "response": {
1680
+ if (value.length !== 3) break;
1681
+ let body = this.evaluateImpl(value[1], parent, property);
1682
+ if (body === null || typeof body === "string" || body instanceof Uint8Array || body instanceof ReadableStream) ; else {
1683
+ throw new TypeError("Response body must be of type ReadableStream.");
1684
+ }
1685
+ let init = value[2];
1686
+ if (typeof init !== "object" || init === null) break;
1687
+ if (init.webSocket) {
1688
+ throw new TypeError("Can't deserialize a Response containing a webSocket.");
1689
+ }
1690
+ if (init.headers && !(init.headers instanceof Array)) {
1691
+ throw new TypeError("Request headers must be serialized as an array of pairs.");
1692
+ }
1693
+ return new Response(body, init);
1694
+ }
1530
1695
  case "import":
1531
1696
  case "pipeline": {
1532
1697
  if (value.length < 2 || value.length > 4) {