capnweb 0.0.0-c2bb17b → 0.0.0-cfa1b95

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.cjs CHANGED
@@ -26,6 +26,7 @@ var RpcTarget = workersModule ? workersModule.RpcTarget : class {
26
26
  };
27
27
  var AsyncFunction = (async function() {
28
28
  }).constructor;
29
+ var BUFFER_PROTOTYPE = typeof Buffer !== "undefined" ? Buffer.prototype : void 0;
29
30
  function typeForRpc(value) {
30
31
  switch (typeof value) {
31
32
  case "boolean":
@@ -57,11 +58,18 @@ function typeForRpc(value) {
57
58
  case Date.prototype:
58
59
  return "date";
59
60
  case Uint8Array.prototype:
61
+ case BUFFER_PROTOTYPE:
60
62
  return "bytes";
61
63
  case WritableStream.prototype:
62
64
  return "writable";
63
65
  case ReadableStream.prototype:
64
66
  return "readable";
67
+ case Headers.prototype:
68
+ return "headers";
69
+ case Request.prototype:
70
+ return "request";
71
+ case Response.prototype:
72
+ return "response";
65
73
  // TODO: All other structured clone types.
66
74
  case RpcStub.prototype:
67
75
  return "stub";
@@ -615,6 +623,22 @@ var RpcPayload = class _RpcPayload {
615
623
  this.hooks.push(hook);
616
624
  return stream;
617
625
  }
626
+ case "headers":
627
+ return new Headers(value);
628
+ case "request": {
629
+ let req = value;
630
+ if (req.body) {
631
+ this.deepCopy(req.body, req, "body", req, dupStubs, owner);
632
+ }
633
+ return new Request(req);
634
+ }
635
+ case "response": {
636
+ let resp = value;
637
+ if (resp.body) {
638
+ this.deepCopy(resp.body, resp, "body", resp, dupStubs, owner);
639
+ }
640
+ return new Response(resp.body, resp);
641
+ }
618
642
  default:
619
643
  throw new Error("unreachable");
620
644
  }
@@ -794,6 +818,18 @@ var RpcPayload = class _RpcPayload {
794
818
  }
795
819
  case "rpc-thenable":
796
820
  return;
821
+ case "headers":
822
+ return;
823
+ case "request": {
824
+ let req = value;
825
+ if (req.body) this.disposeImpl(req.body, req);
826
+ return;
827
+ }
828
+ case "response": {
829
+ let resp = value;
830
+ if (resp.body) this.disposeImpl(resp.body, resp);
831
+ return;
832
+ }
797
833
  case "writable": {
798
834
  let stream = value;
799
835
  let hook = this.rpcTargets?.get(stream);
@@ -849,6 +885,9 @@ var RpcPayload = class _RpcPayload {
849
885
  case "rpc-target":
850
886
  case "writable":
851
887
  case "readable":
888
+ case "headers":
889
+ case "request":
890
+ case "response":
852
891
  return;
853
892
  case "array": {
854
893
  let array = value;
@@ -932,6 +971,9 @@ function followPath(value, parent, path, owner) {
932
971
  case "bytes":
933
972
  case "date":
934
973
  case "error":
974
+ case "headers":
975
+ case "request":
976
+ case "response":
935
977
  value = void 0;
936
978
  break;
937
979
  case "undefined":
@@ -1346,12 +1388,86 @@ var Devaluator = class _Devaluator {
1346
1388
  let bytes = value;
1347
1389
  if (bytes.toBase64) {
1348
1390
  return ["bytes", bytes.toBase64({ omitPadding: true })];
1349
- } else {
1350
- return [
1351
- "bytes",
1352
- btoa(String.fromCharCode.apply(null, bytes).replace(/=*$/, ""))
1353
- ];
1354
1391
  }
1392
+ let b64;
1393
+ if (typeof Buffer !== "undefined") {
1394
+ let buf = bytes instanceof Buffer ? bytes : Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
1395
+ b64 = buf.toString("base64");
1396
+ } else {
1397
+ let binary = "";
1398
+ for (let i = 0; i < bytes.length; i++) {
1399
+ binary += String.fromCharCode(bytes[i]);
1400
+ }
1401
+ b64 = btoa(binary);
1402
+ }
1403
+ return ["bytes", b64.replace(/=+$/, "")];
1404
+ }
1405
+ case "headers":
1406
+ return ["headers", [...value]];
1407
+ case "request": {
1408
+ let req = value;
1409
+ let init = {};
1410
+ if (req.method !== "GET") init.method = req.method;
1411
+ let headers = [...req.headers];
1412
+ if (headers.length > 0) {
1413
+ init.headers = headers;
1414
+ }
1415
+ if (req.body) {
1416
+ init.body = this.devaluateImpl(req.body, req, depth + 1);
1417
+ init.duplex = req.duplex || "half";
1418
+ } else if (req.body === void 0 && !["GET", "HEAD", "OPTIONS", "TRACE", "DELETE"].includes(req.method)) {
1419
+ let bodyPromise = req.arrayBuffer();
1420
+ let readable = new ReadableStream({
1421
+ async start(controller) {
1422
+ try {
1423
+ controller.enqueue(new Uint8Array(await bodyPromise));
1424
+ controller.close();
1425
+ } catch (err) {
1426
+ controller.error(err);
1427
+ }
1428
+ }
1429
+ });
1430
+ let hook = streamImpl.createReadableStreamHook(readable);
1431
+ let importId = this.exporter.createPipe(readable, hook);
1432
+ init.body = ["readable", importId];
1433
+ init.duplex = req.duplex || "half";
1434
+ }
1435
+ if (req.cache && req.cache !== "default") init.cache = req.cache;
1436
+ if (req.redirect !== "follow") init.redirect = req.redirect;
1437
+ if (req.integrity) init.integrity = req.integrity;
1438
+ if (req.mode && req.mode !== "cors") init.mode = req.mode;
1439
+ if (req.credentials && req.credentials !== "same-origin") {
1440
+ init.credentials = req.credentials;
1441
+ }
1442
+ if (req.referrer && req.referrer !== "about:client") init.referrer = req.referrer;
1443
+ if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy;
1444
+ if (req.keepalive) init.keepalive = req.keepalive;
1445
+ let cfReq = req;
1446
+ if (cfReq.cf) init.cf = cfReq.cf;
1447
+ if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== "automatic") {
1448
+ init.encodeResponseBody = cfReq.encodeResponseBody;
1449
+ }
1450
+ return ["request", req.url, init];
1451
+ }
1452
+ case "response": {
1453
+ let resp = value;
1454
+ let body = this.devaluateImpl(resp.body, resp, depth + 1);
1455
+ let init = {};
1456
+ if (resp.status !== 200) init.status = resp.status;
1457
+ if (resp.statusText) init.statusText = resp.statusText;
1458
+ let headers = [...resp.headers];
1459
+ if (headers.length > 0) {
1460
+ init.headers = headers;
1461
+ }
1462
+ let cfResp = resp;
1463
+ if (cfResp.cf) init.cf = cfResp.cf;
1464
+ if (cfResp.encodeBody && cfResp.encodeBody !== "automatic") {
1465
+ init.encodeBody = cfResp.encodeBody;
1466
+ }
1467
+ if (cfResp.webSocket) {
1468
+ throw new TypeError("Can't serialize a Response containing a webSocket.");
1469
+ }
1470
+ return ["response", body, init];
1355
1471
  }
1356
1472
  case "error": {
1357
1473
  let e = value;
@@ -1452,6 +1568,14 @@ var NullImporter = class {
1452
1568
  }
1453
1569
  };
1454
1570
  var NULL_IMPORTER = new NullImporter();
1571
+ function fixBrokenRequestBody(request, body) {
1572
+ let promise = new Response(body).arrayBuffer().then((arrayBuffer) => {
1573
+ let bytes = new Uint8Array(arrayBuffer);
1574
+ let result = new Request(request, { body: bytes });
1575
+ return new PayloadStubHook(RpcPayload.fromAppReturn(result));
1576
+ });
1577
+ return new RpcPromise(new PromiseStubHook(promise), []);
1578
+ }
1455
1579
  var Evaluator = class _Evaluator {
1456
1580
  constructor(importer) {
1457
1581
  this.importer = importer;
@@ -1492,10 +1616,11 @@ var Evaluator = class _Evaluator {
1492
1616
  }
1493
1617
  break;
1494
1618
  case "bytes": {
1495
- let b64 = Uint8Array;
1496
1619
  if (typeof value[1] == "string") {
1497
- if (b64.fromBase64) {
1498
- return b64.fromBase64(value[1]);
1620
+ if (typeof Buffer !== "undefined") {
1621
+ return Buffer.from(value[1], "base64");
1622
+ } else if (Uint8Array.fromBase64) {
1623
+ return Uint8Array.fromBase64(value[1]);
1499
1624
  } else {
1500
1625
  let bs = atob(value[1]);
1501
1626
  let len = bs.length;
@@ -1529,6 +1654,56 @@ var Evaluator = class _Evaluator {
1529
1654
  return -Infinity;
1530
1655
  case "nan":
1531
1656
  return NaN;
1657
+ case "headers":
1658
+ if (value.length === 2 && value[1] instanceof Array) {
1659
+ return new Headers(value[1]);
1660
+ }
1661
+ break;
1662
+ case "request": {
1663
+ if (value.length !== 3 || typeof value[1] !== "string") break;
1664
+ let url = value[1];
1665
+ let init = value[2];
1666
+ if (typeof init !== "object" || init === null) break;
1667
+ if (init.body) {
1668
+ init.body = this.evaluateImpl(init.body, init, "body");
1669
+ if (init.body === null || typeof init.body === "string" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ; else {
1670
+ throw new TypeError("Request body must be of type ReadableStream.");
1671
+ }
1672
+ }
1673
+ if (init.signal) {
1674
+ init.signal = this.evaluateImpl(init.signal, init, "signal");
1675
+ if (!(init.signal instanceof AbortSignal)) {
1676
+ throw new TypeError("Request siganl must be of type AbortSignal.");
1677
+ }
1678
+ }
1679
+ if (init.headers && !(init.headers instanceof Array)) {
1680
+ throw new TypeError("Request headers must be serialized as an array of pairs.");
1681
+ }
1682
+ let result = new Request(url, init);
1683
+ if (init.body instanceof ReadableStream && result.body === void 0) {
1684
+ let promise = fixBrokenRequestBody(result, init.body);
1685
+ this.promises.push({ promise, parent, property });
1686
+ return promise;
1687
+ } else {
1688
+ return result;
1689
+ }
1690
+ }
1691
+ case "response": {
1692
+ if (value.length !== 3) break;
1693
+ let body = this.evaluateImpl(value[1], parent, property);
1694
+ if (body === null || typeof body === "string" || body instanceof Uint8Array || body instanceof ReadableStream) ; else {
1695
+ throw new TypeError("Response body must be of type ReadableStream.");
1696
+ }
1697
+ let init = value[2];
1698
+ if (typeof init !== "object" || init === null) break;
1699
+ if (init.webSocket) {
1700
+ throw new TypeError("Can't deserialize a Response containing a webSocket.");
1701
+ }
1702
+ if (init.headers && !(init.headers instanceof Array)) {
1703
+ throw new TypeError("Request headers must be serialized as an array of pairs.");
1704
+ }
1705
+ return new Response(body, init);
1706
+ }
1532
1707
  case "import":
1533
1708
  case "pipeline": {
1534
1709
  if (value.length < 2 || value.length > 4) {