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/README.md +1 -1
- package/dist/index-workers.cjs +183 -8
- package/dist/index-workers.cjs.map +1 -1
- package/dist/index-workers.js +183 -8
- package/dist/index-workers.js.map +1 -1
- package/dist/index.cjs +183 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +88 -16
- package/dist/index.d.ts +88 -16
- package/dist/index.js +183 -8
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -202,12 +202,12 @@ The following types can be passed over RPC (in arguments or return values), and
|
|
|
202
202
|
* `Uint8Array`
|
|
203
203
|
* `Error` and its well-known subclasses
|
|
204
204
|
* `ReadableStream` and `WritableStream`, with automatic flow control.
|
|
205
|
+
* `Headers`, `Request`, and `Response` from the Fetch API.
|
|
205
206
|
|
|
206
207
|
The following types are not supported as of this writing, but may be added in the future:
|
|
207
208
|
* `Map` and `Set`
|
|
208
209
|
* `ArrayBuffer` and typed arrays other than `Uint8Array`
|
|
209
210
|
* `RegExp`
|
|
210
|
-
* `Headers`, `Request`, and `Response`
|
|
211
211
|
|
|
212
212
|
The following are intentionally NOT supported:
|
|
213
213
|
* Application-defined classes that do not extend `RpcTarget`.
|
package/dist/index-workers.cjs
CHANGED
|
@@ -49,6 +49,7 @@ var RpcTarget = workersModule ? workersModule.RpcTarget : class {
|
|
|
49
49
|
};
|
|
50
50
|
var AsyncFunction = (async function() {
|
|
51
51
|
}).constructor;
|
|
52
|
+
var BUFFER_PROTOTYPE = typeof Buffer !== "undefined" ? Buffer.prototype : void 0;
|
|
52
53
|
function typeForRpc(value) {
|
|
53
54
|
switch (typeof value) {
|
|
54
55
|
case "boolean":
|
|
@@ -80,11 +81,18 @@ function typeForRpc(value) {
|
|
|
80
81
|
case Date.prototype:
|
|
81
82
|
return "date";
|
|
82
83
|
case Uint8Array.prototype:
|
|
84
|
+
case BUFFER_PROTOTYPE:
|
|
83
85
|
return "bytes";
|
|
84
86
|
case WritableStream.prototype:
|
|
85
87
|
return "writable";
|
|
86
88
|
case ReadableStream.prototype:
|
|
87
89
|
return "readable";
|
|
90
|
+
case Headers.prototype:
|
|
91
|
+
return "headers";
|
|
92
|
+
case Request.prototype:
|
|
93
|
+
return "request";
|
|
94
|
+
case Response.prototype:
|
|
95
|
+
return "response";
|
|
88
96
|
// TODO: All other structured clone types.
|
|
89
97
|
case RpcStub.prototype:
|
|
90
98
|
return "stub";
|
|
@@ -638,6 +646,22 @@ var RpcPayload = class _RpcPayload {
|
|
|
638
646
|
this.hooks.push(hook);
|
|
639
647
|
return stream;
|
|
640
648
|
}
|
|
649
|
+
case "headers":
|
|
650
|
+
return new Headers(value);
|
|
651
|
+
case "request": {
|
|
652
|
+
let req = value;
|
|
653
|
+
if (req.body) {
|
|
654
|
+
this.deepCopy(req.body, req, "body", req, dupStubs, owner);
|
|
655
|
+
}
|
|
656
|
+
return new Request(req);
|
|
657
|
+
}
|
|
658
|
+
case "response": {
|
|
659
|
+
let resp = value;
|
|
660
|
+
if (resp.body) {
|
|
661
|
+
this.deepCopy(resp.body, resp, "body", resp, dupStubs, owner);
|
|
662
|
+
}
|
|
663
|
+
return new Response(resp.body, resp);
|
|
664
|
+
}
|
|
641
665
|
default:
|
|
642
666
|
throw new Error("unreachable");
|
|
643
667
|
}
|
|
@@ -817,6 +841,18 @@ var RpcPayload = class _RpcPayload {
|
|
|
817
841
|
}
|
|
818
842
|
case "rpc-thenable":
|
|
819
843
|
return;
|
|
844
|
+
case "headers":
|
|
845
|
+
return;
|
|
846
|
+
case "request": {
|
|
847
|
+
let req = value;
|
|
848
|
+
if (req.body) this.disposeImpl(req.body, req);
|
|
849
|
+
return;
|
|
850
|
+
}
|
|
851
|
+
case "response": {
|
|
852
|
+
let resp = value;
|
|
853
|
+
if (resp.body) this.disposeImpl(resp.body, resp);
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
820
856
|
case "writable": {
|
|
821
857
|
let stream = value;
|
|
822
858
|
let hook = this.rpcTargets?.get(stream);
|
|
@@ -872,6 +908,9 @@ var RpcPayload = class _RpcPayload {
|
|
|
872
908
|
case "rpc-target":
|
|
873
909
|
case "writable":
|
|
874
910
|
case "readable":
|
|
911
|
+
case "headers":
|
|
912
|
+
case "request":
|
|
913
|
+
case "response":
|
|
875
914
|
return;
|
|
876
915
|
case "array": {
|
|
877
916
|
let array = value;
|
|
@@ -955,6 +994,9 @@ function followPath(value, parent, path, owner) {
|
|
|
955
994
|
case "bytes":
|
|
956
995
|
case "date":
|
|
957
996
|
case "error":
|
|
997
|
+
case "headers":
|
|
998
|
+
case "request":
|
|
999
|
+
case "response":
|
|
958
1000
|
value = void 0;
|
|
959
1001
|
break;
|
|
960
1002
|
case "undefined":
|
|
@@ -1369,12 +1411,86 @@ var Devaluator = class _Devaluator {
|
|
|
1369
1411
|
let bytes = value;
|
|
1370
1412
|
if (bytes.toBase64) {
|
|
1371
1413
|
return ["bytes", bytes.toBase64({ omitPadding: true })];
|
|
1372
|
-
} else {
|
|
1373
|
-
return [
|
|
1374
|
-
"bytes",
|
|
1375
|
-
btoa(String.fromCharCode.apply(null, bytes).replace(/=*$/, ""))
|
|
1376
|
-
];
|
|
1377
1414
|
}
|
|
1415
|
+
let b64;
|
|
1416
|
+
if (typeof Buffer !== "undefined") {
|
|
1417
|
+
let buf = bytes instanceof Buffer ? bytes : Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
1418
|
+
b64 = buf.toString("base64");
|
|
1419
|
+
} else {
|
|
1420
|
+
let binary = "";
|
|
1421
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
1422
|
+
binary += String.fromCharCode(bytes[i]);
|
|
1423
|
+
}
|
|
1424
|
+
b64 = btoa(binary);
|
|
1425
|
+
}
|
|
1426
|
+
return ["bytes", b64.replace(/=+$/, "")];
|
|
1427
|
+
}
|
|
1428
|
+
case "headers":
|
|
1429
|
+
return ["headers", [...value]];
|
|
1430
|
+
case "request": {
|
|
1431
|
+
let req = value;
|
|
1432
|
+
let init = {};
|
|
1433
|
+
if (req.method !== "GET") init.method = req.method;
|
|
1434
|
+
let headers = [...req.headers];
|
|
1435
|
+
if (headers.length > 0) {
|
|
1436
|
+
init.headers = headers;
|
|
1437
|
+
}
|
|
1438
|
+
if (req.body) {
|
|
1439
|
+
init.body = this.devaluateImpl(req.body, req, depth + 1);
|
|
1440
|
+
init.duplex = req.duplex || "half";
|
|
1441
|
+
} else if (req.body === void 0 && !["GET", "HEAD", "OPTIONS", "TRACE", "DELETE"].includes(req.method)) {
|
|
1442
|
+
let bodyPromise = req.arrayBuffer();
|
|
1443
|
+
let readable = new ReadableStream({
|
|
1444
|
+
async start(controller) {
|
|
1445
|
+
try {
|
|
1446
|
+
controller.enqueue(new Uint8Array(await bodyPromise));
|
|
1447
|
+
controller.close();
|
|
1448
|
+
} catch (err) {
|
|
1449
|
+
controller.error(err);
|
|
1450
|
+
}
|
|
1451
|
+
}
|
|
1452
|
+
});
|
|
1453
|
+
let hook = streamImpl.createReadableStreamHook(readable);
|
|
1454
|
+
let importId = this.exporter.createPipe(readable, hook);
|
|
1455
|
+
init.body = ["readable", importId];
|
|
1456
|
+
init.duplex = req.duplex || "half";
|
|
1457
|
+
}
|
|
1458
|
+
if (req.cache && req.cache !== "default") init.cache = req.cache;
|
|
1459
|
+
if (req.redirect !== "follow") init.redirect = req.redirect;
|
|
1460
|
+
if (req.integrity) init.integrity = req.integrity;
|
|
1461
|
+
if (req.mode && req.mode !== "cors") init.mode = req.mode;
|
|
1462
|
+
if (req.credentials && req.credentials !== "same-origin") {
|
|
1463
|
+
init.credentials = req.credentials;
|
|
1464
|
+
}
|
|
1465
|
+
if (req.referrer && req.referrer !== "about:client") init.referrer = req.referrer;
|
|
1466
|
+
if (req.referrerPolicy) init.referrerPolicy = req.referrerPolicy;
|
|
1467
|
+
if (req.keepalive) init.keepalive = req.keepalive;
|
|
1468
|
+
let cfReq = req;
|
|
1469
|
+
if (cfReq.cf) init.cf = cfReq.cf;
|
|
1470
|
+
if (cfReq.encodeResponseBody && cfReq.encodeResponseBody !== "automatic") {
|
|
1471
|
+
init.encodeResponseBody = cfReq.encodeResponseBody;
|
|
1472
|
+
}
|
|
1473
|
+
return ["request", req.url, init];
|
|
1474
|
+
}
|
|
1475
|
+
case "response": {
|
|
1476
|
+
let resp = value;
|
|
1477
|
+
let body = this.devaluateImpl(resp.body, resp, depth + 1);
|
|
1478
|
+
let init = {};
|
|
1479
|
+
if (resp.status !== 200) init.status = resp.status;
|
|
1480
|
+
if (resp.statusText) init.statusText = resp.statusText;
|
|
1481
|
+
let headers = [...resp.headers];
|
|
1482
|
+
if (headers.length > 0) {
|
|
1483
|
+
init.headers = headers;
|
|
1484
|
+
}
|
|
1485
|
+
let cfResp = resp;
|
|
1486
|
+
if (cfResp.cf) init.cf = cfResp.cf;
|
|
1487
|
+
if (cfResp.encodeBody && cfResp.encodeBody !== "automatic") {
|
|
1488
|
+
init.encodeBody = cfResp.encodeBody;
|
|
1489
|
+
}
|
|
1490
|
+
if (cfResp.webSocket) {
|
|
1491
|
+
throw new TypeError("Can't serialize a Response containing a webSocket.");
|
|
1492
|
+
}
|
|
1493
|
+
return ["response", body, init];
|
|
1378
1494
|
}
|
|
1379
1495
|
case "error": {
|
|
1380
1496
|
let e = value;
|
|
@@ -1475,6 +1591,14 @@ var NullImporter = class {
|
|
|
1475
1591
|
}
|
|
1476
1592
|
};
|
|
1477
1593
|
var NULL_IMPORTER = new NullImporter();
|
|
1594
|
+
function fixBrokenRequestBody(request, body) {
|
|
1595
|
+
let promise = new Response(body).arrayBuffer().then((arrayBuffer) => {
|
|
1596
|
+
let bytes = new Uint8Array(arrayBuffer);
|
|
1597
|
+
let result = new Request(request, { body: bytes });
|
|
1598
|
+
return new PayloadStubHook(RpcPayload.fromAppReturn(result));
|
|
1599
|
+
});
|
|
1600
|
+
return new RpcPromise(new PromiseStubHook(promise), []);
|
|
1601
|
+
}
|
|
1478
1602
|
var Evaluator = class _Evaluator {
|
|
1479
1603
|
constructor(importer) {
|
|
1480
1604
|
this.importer = importer;
|
|
@@ -1515,10 +1639,11 @@ var Evaluator = class _Evaluator {
|
|
|
1515
1639
|
}
|
|
1516
1640
|
break;
|
|
1517
1641
|
case "bytes": {
|
|
1518
|
-
let b64 = Uint8Array;
|
|
1519
1642
|
if (typeof value[1] == "string") {
|
|
1520
|
-
if (
|
|
1521
|
-
return
|
|
1643
|
+
if (typeof Buffer !== "undefined") {
|
|
1644
|
+
return Buffer.from(value[1], "base64");
|
|
1645
|
+
} else if (Uint8Array.fromBase64) {
|
|
1646
|
+
return Uint8Array.fromBase64(value[1]);
|
|
1522
1647
|
} else {
|
|
1523
1648
|
let bs = atob(value[1]);
|
|
1524
1649
|
let len = bs.length;
|
|
@@ -1552,6 +1677,56 @@ var Evaluator = class _Evaluator {
|
|
|
1552
1677
|
return -Infinity;
|
|
1553
1678
|
case "nan":
|
|
1554
1679
|
return NaN;
|
|
1680
|
+
case "headers":
|
|
1681
|
+
if (value.length === 2 && value[1] instanceof Array) {
|
|
1682
|
+
return new Headers(value[1]);
|
|
1683
|
+
}
|
|
1684
|
+
break;
|
|
1685
|
+
case "request": {
|
|
1686
|
+
if (value.length !== 3 || typeof value[1] !== "string") break;
|
|
1687
|
+
let url = value[1];
|
|
1688
|
+
let init = value[2];
|
|
1689
|
+
if (typeof init !== "object" || init === null) break;
|
|
1690
|
+
if (init.body) {
|
|
1691
|
+
init.body = this.evaluateImpl(init.body, init, "body");
|
|
1692
|
+
if (init.body === null || typeof init.body === "string" || init.body instanceof Uint8Array || init.body instanceof ReadableStream) ; else {
|
|
1693
|
+
throw new TypeError("Request body must be of type ReadableStream.");
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
if (init.signal) {
|
|
1697
|
+
init.signal = this.evaluateImpl(init.signal, init, "signal");
|
|
1698
|
+
if (!(init.signal instanceof AbortSignal)) {
|
|
1699
|
+
throw new TypeError("Request siganl must be of type AbortSignal.");
|
|
1700
|
+
}
|
|
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
|
+
let result = new Request(url, init);
|
|
1706
|
+
if (init.body instanceof ReadableStream && result.body === void 0) {
|
|
1707
|
+
let promise = fixBrokenRequestBody(result, init.body);
|
|
1708
|
+
this.promises.push({ promise, parent, property });
|
|
1709
|
+
return promise;
|
|
1710
|
+
} else {
|
|
1711
|
+
return result;
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
case "response": {
|
|
1715
|
+
if (value.length !== 3) break;
|
|
1716
|
+
let body = this.evaluateImpl(value[1], parent, property);
|
|
1717
|
+
if (body === null || typeof body === "string" || body instanceof Uint8Array || body instanceof ReadableStream) ; else {
|
|
1718
|
+
throw new TypeError("Response body must be of type ReadableStream.");
|
|
1719
|
+
}
|
|
1720
|
+
let init = value[2];
|
|
1721
|
+
if (typeof init !== "object" || init === null) break;
|
|
1722
|
+
if (init.webSocket) {
|
|
1723
|
+
throw new TypeError("Can't deserialize a Response containing a webSocket.");
|
|
1724
|
+
}
|
|
1725
|
+
if (init.headers && !(init.headers instanceof Array)) {
|
|
1726
|
+
throw new TypeError("Request headers must be serialized as an array of pairs.");
|
|
1727
|
+
}
|
|
1728
|
+
return new Response(body, init);
|
|
1729
|
+
}
|
|
1555
1730
|
case "import":
|
|
1556
1731
|
case "pipeline": {
|
|
1557
1732
|
if (value.length < 2 || value.length > 4) {
|