@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.
@@ -0,0 +1,199 @@
1
+ export function encodeSessionDescription(description) {
2
+ return encodeJson({
3
+ mode: description.mode,
4
+ max_tabs: description.maxTabs,
5
+ features: description.features ?? [],
6
+ ...(description.font === undefined
7
+ ? {}
8
+ : {
9
+ font: {
10
+ asset_id: description.font.assetId,
11
+ format: description.font.format,
12
+ byte_length: description.font.byteLength,
13
+ sha256: description.font.sha256,
14
+ },
15
+ }),
16
+ terminals: description.terminals.map((terminal) => ({
17
+ pty_id: terminal.ptyId,
18
+ title: terminal.title,
19
+ running: terminal.running,
20
+ base_offset: terminal.baseOffset.toString(),
21
+ next_offset: terminal.nextOffset.toString(),
22
+ })),
23
+ });
24
+ }
25
+ export function decodeSessionDescription(payload) {
26
+ const value = decodeRecord(payload);
27
+ if ((value.mode !== 'shell' && value.mode !== 'command') ||
28
+ !isPositiveInteger(value.max_tabs) ||
29
+ !Array.isArray(value.terminals)) {
30
+ throw new Error('Invalid session description payload.');
31
+ }
32
+ const features = decodeSessionFeatures(value.features);
33
+ const font = value.font === undefined
34
+ ? undefined
35
+ : decodeTerminalFont(value.font);
36
+ return {
37
+ mode: value.mode,
38
+ maxTabs: value.max_tabs,
39
+ terminals: value.terminals.map((terminal) => decodeTerminalDescription(terminal)),
40
+ features,
41
+ ...(font === undefined ? {} : { font }),
42
+ };
43
+ }
44
+ function decodeSessionFeatures(value) {
45
+ if (value === undefined) {
46
+ return [];
47
+ }
48
+ if (!Array.isArray(value) || value.some((feature) => typeof feature !== 'string')) {
49
+ throw new Error('Invalid session features payload.');
50
+ }
51
+ const supported = new Set([
52
+ 'stream-transfer-v1',
53
+ 'terminal-font-v1',
54
+ 'image-paste-v1',
55
+ ]);
56
+ return value.filter((feature) => supported.has(feature));
57
+ }
58
+ function decodeTerminalFont(value) {
59
+ if (!isRecord(value)) {
60
+ throw new Error('Invalid terminal font payload.');
61
+ }
62
+ if (typeof value.asset_id !== 'string' ||
63
+ !isTerminalFontFormat(value.format) ||
64
+ typeof value.byte_length !== 'string' ||
65
+ typeof value.sha256 !== 'string' ||
66
+ !/^\d+$/.test(value.byte_length) ||
67
+ !/^[A-Za-z0-9_-]{43}$/.test(value.asset_id) ||
68
+ !/^[A-Za-z0-9_-]{43}$/.test(value.sha256)) {
69
+ throw new Error('Invalid terminal font payload.');
70
+ }
71
+ return {
72
+ assetId: value.asset_id,
73
+ format: value.format,
74
+ byteLength: value.byte_length,
75
+ sha256: value.sha256,
76
+ };
77
+ }
78
+ function isTerminalFontFormat(value) {
79
+ return value === 'ttf' || value === 'otf' || value === 'woff' || value === 'woff2';
80
+ }
81
+ export function encodePtyResize(columns, rows) {
82
+ if (!isPositiveInteger(columns) || !isPositiveInteger(rows)) {
83
+ throw new Error('PTY dimensions must be positive integers.');
84
+ }
85
+ const payload = new Uint8Array(8);
86
+ const view = new DataView(payload.buffer);
87
+ view.setUint32(0, columns, false);
88
+ view.setUint32(4, rows, false);
89
+ return payload;
90
+ }
91
+ export function decodePtyResize(payload) {
92
+ if (payload.byteLength !== 8) {
93
+ throw new Error('Invalid PTY resize payload.');
94
+ }
95
+ const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
96
+ const columns = view.getUint32(0, false);
97
+ const rows = view.getUint32(4, false);
98
+ if (columns === 0 || rows === 0) {
99
+ throw new Error('Invalid PTY resize payload.');
100
+ }
101
+ return { columns, rows };
102
+ }
103
+ export function encodePtyExit(message) {
104
+ return encodeJson({
105
+ exit_code: message.exitCode,
106
+ ...(message.signal === undefined ? {} : { signal: message.signal }),
107
+ });
108
+ }
109
+ export function decodePtyExit(payload) {
110
+ const value = decodeRecord(payload);
111
+ if (!Number.isInteger(value.exit_code)) {
112
+ throw new Error('Invalid PTY exit payload.');
113
+ }
114
+ if (value.signal !== undefined && !Number.isInteger(value.signal)) {
115
+ throw new Error('Invalid PTY exit payload.');
116
+ }
117
+ return {
118
+ exitCode: value.exit_code,
119
+ ...(value.signal === undefined ? {} : { signal: value.signal }),
120
+ };
121
+ }
122
+ export function encodeReplayStart(message) {
123
+ return encodeJson({
124
+ base_offset: message.baseOffset.toString(),
125
+ next_offset: message.nextOffset.toString(),
126
+ truncated: message.truncated,
127
+ });
128
+ }
129
+ export function decodeReplayStart(payload) {
130
+ const value = decodeRecord(payload);
131
+ if (typeof value.base_offset !== 'string' ||
132
+ typeof value.next_offset !== 'string' ||
133
+ typeof value.truncated !== 'boolean') {
134
+ throw new Error('Invalid replay start payload.');
135
+ }
136
+ return {
137
+ baseOffset: parseUnsignedBigInt(value.base_offset),
138
+ nextOffset: parseUnsignedBigInt(value.next_offset),
139
+ truncated: value.truncated,
140
+ };
141
+ }
142
+ export function encodeProtocolError(error) {
143
+ return encodeJson(error);
144
+ }
145
+ export function decodeProtocolError(payload) {
146
+ const value = decodeRecord(payload);
147
+ if (typeof value.code !== 'string' || typeof value.message !== 'string') {
148
+ throw new Error('Invalid protocol error payload.');
149
+ }
150
+ return { code: value.code, message: value.message };
151
+ }
152
+ function decodeTerminalDescription(value) {
153
+ if (!isRecord(value)) {
154
+ throw new Error('Invalid terminal description payload.');
155
+ }
156
+ if (!isPositiveInteger(value.pty_id) ||
157
+ typeof value.title !== 'string' ||
158
+ typeof value.running !== 'boolean' ||
159
+ typeof value.base_offset !== 'string' ||
160
+ typeof value.next_offset !== 'string') {
161
+ throw new Error('Invalid terminal description payload.');
162
+ }
163
+ return {
164
+ ptyId: value.pty_id,
165
+ title: value.title,
166
+ running: value.running,
167
+ baseOffset: parseUnsignedBigInt(value.base_offset),
168
+ nextOffset: parseUnsignedBigInt(value.next_offset),
169
+ };
170
+ }
171
+ function encodeJson(value) {
172
+ return new TextEncoder().encode(JSON.stringify(value));
173
+ }
174
+ function decodeRecord(payload) {
175
+ let value;
176
+ try {
177
+ value = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(payload));
178
+ }
179
+ catch {
180
+ throw new Error('Invalid JSON protocol payload.');
181
+ }
182
+ if (!isRecord(value)) {
183
+ throw new Error('Protocol payload must be an object.');
184
+ }
185
+ return value;
186
+ }
187
+ function isRecord(value) {
188
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
189
+ }
190
+ function isPositiveInteger(value) {
191
+ return Number.isInteger(value) && value > 0;
192
+ }
193
+ function parseUnsignedBigInt(value) {
194
+ if (!/^\d+$/.test(value)) {
195
+ throw new Error('Invalid unsigned offset.');
196
+ }
197
+ return BigInt(value);
198
+ }
199
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const NOISE_PROTOCOL_NAME = "Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b";
2
+ export declare const MAX_TRANSPORT_FRAMES: number;
3
+ export interface NoiseTransportOptions {
4
+ initiator: boolean;
5
+ psk: Uint8Array;
6
+ sessionId: string;
7
+ connectionId: string;
8
+ protocolVersion?: number;
9
+ }
10
+ export declare class NoiseTransport {
11
+ #private;
12
+ constructor(options: NoiseTransportOptions);
13
+ get complete(): boolean;
14
+ get handshakeHash(): Uint8Array | undefined;
15
+ writeHandshake(payload?: Uint8Array<ArrayBuffer>): Uint8Array;
16
+ readHandshake(frame: Uint8Array): Uint8Array;
17
+ encrypt(plaintext: Uint8Array): Uint8Array;
18
+ decrypt(frame: Uint8Array): Uint8Array;
19
+ }
20
+ export declare function createNoisePrologue(sessionId: string, connectionId: string, protocolVersion?: number): Uint8Array;
21
+ //# sourceMappingURL=noise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../src/noise.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB,0CAA0C,CAAC;AAC3E,eAAO,MAAM,oBAAoB,QAAU,CAAC;AAG5C,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,cAAc;;gBAUJ,OAAO,EAAE,qBAAqB;IAmBjD,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,IAAW,aAAa,IAAI,UAAU,GAAG,SAAS,CAIjD;IAEM,cAAc,CAAC,OAAO,0BAAmB,GAAG,UAAU;IAatD,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAe5C,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAwB1C,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;CAgEhD;AAED,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,eAAe,GAAE,MAAyB,GAC3C,UAAU,CAQZ"}
package/dist/noise.js ADDED
@@ -0,0 +1,122 @@
1
+ import NoiseCipher from 'noise-handshake/cipher.js';
2
+ import NoiseHandshake from 'noise-handshake';
3
+ import { decodeOuterFrame, encodeOuterFrame, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from './framing.js';
4
+ import { PROTOCOL_VERSION } from './index.js';
5
+ export const NOISE_PROTOCOL_NAME = 'Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b';
6
+ export const MAX_TRANSPORT_FRAMES = 2 ** 31;
7
+ const NOISE_TAG_BYTES = 16;
8
+ export class NoiseTransport {
9
+ #handshake;
10
+ #initiator;
11
+ #version;
12
+ #handshakeStep = 0;
13
+ #sender;
14
+ #receiver;
15
+ #sentFrames = 0;
16
+ #receivedFrames = 0;
17
+ constructor(options) {
18
+ if (options.psk.byteLength !== 32) {
19
+ throw new Error('Noise PSK must contain exactly 32 bytes.');
20
+ }
21
+ this.#initiator = options.initiator;
22
+ this.#version = options.protocolVersion ?? PROTOCOL_VERSION;
23
+ this.#handshake = new NoiseHandshake('NNpsk0', options.initiator, undefined, {
24
+ psk: copyBytes(options.psk),
25
+ });
26
+ this.#handshake.initialise(createNoisePrologue(options.sessionId, options.connectionId, this.#version));
27
+ }
28
+ get complete() {
29
+ return this.#handshake.complete;
30
+ }
31
+ get handshakeHash() {
32
+ return this.#handshake.hash === null
33
+ ? undefined
34
+ : copyBytes(this.#handshake.hash);
35
+ }
36
+ writeHandshake(payload = new Uint8Array()) {
37
+ this.#assertHandshakeTurn('write');
38
+ const message = this.#handshake.send(payload);
39
+ this.#handshakeStep += 1;
40
+ this.#activateTransportIfReady();
41
+ return encodeOuterFrame(OuterFrameKind.NoiseHandshake, copyBytes(message), this.#version);
42
+ }
43
+ readHandshake(frame) {
44
+ this.#assertHandshakeTurn('read');
45
+ const outer = decodeOuterFrame(frame);
46
+ if (outer.kind !== OuterFrameKind.NoiseHandshake) {
47
+ throw new Error('Expected a Noise handshake frame.');
48
+ }
49
+ const payload = this.#handshake.recv(outer.payload);
50
+ this.#handshakeStep += 1;
51
+ this.#activateTransportIfReady();
52
+ return copyBytes(payload);
53
+ }
54
+ encrypt(plaintext) {
55
+ const sender = this.#requireSender();
56
+ if (this.#sentFrames >= MAX_TRANSPORT_FRAMES) {
57
+ throw new Error('Noise transport frame limit reached; reconnect required.');
58
+ }
59
+ if (plaintext.byteLength + NOISE_TAG_BYTES > MAX_CIPHERTEXT_BYTES) {
60
+ throw new RangeError('Plaintext is too large for one Noise transport frame.');
61
+ }
62
+ const ciphertext = sender.encrypt(plaintext, outerAssociatedData(OuterFrameKind.EncryptedTransport, this.#version));
63
+ this.#sentFrames += 1;
64
+ return encodeOuterFrame(OuterFrameKind.EncryptedTransport, copyBytes(ciphertext), this.#version);
65
+ }
66
+ decrypt(frame) {
67
+ const receiver = this.#requireReceiver();
68
+ if (this.#receivedFrames >= MAX_TRANSPORT_FRAMES) {
69
+ throw new Error('Noise transport frame limit reached; reconnect required.');
70
+ }
71
+ const outer = decodeOuterFrame(frame);
72
+ if (outer.kind !== OuterFrameKind.EncryptedTransport) {
73
+ throw new Error('Expected an encrypted Noise transport frame.');
74
+ }
75
+ const plaintext = receiver.decrypt(outer.payload, outerAssociatedData(outer.kind, outer.version));
76
+ this.#receivedFrames += 1;
77
+ return copyBytes(plaintext);
78
+ }
79
+ #activateTransportIfReady() {
80
+ if (!this.#handshake.complete || this.#sender !== undefined) {
81
+ return;
82
+ }
83
+ if (this.#handshake.tx === null || this.#handshake.rx === null) {
84
+ throw new Error('Noise handshake completed without transport keys.');
85
+ }
86
+ this.#sender = new NoiseCipher(this.#handshake.tx);
87
+ this.#receiver = new NoiseCipher(this.#handshake.rx);
88
+ }
89
+ #assertHandshakeTurn(action) {
90
+ if (this.complete) {
91
+ throw new Error('Noise handshake is already complete.');
92
+ }
93
+ const shouldWrite = this.#initiator
94
+ ? this.#handshakeStep === 0
95
+ : this.#handshakeStep === 1;
96
+ if ((action === 'write') !== shouldWrite) {
97
+ throw new Error(`Noise handshake expected a ${shouldWrite ? 'write' : 'read'}.`);
98
+ }
99
+ }
100
+ #requireSender() {
101
+ if (this.#sender === undefined) {
102
+ throw new Error('Noise handshake is not complete.');
103
+ }
104
+ return this.#sender;
105
+ }
106
+ #requireReceiver() {
107
+ if (this.#receiver === undefined) {
108
+ throw new Error('Noise handshake is not complete.');
109
+ }
110
+ return this.#receiver;
111
+ }
112
+ }
113
+ export function createNoisePrologue(sessionId, connectionId, protocolVersion = PROTOCOL_VERSION) {
114
+ if (sessionId.length === 0 || connectionId.length === 0) {
115
+ throw new Error('Noise prologue identifiers must not be empty.');
116
+ }
117
+ return new TextEncoder().encode(`airterm/v${protocolVersion}\u0000${sessionId}\u0000${connectionId}`);
118
+ }
119
+ function copyBytes(bytes) {
120
+ return Uint8Array.from(bytes);
121
+ }
122
+ //# sourceMappingURL=noise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.js","sourceRoot":"","sources":["../src/noise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export declare const TRANSFER_ID_BYTES = 16;
2
+ export declare const TRANSFER_CHUNK_BYTES: number;
3
+ export declare const TRANSFER_WINDOW_BYTES: number;
4
+ export declare const TRANSFER_IDLE_TIMEOUT_MS = 30000;
5
+ export type TransferPurpose = 'terminal-font' | 'clipboard-image';
6
+ export type TransferDirection = 'agent-to-browser' | 'browser-to-agent';
7
+ export interface TransferRequestMessage {
8
+ assetId: string;
9
+ }
10
+ export interface TransferOfferMessage {
11
+ transferId: string;
12
+ purpose: TransferPurpose;
13
+ direction: TransferDirection;
14
+ mimeType: string;
15
+ displayName: string;
16
+ byteLength: bigint;
17
+ sha256?: string;
18
+ }
19
+ export interface TransferControlMessage {
20
+ transferId: string;
21
+ }
22
+ export interface TransferResultMessage extends TransferControlMessage {
23
+ path?: string;
24
+ pasteText?: string;
25
+ }
26
+ export interface TransferCancelMessage extends TransferControlMessage {
27
+ code: string;
28
+ message: string;
29
+ }
30
+ export interface TransferChunkPayload {
31
+ transferId: string;
32
+ bytes: Uint8Array;
33
+ }
34
+ export declare function generateTransferId(randomValues?: (target: Uint8Array) => Uint8Array): string;
35
+ export declare function encodeTransferRequest(message: TransferRequestMessage): Uint8Array;
36
+ export declare function decodeTransferRequest(payload: Uint8Array): TransferRequestMessage;
37
+ export declare function encodeTransferOffer(message: TransferOfferMessage): Uint8Array;
38
+ export declare function decodeTransferOffer(payload: Uint8Array): TransferOfferMessage;
39
+ export declare function encodeTransferControl(message: TransferControlMessage): Uint8Array;
40
+ export declare function decodeTransferControl(payload: Uint8Array): TransferControlMessage;
41
+ export declare function encodeTransferResult(message: TransferResultMessage): Uint8Array;
42
+ export declare function decodeTransferResult(payload: Uint8Array): TransferResultMessage;
43
+ export declare function encodeTransferCancel(message: TransferCancelMessage): Uint8Array;
44
+ export declare function decodeTransferCancel(payload: Uint8Array): TransferCancelMessage;
45
+ export declare function encodeTransferChunk(message: TransferChunkPayload): Uint8Array;
46
+ export declare function decodeTransferChunk(payload: Uint8Array): TransferChunkPayload;
47
+ export declare class TransferSenderState {
48
+ readonly offer: TransferOfferMessage;
49
+ sentOffset: bigint;
50
+ acknowledgedOffset: bigint;
51
+ accepted: boolean;
52
+ finished: boolean;
53
+ constructor(offer: TransferOfferMessage);
54
+ accept(): void;
55
+ availableWindow(): number;
56
+ recordChunk(offset: bigint, byteLength: number): void;
57
+ acknowledge(nextOffset: bigint): void;
58
+ complete(): void;
59
+ cancel(): void;
60
+ }
61
+ export declare class TransferReceiverState {
62
+ readonly offer: TransferOfferMessage;
63
+ receivedOffset: bigint;
64
+ finished: boolean;
65
+ constructor(offer: TransferOfferMessage);
66
+ recordChunk(offset: bigint, byteLength: number): bigint;
67
+ complete(offset: bigint): void;
68
+ cancel(): void;
69
+ }
70
+ export declare function hasTransferTimedOut(lastActivityAt: number, now?: number): boolean;
71
+ //# sourceMappingURL=transfers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfers.d.ts","sourceRoot":"","sources":["../src/transfers.ts"],"names":[],"mappings":"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"}