@airterm/protocol 0.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 AirTerm contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # @airterm/protocol
2
+
3
+ Browser-safe AirTerm protocol primitives shared by the web client and CLI agent.
4
+ The package implements capability URLs, HKDF key separation, Noise transport,
5
+ binary framing, and terminal message codecs for protocol version 1.
6
+
7
+ Its additive streaming-transfer extension uses feature negotiation, 64-bit
8
+ offsets, bounded acknowledgement windows, and purpose-specific policies for
9
+ encrypted terminal fonts and clipboard images. Receivers can stream directly
10
+ to disk, allowing later file-transfer features to grow without replacing the
11
+ wire format.
12
+
13
+ ```sh
14
+ npm install @airterm/protocol
15
+ ```
16
+
17
+ AirTerm uses `Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b`. Applications should import
18
+ the public APIs from the package root.
19
+
20
+ ```ts
21
+ import { deriveCapabilityKeys, NoiseTransport } from '@airterm/protocol';
22
+ ```
23
+
24
+ Requires Node.js 22.12 or newer for Node-based consumers. Browser consumers need
25
+ Web Crypto and WebAssembly support.
26
+
27
+ ## Development and publishing
28
+
29
+ Run `npm run check` and `npm run test:package` from the repository root. Packing
30
+ this package builds fresh JavaScript and declarations and checks the browser
31
+ bundle. The package test installs the protocol and CLI tarballs together outside
32
+ the workspace so local workspace links cannot hide missing package files.
33
+
34
+ Publish this package before the CLI that depends on its exact version. Verify
35
+ that version is publicly available with `npm view @airterm/protocol@<version>`
36
+ before publishing the CLI. Run the dependency audit and scan Git history for
37
+ secrets before making a release public.
@@ -0,0 +1,22 @@
1
+ export declare const SESSION_ID_LENGTH = 22;
2
+ export declare const ROOT_SECRET_LENGTH = 43;
3
+ export interface CapabilityMaterial {
4
+ sessionId: string;
5
+ rootSecret: string;
6
+ }
7
+ export interface CapabilityKeys {
8
+ e2eePsk: Uint8Array;
9
+ gatewayAccessToken: Uint8Array;
10
+ gatewayAccessVerifier: Uint8Array;
11
+ }
12
+ export interface ParsedCapability extends CapabilityMaterial {
13
+ serverUrl: string;
14
+ }
15
+ export declare function generateCapabilityMaterial(): CapabilityMaterial;
16
+ export declare function createCapabilityUrl(serverUrl: string, material: CapabilityMaterial): string;
17
+ export declare function parseCapabilityUrl(capabilityUrl: string): ParsedCapability;
18
+ export declare function deriveCapabilityKeys(material: CapabilityMaterial): Promise<CapabilityKeys>;
19
+ export declare function normalizeServerUrl(serverUrl: string): string;
20
+ export declare function encodeBase64Url(bytes: Uint8Array): string;
21
+ export declare function decodeBase64Url(value: string): Uint8Array;
22
+ //# sourceMappingURL=capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB,EAAE,UAAU,CAAC;IAC/B,qBAAqB,EAAE,UAAU,CAAC;CACrC;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IACxD,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,0BAA0B,IAAI,kBAAkB,CAK/D;AAED,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,GAC7B,MAAM,CAOR;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAiB1E;AAED,wBAAsB,oBAAoB,CACtC,QAAQ,EAAE,kBAAkB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA6BzB;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAuB5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAsBzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAgCzD"}
@@ -0,0 +1,137 @@
1
+ const BASE64URL_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
2
+ const SESSION_ID_BYTES = 16;
3
+ const ROOT_SECRET_BYTES = 32;
4
+ export const SESSION_ID_LENGTH = 22;
5
+ export const ROOT_SECRET_LENGTH = 43;
6
+ export function generateCapabilityMaterial() {
7
+ return {
8
+ sessionId: encodeBase64Url(randomBytes(SESSION_ID_BYTES)),
9
+ rootSecret: encodeBase64Url(randomBytes(ROOT_SECRET_BYTES)),
10
+ };
11
+ }
12
+ export function createCapabilityUrl(serverUrl, material) {
13
+ assertSessionId(material.sessionId);
14
+ assertRootSecret(material.rootSecret);
15
+ const baseUrl = normalizeServerUrl(serverUrl);
16
+ return `${baseUrl}/t/${material.sessionId}#v1.${material.rootSecret}`;
17
+ }
18
+ export function parseCapabilityUrl(capabilityUrl) {
19
+ const url = new URL(capabilityUrl);
20
+ const pathMatch = url.pathname.match(/^\/t\/([A-Za-z0-9_-]{22})$/);
21
+ const fragmentMatch = url.hash.match(/^#v1\.([A-Za-z0-9_-]{43})$/);
22
+ if (pathMatch?.[1] === undefined || fragmentMatch?.[1] === undefined) {
23
+ throw new Error('Invalid AirTerm capability URL.');
24
+ }
25
+ assertSessionId(pathMatch[1]);
26
+ assertRootSecret(fragmentMatch[1]);
27
+ return {
28
+ serverUrl: normalizeServerUrl(url.origin),
29
+ sessionId: pathMatch[1],
30
+ rootSecret: fragmentMatch[1],
31
+ };
32
+ }
33
+ export async function deriveCapabilityKeys(material) {
34
+ assertSessionId(material.sessionId);
35
+ assertRootSecret(material.rootSecret);
36
+ const sessionId = decodeBase64Url(material.sessionId);
37
+ const rootSecret = decodeBase64Url(material.rootSecret);
38
+ const keyMaterial = await crypto.subtle.importKey('raw', toArrayBuffer(rootSecret), 'HKDF', false, ['deriveBits']);
39
+ const e2eePsk = await deriveHkdf(keyMaterial, sessionId, 'airterm/v1/e2ee');
40
+ const gatewayAccessToken = await deriveHkdf(keyMaterial, sessionId, 'airterm/v1/gateway-access');
41
+ const verifier = await crypto.subtle.digest('SHA-256', toArrayBuffer(gatewayAccessToken));
42
+ return {
43
+ e2eePsk,
44
+ gatewayAccessToken,
45
+ gatewayAccessVerifier: new Uint8Array(verifier),
46
+ };
47
+ }
48
+ export function normalizeServerUrl(serverUrl) {
49
+ const url = new URL(serverUrl);
50
+ const isLocalHttp = url.protocol === 'http:' &&
51
+ ['localhost', '127.0.0.1', '::1'].includes(url.hostname);
52
+ if (url.protocol !== 'https:' && !isLocalHttp) {
53
+ throw new Error('AirTerm servers must use HTTPS outside local development.');
54
+ }
55
+ if (url.username !== '' ||
56
+ url.password !== '' ||
57
+ url.search !== '' ||
58
+ url.hash !== '' ||
59
+ url.pathname !== '/') {
60
+ throw new Error('AirTerm server URL must be an origin without credentials, a path, a query, or a fragment.');
61
+ }
62
+ return url.origin;
63
+ }
64
+ export function encodeBase64Url(bytes) {
65
+ let output = '';
66
+ for (let index = 0; index < bytes.length; index += 3) {
67
+ const first = bytes[index] ?? 0;
68
+ const second = bytes[index + 1];
69
+ const third = bytes[index + 2];
70
+ const value = (first << 16) | ((second ?? 0) << 8) | (third ?? 0);
71
+ output += BASE64URL_ALPHABET[(value >> 18) & 63];
72
+ output += BASE64URL_ALPHABET[(value >> 12) & 63];
73
+ if (second !== undefined) {
74
+ output += BASE64URL_ALPHABET[(value >> 6) & 63];
75
+ }
76
+ if (third !== undefined) {
77
+ output += BASE64URL_ALPHABET[value & 63];
78
+ }
79
+ }
80
+ return output;
81
+ }
82
+ export function decodeBase64Url(value) {
83
+ if (!/^[A-Za-z0-9_-]+$/.test(value) || value.length % 4 === 1) {
84
+ throw new Error('Invalid Base64URL value.');
85
+ }
86
+ const output = new Uint8Array(Math.floor((value.length * 6) / 8));
87
+ let accumulator = 0;
88
+ let bits = 0;
89
+ let offset = 0;
90
+ for (const character of value) {
91
+ const decoded = BASE64URL_ALPHABET.indexOf(character);
92
+ if (decoded < 0) {
93
+ throw new Error('Invalid Base64URL value.');
94
+ }
95
+ accumulator = (accumulator << 6) | decoded;
96
+ bits += 6;
97
+ if (bits >= 8) {
98
+ bits -= 8;
99
+ output[offset] = (accumulator >> bits) & 0xff;
100
+ offset += 1;
101
+ }
102
+ }
103
+ if (bits > 0 && (accumulator & ((1 << bits) - 1)) !== 0) {
104
+ throw new Error('Non-canonical Base64URL value.');
105
+ }
106
+ return output;
107
+ }
108
+ function randomBytes(length) {
109
+ return crypto.getRandomValues(new Uint8Array(length));
110
+ }
111
+ async function deriveHkdf(keyMaterial, salt, info) {
112
+ const bits = await crypto.subtle.deriveBits({
113
+ name: 'HKDF',
114
+ hash: 'SHA-256',
115
+ salt: toArrayBuffer(salt),
116
+ info: new TextEncoder().encode(info),
117
+ }, keyMaterial, 256);
118
+ return new Uint8Array(bits);
119
+ }
120
+ function assertSessionId(sessionId) {
121
+ const decoded = decodeBase64Url(sessionId);
122
+ if (sessionId.length !== SESSION_ID_LENGTH || decoded.length !== SESSION_ID_BYTES) {
123
+ throw new Error('Invalid AirTerm session ID.');
124
+ }
125
+ }
126
+ function assertRootSecret(rootSecret) {
127
+ const decoded = decodeBase64Url(rootSecret);
128
+ if (rootSecret.length !== ROOT_SECRET_LENGTH || decoded.length !== ROOT_SECRET_BYTES) {
129
+ throw new Error('Invalid AirTerm root secret.');
130
+ }
131
+ }
132
+ function toArrayBuffer(bytes) {
133
+ const copy = new Uint8Array(bytes.byteLength);
134
+ copy.set(bytes);
135
+ return copy.buffer;
136
+ }
137
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,kEAAkE,CAAC;AAC9F,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAiBrC,MAAM,UAAU,0BAA0B;IACtC,OAAO;QACH,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACzD,UAAU,EAAE,eAAe,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;KAC9D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAC/B,SAAiB,EACjB,QAA4B;IAE5B,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE9C,OAAO,GAAG,OAAO,MAAM,QAAQ,CAAC,SAAS,OAAO,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAEnE,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvD,CAAC;IAED,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,OAAO;QACH,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC;QACzC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACvB,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;KAC/B,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,QAA4B;IAE5B,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC7C,KAAK,EACL,aAAa,CAAC,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,CAAC,YAAY,CAAC,CACjB,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC5E,MAAM,kBAAkB,GAAG,MAAM,UAAU,CACvC,WAAW,EACX,SAAS,EACT,2BAA2B,CAC9B,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACvC,SAAS,EACT,aAAa,CAAC,kBAAkB,CAAC,CACpC,CAAC;IAEF,OAAO;QACH,OAAO;QACP,kBAAkB;QAClB,qBAAqB,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC;KAClD,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,WAAW,GACb,GAAG,CAAC,QAAQ,KAAK,OAAO;QACxB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACjF,CAAC;IAED,IACI,GAAG,CAAC,QAAQ,KAAK,EAAE;QACnB,GAAG,CAAC,QAAQ,KAAK,EAAE;QACnB,GAAG,CAAC,MAAM,KAAK,EAAE;QACjB,GAAG,CAAC,IAAI,KAAK,EAAE;QACf,GAAG,CAAC,QAAQ,KAAK,GAAG,EACtB,CAAC;QACC,MAAM,IAAI,KAAK,CACX,2FAA2F,CAC9F,CAAC;IACN,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAElE,MAAM,IAAI,kBAAkB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,kBAAkB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,kBAAkB,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,kBAAkB,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IACzC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEtD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QAED,WAAW,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC;QAC3C,IAAI,IAAI,CAAC,CAAC;QAEV,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,CAAC;YACV,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;YAC9C,MAAM,IAAI,CAAC,CAAC;QAChB,CAAC;IACL,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAC/B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,UAAU,CACrB,WAAsB,EACtB,IAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CACvC;QACI,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;QACzB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;KACvC,EACD,WAAW,EACX,GAAG,CACN,CAAC;IAEF,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB;IACtC,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,SAAS,CAAC,MAAM,KAAK,iBAAiB,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IACxC,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,UAAU,CAAC,MAAM,KAAK,kBAAkB,IAAI,OAAO,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACpC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEhB,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
@@ -0,0 +1,45 @@
1
+ export declare const MAX_CIPHERTEXT_BYTES = 65535;
2
+ export declare const INNER_HEADER_BYTES = 13;
3
+ export declare enum OuterFrameKind {
4
+ NoiseHandshake = 1,
5
+ EncryptedTransport = 2
6
+ }
7
+ export declare enum InnerFrameType {
8
+ SessionDescription = 1,
9
+ SessionClose = 2,
10
+ PtyCreate = 3,
11
+ PtyCreated = 4,
12
+ PtyInput = 5,
13
+ PtyOutput = 6,
14
+ PtyResize = 7,
15
+ PtyClose = 8,
16
+ PtyExit = 9,
17
+ ReplayRequest = 10,
18
+ ReplayStart = 11,
19
+ ProtocolError = 12,
20
+ TransferRequest = 13,
21
+ TransferOffer = 14,
22
+ TransferAccept = 15,
23
+ TransferChunk = 16,
24
+ TransferAck = 17,
25
+ TransferComplete = 18,
26
+ TransferResult = 19,
27
+ TransferCancel = 20
28
+ }
29
+ export interface OuterFrame {
30
+ version: number;
31
+ kind: OuterFrameKind;
32
+ payload: Uint8Array;
33
+ }
34
+ export interface InnerFrame {
35
+ type: InnerFrameType;
36
+ ptyId: number;
37
+ sequence: bigint;
38
+ payload: Uint8Array;
39
+ }
40
+ export declare function outerAssociatedData(kind: OuterFrameKind, version?: number): Uint8Array;
41
+ export declare function encodeOuterFrame(kind: OuterFrameKind, payload: Uint8Array, version?: number): Uint8Array;
42
+ export declare function decodeOuterFrame(frame: Uint8Array): OuterFrame;
43
+ export declare function encodeInnerFrame(frame: InnerFrame): Uint8Array;
44
+ export declare function decodeInnerFrame(frame: Uint8Array): InnerFrame;
45
+ //# sourceMappingURL=framing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,oBAAY,cAAc;IACtB,cAAc,IAAI;IAClB,kBAAkB,IAAI;CACzB;AAED,oBAAY,cAAc;IACtB,kBAAkB,IAAI;IACtB,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,SAAS,IAAI;IACb,SAAS,IAAI;IACb,QAAQ,IAAI;IACZ,OAAO,IAAI;IACX,aAAa,KAAK;IAClB,WAAW,KAAK;IAChB,aAAa,KAAK;IAClB,eAAe,KAAK;IACpB,aAAa,KAAK;IAClB,cAAc,KAAK;IACnB,aAAa,KAAK;IAClB,WAAW,KAAK;IAChB,gBAAgB,KAAK;IACrB,cAAc,KAAK;IACnB,cAAc,KAAK;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,MAAyB,GACnC,UAAU,CAKZ;AAED,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,MAAyB,GACnC,UAAU,CAUZ;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAqB9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAgB9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAgB9D"}
@@ -0,0 +1,110 @@
1
+ import { PROTOCOL_VERSION } from './index.js';
2
+ export const MAX_CIPHERTEXT_BYTES = 65_535;
3
+ export const INNER_HEADER_BYTES = 13;
4
+ export var OuterFrameKind;
5
+ (function (OuterFrameKind) {
6
+ OuterFrameKind[OuterFrameKind["NoiseHandshake"] = 1] = "NoiseHandshake";
7
+ OuterFrameKind[OuterFrameKind["EncryptedTransport"] = 2] = "EncryptedTransport";
8
+ })(OuterFrameKind || (OuterFrameKind = {}));
9
+ export var InnerFrameType;
10
+ (function (InnerFrameType) {
11
+ InnerFrameType[InnerFrameType["SessionDescription"] = 1] = "SessionDescription";
12
+ InnerFrameType[InnerFrameType["SessionClose"] = 2] = "SessionClose";
13
+ InnerFrameType[InnerFrameType["PtyCreate"] = 3] = "PtyCreate";
14
+ InnerFrameType[InnerFrameType["PtyCreated"] = 4] = "PtyCreated";
15
+ InnerFrameType[InnerFrameType["PtyInput"] = 5] = "PtyInput";
16
+ InnerFrameType[InnerFrameType["PtyOutput"] = 6] = "PtyOutput";
17
+ InnerFrameType[InnerFrameType["PtyResize"] = 7] = "PtyResize";
18
+ InnerFrameType[InnerFrameType["PtyClose"] = 8] = "PtyClose";
19
+ InnerFrameType[InnerFrameType["PtyExit"] = 9] = "PtyExit";
20
+ InnerFrameType[InnerFrameType["ReplayRequest"] = 10] = "ReplayRequest";
21
+ InnerFrameType[InnerFrameType["ReplayStart"] = 11] = "ReplayStart";
22
+ InnerFrameType[InnerFrameType["ProtocolError"] = 12] = "ProtocolError";
23
+ InnerFrameType[InnerFrameType["TransferRequest"] = 13] = "TransferRequest";
24
+ InnerFrameType[InnerFrameType["TransferOffer"] = 14] = "TransferOffer";
25
+ InnerFrameType[InnerFrameType["TransferAccept"] = 15] = "TransferAccept";
26
+ InnerFrameType[InnerFrameType["TransferChunk"] = 16] = "TransferChunk";
27
+ InnerFrameType[InnerFrameType["TransferAck"] = 17] = "TransferAck";
28
+ InnerFrameType[InnerFrameType["TransferComplete"] = 18] = "TransferComplete";
29
+ InnerFrameType[InnerFrameType["TransferResult"] = 19] = "TransferResult";
30
+ InnerFrameType[InnerFrameType["TransferCancel"] = 20] = "TransferCancel";
31
+ })(InnerFrameType || (InnerFrameType = {}));
32
+ export function outerAssociatedData(kind, version = PROTOCOL_VERSION) {
33
+ assertUint8(version, 'Protocol version');
34
+ assertOuterKind(kind);
35
+ return Uint8Array.of(version, kind);
36
+ }
37
+ export function encodeOuterFrame(kind, payload, version = PROTOCOL_VERSION) {
38
+ if (payload.byteLength > MAX_CIPHERTEXT_BYTES) {
39
+ throw new RangeError(`Outer payload exceeds ${MAX_CIPHERTEXT_BYTES} bytes.`);
40
+ }
41
+ const frame = new Uint8Array(2 + payload.byteLength);
42
+ frame.set(outerAssociatedData(kind, version));
43
+ frame.set(payload, 2);
44
+ return frame;
45
+ }
46
+ export function decodeOuterFrame(frame) {
47
+ if (frame.byteLength < 2) {
48
+ throw new Error('Outer frame is missing its header.');
49
+ }
50
+ const version = frame[0];
51
+ const kind = frame[1];
52
+ if (version !== PROTOCOL_VERSION) {
53
+ throw new Error(`Unsupported AirTerm protocol version: ${version}.`);
54
+ }
55
+ assertOuterKind(kind);
56
+ const payload = frame.subarray(2);
57
+ if (payload.byteLength > MAX_CIPHERTEXT_BYTES) {
58
+ throw new RangeError(`Outer payload exceeds ${MAX_CIPHERTEXT_BYTES} bytes.`);
59
+ }
60
+ return { version, kind, payload };
61
+ }
62
+ export function encodeInnerFrame(frame) {
63
+ assertInnerType(frame.type);
64
+ assertUint32(frame.ptyId, 'PTY ID');
65
+ if (frame.sequence < 0n || frame.sequence > 0xffffffffffffffffn) {
66
+ throw new RangeError('Sequence must fit in an unsigned 64-bit integer.');
67
+ }
68
+ const encoded = new Uint8Array(INNER_HEADER_BYTES + frame.payload.byteLength);
69
+ const view = new DataView(encoded.buffer);
70
+ encoded[0] = frame.type;
71
+ view.setUint32(1, frame.ptyId, false);
72
+ view.setBigUint64(5, frame.sequence, false);
73
+ encoded.set(frame.payload, INNER_HEADER_BYTES);
74
+ return encoded;
75
+ }
76
+ export function decodeInnerFrame(frame) {
77
+ if (frame.byteLength < INNER_HEADER_BYTES) {
78
+ throw new Error('Inner frame is missing its header.');
79
+ }
80
+ const type = frame[0];
81
+ assertInnerType(type);
82
+ const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);
83
+ return {
84
+ type,
85
+ ptyId: view.getUint32(1, false),
86
+ sequence: view.getBigUint64(5, false),
87
+ payload: frame.subarray(INNER_HEADER_BYTES),
88
+ };
89
+ }
90
+ function assertOuterKind(kind) {
91
+ if (!Object.values(OuterFrameKind).includes(kind)) {
92
+ throw new Error(`Unknown outer frame kind: ${kind}.`);
93
+ }
94
+ }
95
+ function assertInnerType(type) {
96
+ if (!Object.values(InnerFrameType).includes(type)) {
97
+ throw new Error(`Unknown inner frame type: ${type}.`);
98
+ }
99
+ }
100
+ function assertUint8(value, label) {
101
+ if (!Number.isInteger(value) || value < 0 || value > 0xff) {
102
+ throw new RangeError(`${label} must fit in an unsigned byte.`);
103
+ }
104
+ }
105
+ function assertUint32(value, label) {
106
+ if (!Number.isInteger(value) || value < 0 || value > 0xffff_ffff) {
107
+ throw new RangeError(`${label} must fit in an unsigned 32-bit integer.`);
108
+ }
109
+ }
110
+ //# sourceMappingURL=framing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framing.js","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const PROTOCOL_VERSION: 1;
2
+ export { decodeInnerFrame, decodeOuterFrame, encodeInnerFrame, encodeOuterFrame, INNER_HEADER_BYTES, InnerFrameType, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from './framing.js';
3
+ export type { InnerFrame, OuterFrame } from './framing.js';
4
+ export { createNoisePrologue, MAX_TRANSPORT_FRAMES, NOISE_PROTOCOL_NAME, NoiseTransport, } from './noise.js';
5
+ export type { NoiseTransportOptions } from './noise.js';
6
+ export { decodeProtocolError, decodePtyExit, decodePtyResize, decodeReplayStart, decodeSessionDescription, encodeProtocolError, encodePtyExit, encodePtyResize, encodeReplayStart, encodeSessionDescription, } from './messages.js';
7
+ export type { ProtocolErrorMessage, PtyExitMessage, ReplayStartMessage, SessionDescription, SessionMode, TerminalDescription, TerminalFontDescription, TerminalFontFormat, SessionFeature, } from './messages.js';
8
+ export { decodeTransferCancel, decodeTransferChunk, decodeTransferControl, decodeTransferOffer, decodeTransferRequest, decodeTransferResult, encodeTransferCancel, encodeTransferChunk, encodeTransferControl, encodeTransferOffer, encodeTransferRequest, encodeTransferResult, generateTransferId, hasTransferTimedOut, TRANSFER_CHUNK_BYTES, TRANSFER_IDLE_TIMEOUT_MS, TRANSFER_ID_BYTES, TRANSFER_WINDOW_BYTES, TransferReceiverState, TransferSenderState, } from './transfers.js';
9
+ export type { TransferCancelMessage, TransferChunkPayload, TransferControlMessage, TransferDirection, TransferOfferMessage, TransferPurpose, TransferRequestMessage, TransferResultMessage, } from './transfers.js';
10
+ export { createCapabilityUrl, decodeBase64Url, deriveCapabilityKeys, encodeBase64Url, generateCapabilityMaterial, normalizeServerUrl, parseCapabilityUrl, ROOT_SECRET_LENGTH, SESSION_ID_LENGTH, } from './capability.js';
11
+ export type { CapabilityKeys, CapabilityMaterial, ParsedCapability, } from './capability.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAC3C,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACtB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,MAAM,eAAe,CAAC;AACvB,YAAY,EACR,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACR,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACR,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACnB,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export const PROTOCOL_VERSION = 1;
2
+ export { decodeInnerFrame, decodeOuterFrame, encodeInnerFrame, encodeOuterFrame, INNER_HEADER_BYTES, InnerFrameType, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from './framing.js';
3
+ export { createNoisePrologue, MAX_TRANSPORT_FRAMES, NOISE_PROTOCOL_NAME, NoiseTransport, } from './noise.js';
4
+ export { decodeProtocolError, decodePtyExit, decodePtyResize, decodeReplayStart, decodeSessionDescription, encodeProtocolError, encodePtyExit, encodePtyResize, encodeReplayStart, encodeSessionDescription, } from './messages.js';
5
+ export { decodeTransferCancel, decodeTransferChunk, decodeTransferControl, decodeTransferOffer, decodeTransferRequest, decodeTransferResult, encodeTransferCancel, encodeTransferChunk, encodeTransferControl, encodeTransferOffer, encodeTransferRequest, encodeTransferResult, generateTransferId, hasTransferTimedOut, TRANSFER_CHUNK_BYTES, TRANSFER_IDLE_TIMEOUT_MS, TRANSFER_ID_BYTES, TRANSFER_WINDOW_BYTES, TransferReceiverState, TransferSenderState, } from './transfers.js';
6
+ export { createCapabilityUrl, decodeBase64Url, deriveCapabilityKeys, encodeBase64Url, generateCapabilityMaterial, normalizeServerUrl, parseCapabilityUrl, ROOT_SECRET_LENGTH, SESSION_ID_LENGTH, } from './capability.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAC3C,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,MAAM,eAAe,CAAC;AAYvB,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EACH,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,50 @@
1
+ export type SessionMode = 'shell' | 'command';
2
+ export type SessionFeature = 'stream-transfer-v1' | 'terminal-font-v1' | 'image-paste-v1';
3
+ export type TerminalFontFormat = 'ttf' | 'otf' | 'woff' | 'woff2';
4
+ export interface TerminalFontDescription {
5
+ assetId: string;
6
+ format: TerminalFontFormat;
7
+ byteLength: string;
8
+ sha256: string;
9
+ }
10
+ export interface TerminalDescription {
11
+ ptyId: number;
12
+ title: string;
13
+ running: boolean;
14
+ baseOffset: bigint;
15
+ nextOffset: bigint;
16
+ }
17
+ export interface SessionDescription {
18
+ mode: SessionMode;
19
+ maxTabs: number;
20
+ terminals: TerminalDescription[];
21
+ features?: SessionFeature[];
22
+ font?: TerminalFontDescription;
23
+ }
24
+ export interface PtyExitMessage {
25
+ exitCode: number;
26
+ signal?: number;
27
+ }
28
+ export interface ReplayStartMessage {
29
+ baseOffset: bigint;
30
+ nextOffset: bigint;
31
+ truncated: boolean;
32
+ }
33
+ export interface ProtocolErrorMessage {
34
+ code: string;
35
+ message: string;
36
+ }
37
+ export declare function encodeSessionDescription(description: SessionDescription): Uint8Array;
38
+ export declare function decodeSessionDescription(payload: Uint8Array): SessionDescription;
39
+ export declare function encodePtyResize(columns: number, rows: number): Uint8Array;
40
+ export declare function decodePtyResize(payload: Uint8Array): {
41
+ columns: number;
42
+ rows: number;
43
+ };
44
+ export declare function encodePtyExit(message: PtyExitMessage): Uint8Array;
45
+ export declare function decodePtyExit(payload: Uint8Array): PtyExitMessage;
46
+ export declare function encodeReplayStart(message: ReplayStartMessage): Uint8Array;
47
+ export declare function decodeReplayStart(payload: Uint8Array): ReplayStartMessage;
48
+ export declare function encodeProtocolError(error: ProtocolErrorMessage): Uint8Array;
49
+ export declare function decodeProtocolError(payload: Uint8Array): ProtocolErrorMessage;
50
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAC9C,MAAM,MAAM,cAAc,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,gBAAgB,CAAC;AAEvB,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,kBAAkB,GAAG,UAAU,CAuBpF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAuBhF;AAkDD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAWzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CActF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAKjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAejE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAMzE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAgBzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,UAAU,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,oBAAoB,CAQ7E"}