transport-io 0.10.0 → 0.12.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/authorize.d.ts +25 -0
- package/dist/authorize.d.ts.map +1 -0
- package/dist/authorize.js +54 -0
- package/dist/authorize.js.map +1 -0
- package/dist/cli/dev-server.node.js +9 -3
- package/dist/cli/dev-server.node.js.map +1 -1
- package/dist/cli/main.node.js +21 -6
- package/dist/cli/main.node.js.map +1 -1
- package/dist/client.d.ts +40 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +101 -5
- package/dist/client.js.map +1 -1
- package/dist/codec.d.ts +15 -0
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +35 -1
- package/dist/codec.js.map +1 -1
- package/dist/contract.d.ts +57 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +28 -0
- package/dist/contract.js.map +1 -1
- package/dist/datagram.d.ts +3 -0
- package/dist/datagram.d.ts.map +1 -1
- package/dist/datagram.js +4 -3
- package/dist/datagram.js.map +1 -1
- package/dist/errors.d.ts +20 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -1
- package/dist/framer.js +2 -2
- package/dist/framer.js.map +1 -1
- package/dist/hub.d.ts.map +1 -1
- package/dist/hub.js +8 -3
- package/dist/hub.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +8 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +8 -1
- package/dist/protocol.js.map +1 -1
- package/dist/server.d.ts +42 -19
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +35 -3
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +17 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +142 -29
- package/dist/session.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/transport/browser.d.ts.map +1 -1
- package/dist/transport/browser.js +4 -1
- package/dist/transport/browser.js.map +1 -1
- package/dist/transport/closed.d.ts +14 -0
- package/dist/transport/closed.d.ts.map +1 -0
- package/dist/transport/closed.js +28 -0
- package/dist/transport/closed.js.map +1 -0
- package/dist/transport/dev.d.ts +36 -2
- package/dist/transport/dev.d.ts.map +1 -1
- package/dist/transport/dev.js +51 -16
- package/dist/transport/dev.js.map +1 -1
- package/dist/transport/fails.node.d.ts +16 -6
- package/dist/transport/fails.node.d.ts.map +1 -1
- package/dist/transport/fails.node.js +81 -9
- package/dist/transport/fails.node.js.map +1 -1
- package/dist/transport/loopback.d.ts +8 -9
- package/dist/transport/loopback.d.ts.map +1 -1
- package/dist/transport/loopback.js +64 -8
- package/dist/transport/loopback.js.map +1 -1
- package/dist/transport/moq.node.d.ts.map +1 -1
- package/dist/transport/moq.node.js +2 -4
- package/dist/transport/moq.node.js.map +1 -1
- package/dist/transport/parity-suite.d.ts +58 -0
- package/dist/transport/parity-suite.d.ts.map +1 -1
- package/dist/transport/parity-suite.js +243 -33
- package/dist/transport/parity-suite.js.map +1 -1
- package/dist/transport/port.node.d.ts +10 -0
- package/dist/transport/port.node.d.ts.map +1 -0
- package/dist/transport/port.node.js +63 -0
- package/dist/transport/port.node.js.map +1 -0
- package/dist/transport/types.d.ts +29 -0
- package/dist/transport/types.d.ts.map +1 -1
- package/dist/transport/websocket-connection.d.ts +9 -2
- package/dist/transport/websocket-connection.d.ts.map +1 -1
- package/dist/transport/websocket-connection.js +13 -3
- package/dist/transport/websocket-connection.js.map +1 -1
- package/dist/transport/websocket.node.d.ts +13 -5
- package/dist/transport/websocket.node.d.ts.map +1 -1
- package/dist/transport/websocket.node.js +33 -4
- package/dist/transport/websocket.node.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Authorize, ConnectRequest } from './transport/types.ts';
|
|
2
|
+
/** A refusal that says why. Made by `refuse`, returned from `authorize`. */
|
|
3
|
+
export declare class Refusal {
|
|
4
|
+
readonly reason: string;
|
|
5
|
+
constructor(reason: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Refuses a peer from `authorize`, with a reason the client can branch on: it arrives as
|
|
9
|
+
* `RefusedError.reason` from `connect()` and as `refused.reason` on the snapshot. The reason
|
|
10
|
+
* is the session's close reason, so it is short: at most 123 bytes of UTF-8, the WebSocket
|
|
11
|
+
* mapping's cap, and it throws here rather than arrive cut and no longer equal to what the
|
|
12
|
+
* client compares it with. `authorize` returning `null` is `refuse('refused')`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function refuse(reason: string): Refusal;
|
|
15
|
+
export type Verdict<D> = {
|
|
16
|
+
readonly accepted: true;
|
|
17
|
+
readonly data: D | undefined;
|
|
18
|
+
} | {
|
|
19
|
+
readonly accepted: false;
|
|
20
|
+
readonly code: number;
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
};
|
|
23
|
+
/** Runs `authorize` for one request. Never throws: a throw inside it is a verdict too. */
|
|
24
|
+
export declare function decide<D>(authorize: Authorize<D> | undefined, request: () => ConnectRequest): Promise<Verdict<D>>;
|
|
25
|
+
//# sourceMappingURL=authorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../src/authorize.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErE,4EAA4E;AAC5E,qBAAa,OAAO;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IAEvB,YAAY,MAAM,EAAE,MAAM,EAEzB;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAU9C;AAED,MAAM,MAAM,OAAO,CAAC,CAAC,IACjB;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhF,0FAA0F;AAC1F,wBAAsB,MAAM,CAAC,CAAC,EAC5B,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EACnC,OAAO,EAAE,MAAM,cAAc,GAC5B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAgBrB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The door's verdict, shared by every listener so a refusal means one thing on the wire.
|
|
3
|
+
*
|
|
4
|
+
* `authorize` answers with what it learned, which becomes `peer.data`; with `null` or a
|
|
5
|
+
* `refuse(reason)`, which is a refusal; or by throwing, which is not an answer at all. The
|
|
6
|
+
* difference matters to the client: a refusal is about the request, the same request would
|
|
7
|
+
* be refused again, and a client that reconnects on its own stops. A throw is about the
|
|
8
|
+
* server, a verification backend that is down, and must stay retryable, so it closes the
|
|
9
|
+
* session without the code that says refused (D144).
|
|
10
|
+
*/
|
|
11
|
+
import { DEFAULT_REFUSAL_REASON, TransportError } from './errors.js';
|
|
12
|
+
import { CloseCode, REFUSAL_REASON_MAX_BYTES } from './protocol.js';
|
|
13
|
+
/** A refusal that says why. Made by `refuse`, returned from `authorize`. */
|
|
14
|
+
export class Refusal {
|
|
15
|
+
reason;
|
|
16
|
+
constructor(reason) {
|
|
17
|
+
this.reason = reason;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Refuses a peer from `authorize`, with a reason the client can branch on: it arrives as
|
|
22
|
+
* `RefusedError.reason` from `connect()` and as `refused.reason` on the snapshot. The reason
|
|
23
|
+
* is the session's close reason, so it is short: at most 123 bytes of UTF-8, the WebSocket
|
|
24
|
+
* mapping's cap, and it throws here rather than arrive cut and no longer equal to what the
|
|
25
|
+
* client compares it with. `authorize` returning `null` is `refuse('refused')`.
|
|
26
|
+
*/
|
|
27
|
+
export function refuse(reason) {
|
|
28
|
+
const bytes = new TextEncoder().encode(reason).byteLength;
|
|
29
|
+
if (bytes === 0 || bytes > REFUSAL_REASON_MAX_BYTES) {
|
|
30
|
+
throw new TransportError('WT_VALIDATION_FAILED', `a refusal reason is 1 to ${REFUSAL_REASON_MAX_BYTES} bytes, and this one is ${bytes}`, "Use a short code the client can compare, 'expired' or 'banned', and keep prose for the page that shows it.");
|
|
31
|
+
}
|
|
32
|
+
return new Refusal(reason);
|
|
33
|
+
}
|
|
34
|
+
/** Runs `authorize` for one request. Never throws: a throw inside it is a verdict too. */
|
|
35
|
+
export async function decide(authorize, request) {
|
|
36
|
+
if (authorize === undefined)
|
|
37
|
+
return { accepted: true, data: undefined };
|
|
38
|
+
let answer;
|
|
39
|
+
try {
|
|
40
|
+
answer = await authorize(request());
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Not a refusal: nothing was decided about this peer, and the next attempt may be.
|
|
44
|
+
return { accepted: false, code: CloseCode.WT_NO_ERROR, reason: 'authorize failed' };
|
|
45
|
+
}
|
|
46
|
+
if (answer === null) {
|
|
47
|
+
return { accepted: false, code: CloseCode.WT_UNAUTHORIZED, reason: DEFAULT_REFUSAL_REASON };
|
|
48
|
+
}
|
|
49
|
+
if (answer instanceof Refusal) {
|
|
50
|
+
return { accepted: false, code: CloseCode.WT_UNAUTHORIZED, reason: answer.reason };
|
|
51
|
+
}
|
|
52
|
+
return { accepted: true, data: answer };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=authorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../src/authorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAGnE,4EAA4E;AAC5E,MAAM,OAAO,OAAO;IACT,MAAM,CAAQ;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAA;IACzD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG,wBAAwB,EAAE,CAAC;QACpD,MAAM,IAAI,cAAc,CACtB,sBAAsB,EACtB,4BAA4B,wBAAwB,2BAA2B,KAAK,EAAE,EACtF,4GAA4G,CAC7G,CAAA;IACH,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,CAAC;AAMD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,SAAmC,EACnC,OAA6B;IAE7B,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IACvE,IAAI,MAA0B,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,mFAAmF;QACnF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;IACrF,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAA;IAC7F,CAAC;IACD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzC,CAAC"}
|
|
@@ -18,6 +18,7 @@ import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
|
18
18
|
import { createServer } from 'node:http';
|
|
19
19
|
import { extname, join, normalize, resolve } from 'node:path';
|
|
20
20
|
import { DEV_ENDPOINT } from '../transport/dev.js';
|
|
21
|
+
import { asPortInUse, assertTcpPortFree } from '../transport/port.node.js';
|
|
21
22
|
const MIME = {
|
|
22
23
|
'.html': 'text/html; charset=utf-8',
|
|
23
24
|
'.js': 'text/javascript; charset=utf-8',
|
|
@@ -58,7 +59,12 @@ function sendFile(res, file) {
|
|
|
58
59
|
res.end(readFileSync(file));
|
|
59
60
|
return true;
|
|
60
61
|
}
|
|
61
|
-
|
|
62
|
+
/** The address the page server binds, which is the one the command prints. */
|
|
63
|
+
export const DEV_HOST = '127.0.0.1';
|
|
64
|
+
export async function startDevServer(opts) {
|
|
65
|
+
// Binding `127.0.0.1` succeeds beside a server on `::`, and `localhost` may resolve to
|
|
66
|
+
// `::1`, which is that other server. Both loopback addresses are probed first.
|
|
67
|
+
await assertTcpPortFree(opts.port);
|
|
62
68
|
const server = createServer((req, res) => {
|
|
63
69
|
const path = (req.url ?? '/').split('?')[0] ?? '/';
|
|
64
70
|
if (path === DEV_ENDPOINT) {
|
|
@@ -91,8 +97,8 @@ export function startDevServer(opts) {
|
|
|
91
97
|
res.writeHead(404).end('not found');
|
|
92
98
|
});
|
|
93
99
|
return new Promise((ok, fail) => {
|
|
94
|
-
server.once('error', fail);
|
|
95
|
-
server.listen(opts.port,
|
|
100
|
+
server.once('error', (e) => fail(asPortInUse(e, `TCP port ${opts.port}`)));
|
|
101
|
+
server.listen(opts.port, DEV_HOST, () => ok(server));
|
|
96
102
|
});
|
|
97
103
|
}
|
|
98
104
|
//# sourceMappingURL=dev-server.node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.node.js","sourceRoot":"","sources":["../../src/cli/dev-server.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAkD,MAAM,WAAW,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"dev-server.node.js","sourceRoot":"","sources":["../../src/cli/dev-server.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAkD,MAAM,WAAW,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE1E,MAAM,IAAI,GAAqC;IAC7C,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,iCAAiC;IACzC,MAAM,EAAE,eAAe;CACxB,CAAA;AAED,+FAA+F;AAC/F,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAA;AAmB3C;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,OAAe;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3E,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,IAAY;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACnC,IAAI,IAAiC,CAAA;IACrC,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,KAAK,CAAA;IAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAA;IACzF,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAA;AAEnC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAsB;IACzD,uFAAuF;IACvF,+EAA+E;IAC/E,MAAM,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA;QAElD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,iCAAiC;gBACjD,gFAAgF;gBAChF,eAAe,EAAE,UAAU;aAC5B,CAAC,CAAA;YACF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;YAClE,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;gBAAE,OAAM;YACrD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACnC,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAA;YAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;YAC1C,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;gBAAE,OAAM;QACvD,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,aAAa,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAW,EAAE,CAAC,CAAA;YAC/D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/cli/main.node.js
CHANGED
|
@@ -18,8 +18,10 @@ import { spawn } from 'node:child_process';
|
|
|
18
18
|
import { existsSync, realpathSync } from 'node:fs';
|
|
19
19
|
import { dirname, resolve } from 'node:path';
|
|
20
20
|
import { fileURLToPath } from 'node:url';
|
|
21
|
+
import { DEV_ENDPOINT } from '../transport/dev.js';
|
|
22
|
+
import { assertUdpPortFree } from '../transport/port.node.js';
|
|
21
23
|
import { daysLeft, ensureCertificate } from './certificate.node.js';
|
|
22
|
-
import { startDevServer } from './dev-server.node.js';
|
|
24
|
+
import { DEV_HOST, startDevServer } from './dev-server.node.js';
|
|
23
25
|
const DEFAULT_PORT = 3000;
|
|
24
26
|
const DEFAULT_WT_PORT = 4433;
|
|
25
27
|
export function parseArgs(input) {
|
|
@@ -96,6 +98,11 @@ async function main() {
|
|
|
96
98
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
97
99
|
// `dist/cli` -> `dist`, the directory served as ESM to the browser.
|
|
98
100
|
const distDir = resolve(here, '..');
|
|
101
|
+
// Before anything starts or prints. The manifest below says this port is a server with
|
|
102
|
+
// this command's certificate, and with another process holding it that is false whatever
|
|
103
|
+
// runs next: the demo and an entry would fail to bind it, and with no entry nothing here
|
|
104
|
+
// binds it at all, so the command used to print a URL that was somebody else's server.
|
|
105
|
+
await assertUdpPortFree(args.wtPort, DEV_HOST);
|
|
99
106
|
const staticDir = args.demo ? undefined : findStatic(args.staticDir);
|
|
100
107
|
let demoPage;
|
|
101
108
|
if (args.demo) {
|
|
@@ -121,17 +128,25 @@ async function main() {
|
|
|
121
128
|
console.log('');
|
|
122
129
|
console.log('transport-io dev');
|
|
123
130
|
console.log('');
|
|
124
|
-
|
|
131
|
+
// The address it binds, not `localhost`: a browser may resolve that to `::1`.
|
|
132
|
+
const origin = `http://${DEV_HOST}:${args.port}`;
|
|
133
|
+
if (args.demo || staticDir !== undefined)
|
|
134
|
+
console.log(` page ${origin}`);
|
|
135
|
+
else
|
|
136
|
+
console.log(` manifest ${origin}${DEV_ENDPOINT}`);
|
|
125
137
|
console.log(` webtransport ${wtUrl}`);
|
|
126
138
|
console.log(` certificate valid ${daysLeft(cert.validTo)}d sha-256 ${short}…`);
|
|
127
139
|
if (cert.renewed) {
|
|
128
140
|
console.log(' certificate renewed, so reload any tab you already had open');
|
|
129
141
|
}
|
|
130
142
|
console.log('');
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
143
|
+
if (args.demo || staticDir !== undefined) {
|
|
144
|
+
console.log(' Open the page in two tabs. Chrome or Firefox; Safari cannot connect.');
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(' No static directory, so no page is served here. Your own dev server, Vite for');
|
|
148
|
+
console.log(' example, serves the page and proxies the manifest path above to this port.');
|
|
149
|
+
console.log(' Pass --static <dir> to serve a built page from here instead.');
|
|
135
150
|
}
|
|
136
151
|
console.log('');
|
|
137
152
|
if (!args.demo && args.entry !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.node.js","sourceRoot":"","sources":["../../src/cli/main.node.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"main.node.js","sourceRoot":"","sources":["../../src/cli/main.node.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* scope, so importing this on a server - which Next.js will do - is safe. Feature
|
|
6
6
|
* detection happens inside connect().
|
|
7
7
|
*/
|
|
8
|
-
import { type AnyMap, type CallableOf, type Contract, type FallbackReady, type Registered, type StreamableOf } from './contract.ts';
|
|
8
|
+
import { type AnyMap, type CallableOf, type Contract, type FallbackReady, type ReceivedBy, type Registered, type SentBy, type StreamableOf } from './contract.ts';
|
|
9
9
|
import { TransportError } from './errors.ts';
|
|
10
10
|
import { type SessionStats, type StreamResult } from './session.ts';
|
|
11
11
|
import type { Connection, Transport } from './transport/types.ts';
|
|
@@ -17,11 +17,26 @@ export type Status = 'idle' | 'connecting' | 'connected' | 'closing' | 'closed';
|
|
|
17
17
|
* the WebTransport handshake failed and the WebSocket connected.
|
|
18
18
|
*/
|
|
19
19
|
export type FallbackReason = 'unsupported' | 'unreachable';
|
|
20
|
+
/**
|
|
21
|
+
* The server's `authorize` refused this client, and why: what `refuse(reason)` was given, or
|
|
22
|
+
* `'refused'` where `authorize` returned `null`.
|
|
23
|
+
*/
|
|
24
|
+
export interface Refused {
|
|
25
|
+
readonly reason: string;
|
|
26
|
+
}
|
|
20
27
|
export interface ClientState {
|
|
21
28
|
readonly status: Status;
|
|
22
29
|
readonly sessionId: string | null;
|
|
23
30
|
readonly rooms: readonly string[];
|
|
24
31
|
readonly lastError: TransportError | null;
|
|
32
|
+
/**
|
|
33
|
+
* Set when the server refused this client at `authorize`, beside a `status` of `closed`.
|
|
34
|
+
* A refusal is final: the same request would be refused again, so a client that reconnects
|
|
35
|
+
* on its own has stopped, and nothing happens until the application calls `disconnect()`
|
|
36
|
+
* and `connect()` with a credential that will pass. `null` otherwise, and cleared when the
|
|
37
|
+
* next attempt starts.
|
|
38
|
+
*/
|
|
39
|
+
readonly refused: Refused | null;
|
|
25
40
|
/** What carries the current session. `null` until connected. */
|
|
26
41
|
readonly transport: Transport | null;
|
|
27
42
|
/**
|
|
@@ -30,6 +45,15 @@ export interface ClientState {
|
|
|
30
45
|
*/
|
|
31
46
|
readonly fallbackReason: FallbackReason | null;
|
|
32
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The waits between attempts, when a client reconnects on its own. The wait after a session
|
|
50
|
+
* closes is `minMs`, doubled on each failed attempt up to `maxMs`, and randomised between
|
|
51
|
+
* half of that and all of it, so a fleet that lost one server does not return as one wave.
|
|
52
|
+
*/
|
|
53
|
+
export interface ReconnectOptions {
|
|
54
|
+
readonly minMs: number;
|
|
55
|
+
readonly maxMs: number;
|
|
56
|
+
}
|
|
33
57
|
export interface ClientOptions<C extends Contract = Contract> {
|
|
34
58
|
/**
|
|
35
59
|
* How long to wait for the peer's handshake before giving up. The deadline covers
|
|
@@ -37,6 +61,13 @@ export interface ClientOptions<C extends Contract = Contract> {
|
|
|
37
61
|
* fails here rather than hanging.
|
|
38
62
|
*/
|
|
39
63
|
readonly handshakeDeadlineMs?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Reconnect on its own after a connected session closes. Off unless given. Every attempt
|
|
66
|
+
* starts from the native connector again, and every session it produces runs `onSession`.
|
|
67
|
+
* The first `connect()` is not retried: it resolves or rejects as it always did, and the
|
|
68
|
+
* retrying starts once a session has been had. `disconnect()` stops it.
|
|
69
|
+
*/
|
|
70
|
+
readonly reconnect?: ReconnectOptions;
|
|
40
71
|
readonly contract: C;
|
|
41
72
|
/** Supplied by the transport seam, so this class never imports a transport. */
|
|
42
73
|
readonly connect: () => Promise<Connection>;
|
|
@@ -51,6 +82,12 @@ export interface ClientOptions<C extends Contract = Contract> {
|
|
|
51
82
|
export declare class Client<M extends AnyMap = Registered> {
|
|
52
83
|
#private;
|
|
53
84
|
constructor(opts: ClientOptions);
|
|
85
|
+
/**
|
|
86
|
+
* Runs once for every session this client gets, with the snapshot as it connected: the
|
|
87
|
+
* first, and each one a reconnect produces. A reconnect is a new session (D4), so this is
|
|
88
|
+
* where rooms are rejoined and what was missed is fetched. Returns the unsubscribe.
|
|
89
|
+
*/
|
|
90
|
+
onSession(cb: (state: ClientState) => void): () => void;
|
|
54
91
|
/**
|
|
55
92
|
* Referentially stable until something actually changes. Returning a freshly built
|
|
56
93
|
* object on each call makes useSyncExternalStore re-render forever, which is the single
|
|
@@ -63,8 +100,8 @@ export declare class Client<M extends AnyMap = Registered> {
|
|
|
63
100
|
connect(): Promise<void>;
|
|
64
101
|
disconnect(): void;
|
|
65
102
|
/** The lane comes from the contract, never from this call site. */
|
|
66
|
-
emit<K extends
|
|
67
|
-
on<K extends
|
|
103
|
+
emit<K extends SentBy<M, 'client'> & string>(event: K, payload: M[K]['payload']): void;
|
|
104
|
+
on<K extends ReceivedBy<M, 'client'> & string>(event: K, handler: (payload: M[K]['payload']) => void): () => void;
|
|
68
105
|
/** Available only on events declaring `returns`. Aborting resets the QUIC stream. */
|
|
69
106
|
call<K extends CallableOf<M> & string>(event: K, payload: M[K]['payload'], options?: {
|
|
70
107
|
readonly signal?: AbortSignal;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,eAAe,CAAA;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
* detection happens inside connect().
|
|
7
7
|
*/
|
|
8
8
|
import { buildEventTable, } from './contract.js';
|
|
9
|
-
import { TransportError } from './errors.js';
|
|
9
|
+
import { errorForClose, RefusedError, TransportError } from './errors.js';
|
|
10
10
|
import { CloseCode, FrameType } from './protocol.js';
|
|
11
11
|
import { Session } from './session.js';
|
|
12
|
+
import { OwnedTimers } from './timers.js';
|
|
12
13
|
export class Client {
|
|
13
14
|
#opts;
|
|
14
15
|
#listeners = new Set();
|
|
@@ -29,14 +30,30 @@ export class Client {
|
|
|
29
30
|
sessionId: null,
|
|
30
31
|
rooms: [],
|
|
31
32
|
lastError: null,
|
|
33
|
+
refused: null,
|
|
32
34
|
transport: null,
|
|
33
35
|
fallbackReason: null,
|
|
34
36
|
});
|
|
35
37
|
#refs = 0;
|
|
36
38
|
#connecting;
|
|
39
|
+
#timers = new OwnedTimers();
|
|
40
|
+
/** Failed attempts since the last connected session, which sets the next wait. */
|
|
41
|
+
#attempt = 0;
|
|
42
|
+
#onSession = new Set();
|
|
37
43
|
constructor(opts) {
|
|
38
44
|
this.#opts = opts;
|
|
39
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Runs once for every session this client gets, with the snapshot as it connected: the
|
|
48
|
+
* first, and each one a reconnect produces. A reconnect is a new session (D4), so this is
|
|
49
|
+
* where rooms are rejoined and what was missed is fetched. Returns the unsubscribe.
|
|
50
|
+
*/
|
|
51
|
+
onSession(cb) {
|
|
52
|
+
this.#onSession.add(cb);
|
|
53
|
+
return () => {
|
|
54
|
+
this.#onSession.delete(cb);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
40
57
|
/**
|
|
41
58
|
* Referentially stable until something actually changes. Returning a freshly built
|
|
42
59
|
* object on each call makes useSyncExternalStore re-render forever, which is the single
|
|
@@ -70,6 +87,9 @@ export class Client {
|
|
|
70
87
|
if (this.#refs > 0)
|
|
71
88
|
return;
|
|
72
89
|
this.#generation++;
|
|
90
|
+
// A reconnect that was waiting is off: the application said stop.
|
|
91
|
+
this.#timers.clearAll();
|
|
92
|
+
this.#attempt = 0;
|
|
73
93
|
this.#patch({ status: 'closing' });
|
|
74
94
|
const closing = this.#session;
|
|
75
95
|
closing?.close(CloseCode.WT_NO_ERROR, 'client disconnect');
|
|
@@ -128,7 +148,7 @@ export class Client {
|
|
|
128
148
|
return this.#session?.stats();
|
|
129
149
|
}
|
|
130
150
|
async #doConnect() {
|
|
131
|
-
this.#patch({ status: 'connecting', lastError: null });
|
|
151
|
+
this.#patch({ status: 'connecting', lastError: null, refused: null });
|
|
132
152
|
const generation = this.#generation;
|
|
133
153
|
try {
|
|
134
154
|
const table = await buildEventTable(this.#opts.contract);
|
|
@@ -191,7 +211,7 @@ export class Client {
|
|
|
191
211
|
const err = e instanceof TransportError
|
|
192
212
|
? e
|
|
193
213
|
: new TransportError('WT_SESSION_CLOSED', String(e), 'Retry the connection.');
|
|
194
|
-
this.#patch({ status: 'closed', lastError: err });
|
|
214
|
+
this.#patch({ status: 'closed', lastError: err, refused: refusedBy(err) });
|
|
195
215
|
throw err;
|
|
196
216
|
}
|
|
197
217
|
}
|
|
@@ -216,6 +236,8 @@ export class Client {
|
|
|
216
236
|
const session = new Session(conn, {
|
|
217
237
|
table,
|
|
218
238
|
origin: this.#opts.origin ?? 0x80000001,
|
|
239
|
+
side: 'client',
|
|
240
|
+
holdDelivery: true,
|
|
219
241
|
...(this.#opts.validateInbound === undefined
|
|
220
242
|
? {}
|
|
221
243
|
: { validateInbound: this.#opts.validateInbound }),
|
|
@@ -240,20 +262,91 @@ export class Client {
|
|
|
240
262
|
session.on(event, (p) => h(p));
|
|
241
263
|
}
|
|
242
264
|
session.onControl((type, body) => this.#onMembership(type, body));
|
|
243
|
-
|
|
265
|
+
try {
|
|
266
|
+
await session.start();
|
|
267
|
+
}
|
|
268
|
+
catch (e) {
|
|
269
|
+
// A session that never started is nobody's session. Left in place it answered `emit`
|
|
270
|
+
// by dropping, where a client with no session throws. `close` is idempotent, so a
|
|
271
|
+
// session the peer or the deadline already closed is not closed twice.
|
|
272
|
+
session.close(CloseCode.WT_NO_ERROR, 'handshake failed');
|
|
273
|
+
if (this.#session === session)
|
|
274
|
+
this.#session = undefined;
|
|
275
|
+
throw e;
|
|
276
|
+
}
|
|
277
|
+
this.#attempt = 0;
|
|
244
278
|
this.#patch({
|
|
245
279
|
status: 'connected',
|
|
246
280
|
sessionId: `s-${session.origin}`,
|
|
247
281
|
transport: conn.kind(),
|
|
248
282
|
fallbackReason,
|
|
249
283
|
});
|
|
250
|
-
|
|
284
|
+
// Nothing from this session reaches a handler until every `onSession` callback has
|
|
285
|
+
// returned: the session holds what the peer sent after its handshake. Released in a
|
|
286
|
+
// `finally`, so a callback that throws does not leave the session holding for ever.
|
|
287
|
+
try {
|
|
288
|
+
for (const cb of this.#onSession)
|
|
289
|
+
cb(this.#snapshot);
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
session.release();
|
|
293
|
+
}
|
|
294
|
+
void conn.closed.then((info) => {
|
|
295
|
+
// Superseded by a disconnect or a newer connect: that path patched its own state.
|
|
296
|
+
if (generation !== this.#generation)
|
|
297
|
+
return;
|
|
298
|
+
this.#session = undefined;
|
|
299
|
+
this.#connecting = undefined;
|
|
300
|
+
// A close code that is an error says why the session ended. A server may close a live
|
|
301
|
+
// session as `WT_UNAUTHORIZED`, a token that expired, and that is a refusal like one
|
|
302
|
+
// at the door.
|
|
303
|
+
const err = errorForClose(info.code, info.reason) ?? null;
|
|
304
|
+
const refused = refusedBy(err);
|
|
251
305
|
this.#patch({
|
|
252
306
|
status: 'closed',
|
|
253
307
|
sessionId: null,
|
|
254
308
|
rooms: [],
|
|
255
309
|
transport: null,
|
|
256
310
|
fallbackReason: null,
|
|
311
|
+
lastError: err,
|
|
312
|
+
refused,
|
|
313
|
+
});
|
|
314
|
+
if (refused !== null)
|
|
315
|
+
return;
|
|
316
|
+
if (this.#opts.reconnect !== undefined && this.#refs > 0)
|
|
317
|
+
this.#scheduleReconnect();
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* One attempt after a wait, and another wait after a failed one. The guard against two
|
|
322
|
+
* attempts overlapping is `#connecting`, the same one `connect()` uses, and the guard
|
|
323
|
+
* against reconnecting after `disconnect()` is the generation, the same one a superseded
|
|
324
|
+
* connect uses.
|
|
325
|
+
*/
|
|
326
|
+
#scheduleReconnect() {
|
|
327
|
+
const reconnect = this.#opts.reconnect;
|
|
328
|
+
if (reconnect === undefined)
|
|
329
|
+
return;
|
|
330
|
+
const base = Math.min(reconnect.maxMs, reconnect.minMs * 2 ** this.#attempt);
|
|
331
|
+
const delay = Math.round(base * (0.5 + Math.random() * 0.5));
|
|
332
|
+
this.#attempt++;
|
|
333
|
+
const generation = this.#generation;
|
|
334
|
+
this.#timers.after(delay, () => {
|
|
335
|
+
if (generation !== this.#generation || this.#refs === 0)
|
|
336
|
+
return;
|
|
337
|
+
if (this.#connecting !== undefined)
|
|
338
|
+
return;
|
|
339
|
+
const attempt = this.#doConnect();
|
|
340
|
+
this.#connecting = attempt;
|
|
341
|
+
attempt.catch((e) => {
|
|
342
|
+
if (this.#connecting === attempt)
|
|
343
|
+
this.#connecting = undefined;
|
|
344
|
+
// A refusal is final. The token was never going to become valid by waiting, and
|
|
345
|
+
// retrying it is a client that says "offline, retrying" for ever.
|
|
346
|
+
if (e instanceof RefusedError)
|
|
347
|
+
return;
|
|
348
|
+
if (generation === this.#generation && this.#refs > 0)
|
|
349
|
+
this.#scheduleReconnect();
|
|
257
350
|
});
|
|
258
351
|
});
|
|
259
352
|
}
|
|
@@ -287,6 +380,9 @@ export class Client {
|
|
|
287
380
|
* let `new Client(...)` take a fallback without passing the gate below.
|
|
288
381
|
*/
|
|
289
382
|
const fallbacks = new WeakMap();
|
|
383
|
+
function refusedBy(e) {
|
|
384
|
+
return e instanceof RefusedError ? Object.freeze({ reason: e.reason }) : null;
|
|
385
|
+
}
|
|
290
386
|
function fallbackReasonFor(e) {
|
|
291
387
|
if (!(e instanceof TransportError))
|
|
292
388
|
return undefined;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/codec.d.ts
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two codecs this version speaks. PROTOCOL.md §5.3: `0x01` is JSON over UTF-8, `0x02`
|
|
3
|
+
* is the application's bytes carried as they are. Which one a payload uses is a property of
|
|
4
|
+
* the event's slot in the contract, never of the call site, and a frame that arrives under
|
|
5
|
+
* the other codec is a protocol error rather than a guess.
|
|
6
|
+
*/
|
|
7
|
+
import { type EventDef } from './contract.ts';
|
|
8
|
+
import { Codec } from './protocol.ts';
|
|
1
9
|
export declare function encodePayload(value: unknown): Uint8Array;
|
|
2
10
|
export declare function decodePayload(bytes: Uint8Array): unknown;
|
|
3
11
|
/** Validate inbound only. The process that produced a payload need not check its own work. */
|
|
4
12
|
export declare function validate(schema: import('./contract.ts').Schema, value: unknown): Promise<unknown>;
|
|
13
|
+
export type Slot = 'payload' | 'returns' | 'yields';
|
|
14
|
+
export declare function slotCodec(def: EventDef, slot: Slot): Codec;
|
|
15
|
+
export declare function encodeWith(codec: Codec, value: unknown): Uint8Array;
|
|
16
|
+
/** A copy for bytes, so the application never holds a view into a buffer the decoder reuses. */
|
|
17
|
+
export declare function decodeWith(codec: number, bytes: Uint8Array): unknown;
|
|
18
|
+
/** The frame's codec against the contract's, for one slot of one event. */
|
|
19
|
+
export declare function expectCodec(event: string, slot: Slot, declared: Codec, arrived: number): void;
|
|
5
20
|
//# sourceMappingURL=codec.d.ts.map
|
package/dist/codec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,QAAQ,EAAwB,MAAM,eAAe,CAAA;AAEnE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAKrC,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAmBxD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAoBxD;AAED,8FAA8F;AAC9F,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,OAAO,eAAe,EAAE,MAAM,EACtC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAOD,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEnD,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,CAE1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU,CAYnE;AAED,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAEpE;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAS7F"}
|
package/dist/codec.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* The two codecs this version speaks. PROTOCOL.md §5.3: `0x01` is JSON over UTF-8, `0x02`
|
|
3
|
+
* is the application's bytes carried as they are. Which one a payload uses is a property of
|
|
4
|
+
* the event's slot in the contract, never of the call site, and a frame that arrives under
|
|
5
|
+
* the other codec is a protocol error rather than a guess.
|
|
6
|
+
*/
|
|
7
|
+
import { isBytes } from './contract.js';
|
|
2
8
|
import { TransportError } from './errors.js';
|
|
9
|
+
import { Codec } from './protocol.js';
|
|
3
10
|
const encoder = new TextEncoder();
|
|
4
11
|
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
5
12
|
export function encodePayload(value) {
|
|
@@ -44,4 +51,31 @@ export async function validate(schema, value) {
|
|
|
44
51
|
}
|
|
45
52
|
return result.value;
|
|
46
53
|
}
|
|
54
|
+
/** The codec an event's slot is declared with. A slot that is absent is JSON. */
|
|
55
|
+
function codecOf(schema) {
|
|
56
|
+
return schema !== undefined && isBytes(schema) ? Codec.BYTES : Codec.JSON;
|
|
57
|
+
}
|
|
58
|
+
export function slotCodec(def, slot) {
|
|
59
|
+
return codecOf(def[slot]);
|
|
60
|
+
}
|
|
61
|
+
export function encodeWith(codec, value) {
|
|
62
|
+
if (codec === Codec.BYTES) {
|
|
63
|
+
if (!(value instanceof Uint8Array)) {
|
|
64
|
+
throw new TransportError('WT_VALIDATION_FAILED', 'the event is declared bytes() and the payload is not a Uint8Array', 'Pass a Uint8Array, or declare the event with a type or a schema for JSON.');
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
return encodePayload(value);
|
|
69
|
+
}
|
|
70
|
+
/** A copy for bytes, so the application never holds a view into a buffer the decoder reuses. */
|
|
71
|
+
export function decodeWith(codec, bytes) {
|
|
72
|
+
return codec === Codec.BYTES ? new Uint8Array(bytes) : decodePayload(bytes);
|
|
73
|
+
}
|
|
74
|
+
/** The frame's codec against the contract's, for one slot of one event. */
|
|
75
|
+
export function expectCodec(event, slot, declared, arrived) {
|
|
76
|
+
if (declared === arrived)
|
|
77
|
+
return;
|
|
78
|
+
const name = (c) => c === Codec.BYTES ? 'bytes' : c === Codec.JSON ? 'JSON' : `codec 0x${c.toString(16)}`;
|
|
79
|
+
throw new TransportError('WT_PROTOCOL_ERROR', `event '${event}' declares ${name(declared)} for its ${slot} and the frame carries ${name(arrived)}`, 'The two sides disagree about whether this slot is bytes() or JSON. Deploy the same contract on both.');
|
|
80
|
+
}
|
|
47
81
|
//# sourceMappingURL=codec.js.map
|