@shhhum/xftp-web 0.1.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.
Files changed (74) hide show
  1. package/README.md +47 -0
  2. package/dist/agent.d.ts +46 -0
  3. package/dist/agent.js +273 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/client.d.ts +63 -0
  6. package/dist/client.js +353 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/crypto/digest.d.ts +3 -0
  9. package/dist/crypto/digest.js +23 -0
  10. package/dist/crypto/digest.js.map +1 -0
  11. package/dist/crypto/file.d.ts +14 -0
  12. package/dist/crypto/file.js +68 -0
  13. package/dist/crypto/file.js.map +1 -0
  14. package/dist/crypto/identity.d.ts +10 -0
  15. package/dist/crypto/identity.js +98 -0
  16. package/dist/crypto/identity.js.map +1 -0
  17. package/dist/crypto/keys.d.ts +27 -0
  18. package/dist/crypto/keys.js +138 -0
  19. package/dist/crypto/keys.js.map +1 -0
  20. package/dist/crypto/padding.d.ts +8 -0
  21. package/dist/crypto/padding.js +60 -0
  22. package/dist/crypto/padding.js.map +1 -0
  23. package/dist/crypto/secretbox.d.ts +22 -0
  24. package/dist/crypto/secretbox.js +195 -0
  25. package/dist/crypto/secretbox.js.map +1 -0
  26. package/dist/download.d.ts +9 -0
  27. package/dist/download.js +60 -0
  28. package/dist/download.js.map +1 -0
  29. package/dist/index.d.ts +4 -0
  30. package/dist/index.js +4 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/protocol/address.d.ts +7 -0
  33. package/dist/protocol/address.js +50 -0
  34. package/dist/protocol/address.js.map +1 -0
  35. package/dist/protocol/chunks.d.ts +15 -0
  36. package/dist/protocol/chunks.js +75 -0
  37. package/dist/protocol/chunks.js.map +1 -0
  38. package/dist/protocol/client.d.ts +9 -0
  39. package/dist/protocol/client.js +69 -0
  40. package/dist/protocol/client.js.map +1 -0
  41. package/dist/protocol/commands.d.ts +68 -0
  42. package/dist/protocol/commands.js +115 -0
  43. package/dist/protocol/commands.js.map +1 -0
  44. package/dist/protocol/description.d.ts +37 -0
  45. package/dist/protocol/description.js +317 -0
  46. package/dist/protocol/description.js.map +1 -0
  47. package/dist/protocol/encoding.d.ts +34 -0
  48. package/dist/protocol/encoding.js +197 -0
  49. package/dist/protocol/encoding.js.map +1 -0
  50. package/dist/protocol/handshake.d.ts +47 -0
  51. package/dist/protocol/handshake.js +158 -0
  52. package/dist/protocol/handshake.js.map +1 -0
  53. package/dist/protocol/transmission.d.ts +15 -0
  54. package/dist/protocol/transmission.js +84 -0
  55. package/dist/protocol/transmission.js.map +1 -0
  56. package/package.json +40 -0
  57. package/src/agent.ts +372 -0
  58. package/src/client.ts +448 -0
  59. package/src/crypto/digest.ts +26 -0
  60. package/src/crypto/file.ts +94 -0
  61. package/src/crypto/identity.ts +112 -0
  62. package/src/crypto/keys.ts +172 -0
  63. package/src/crypto/padding.ts +61 -0
  64. package/src/crypto/secretbox.ts +219 -0
  65. package/src/download.ts +76 -0
  66. package/src/index.ts +4 -0
  67. package/src/protocol/address.ts +54 -0
  68. package/src/protocol/chunks.ts +86 -0
  69. package/src/protocol/client.ts +95 -0
  70. package/src/protocol/commands.ts +157 -0
  71. package/src/protocol/description.ts +363 -0
  72. package/src/protocol/encoding.ts +224 -0
  73. package/src/protocol/handshake.ts +220 -0
  74. package/src/protocol/transmission.ts +113 -0
@@ -0,0 +1,317 @@
1
+ // XFTP file description encoding/decoding -- Simplex.FileTransfer.Description
2
+ //
3
+ // Handles YAML-encoded file descriptions matching Haskell Data.Yaml output format.
4
+ // Base64url encoding matches Haskell Data.ByteString.Base64.URL.encode (with padding).
5
+ // -- Base64url (RFC 4648 section 5) with '=' padding
6
+ const B64URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
7
+ const B64_DECODE = new Uint8Array(128);
8
+ B64_DECODE.fill(0xff);
9
+ for (let i = 0; i < 64; i++)
10
+ B64_DECODE[B64URL.charCodeAt(i)] = i;
11
+ export function base64urlEncode(data) {
12
+ let result = "";
13
+ const len = data.length;
14
+ let i = 0;
15
+ for (; i + 2 < len; i += 3) {
16
+ const b0 = data[i], b1 = data[i + 1], b2 = data[i + 2];
17
+ result += B64URL[b0 >>> 2];
18
+ result += B64URL[((b0 & 3) << 4) | (b1 >>> 4)];
19
+ result += B64URL[((b1 & 15) << 2) | (b2 >>> 6)];
20
+ result += B64URL[b2 & 63];
21
+ }
22
+ if (i < len) {
23
+ const b0 = data[i];
24
+ result += B64URL[b0 >>> 2];
25
+ if (i + 1 < len) {
26
+ const b1 = data[i + 1];
27
+ result += B64URL[((b0 & 3) << 4) | (b1 >>> 4)];
28
+ result += B64URL[(b1 & 15) << 2];
29
+ result += "=";
30
+ }
31
+ else {
32
+ result += B64URL[(b0 & 3) << 4];
33
+ result += "==";
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ export function base64urlDecode(s) {
39
+ let end = s.length;
40
+ while (end > 0 && s.charCodeAt(end - 1) === 0x3d)
41
+ end--; // strip '='
42
+ const n = end;
43
+ const out = new Uint8Array((n * 3) >>> 2);
44
+ let j = 0, i = 0;
45
+ for (; i + 3 < n; i += 4) {
46
+ const a = B64_DECODE[s.charCodeAt(i)], b = B64_DECODE[s.charCodeAt(i + 1)];
47
+ const c = B64_DECODE[s.charCodeAt(i + 2)], d = B64_DECODE[s.charCodeAt(i + 3)];
48
+ out[j++] = (a << 2) | (b >>> 4);
49
+ out[j++] = ((b & 15) << 4) | (c >>> 2);
50
+ out[j++] = ((c & 3) << 6) | d;
51
+ }
52
+ if (n - i >= 2) {
53
+ const a = B64_DECODE[s.charCodeAt(i)], b = B64_DECODE[s.charCodeAt(i + 1)];
54
+ out[j++] = (a << 2) | (b >>> 4);
55
+ if (n - i >= 3) {
56
+ const c = B64_DECODE[s.charCodeAt(i + 2)];
57
+ out[j++] = ((b & 15) << 4) | (c >>> 2);
58
+ }
59
+ }
60
+ return out;
61
+ }
62
+ // -- FileSize encoding/decoding
63
+ export const kb = (n) => n * 1024;
64
+ export const mb = (n) => n * 1048576;
65
+ export const gb = (n) => n * 1073741824;
66
+ export function encodeFileSize(bytes) {
67
+ const ks = Math.floor(bytes / 1024);
68
+ if (bytes % 1024 !== 0)
69
+ return String(bytes);
70
+ const ms = Math.floor(ks / 1024);
71
+ if (ks % 1024 !== 0)
72
+ return ks + "kb";
73
+ const gs = Math.floor(ms / 1024);
74
+ if (ms % 1024 !== 0)
75
+ return ms + "mb";
76
+ return gs + "gb";
77
+ }
78
+ export function decodeFileSize(s) {
79
+ if (s.endsWith("gb"))
80
+ return parseInt(s) * 1073741824;
81
+ if (s.endsWith("mb"))
82
+ return parseInt(s) * 1048576;
83
+ if (s.endsWith("kb"))
84
+ return parseInt(s) * 1024;
85
+ return parseInt(s);
86
+ }
87
+ // -- Server replica colon-separated format
88
+ function encodeServerReplica(r) {
89
+ let s = r.chunkNo + ":" + base64urlEncode(r.replicaId) + ":" + base64urlEncode(r.replicaKey);
90
+ if (r.digest !== null)
91
+ s += ":" + base64urlEncode(r.digest);
92
+ if (r.chunkSize !== null)
93
+ s += ":" + encodeFileSize(r.chunkSize);
94
+ return s;
95
+ }
96
+ function decodeServerReplica(server, s) {
97
+ const parts = s.split(":");
98
+ if (parts.length < 3)
99
+ throw new Error("invalid server replica: " + s);
100
+ return {
101
+ chunkNo: parseInt(parts[0]),
102
+ server,
103
+ replicaId: base64urlDecode(parts[1]),
104
+ replicaKey: base64urlDecode(parts[2]),
105
+ digest: parts.length >= 4 ? base64urlDecode(parts[3]) : null,
106
+ chunkSize: parts.length >= 5 ? decodeFileSize(parts[4]) : null
107
+ };
108
+ }
109
+ // -- Unfold chunks to flat replicas
110
+ function unfoldChunksToReplicas(defChunkSize, chunks) {
111
+ const result = [];
112
+ for (const c of chunks) {
113
+ c.replicas.forEach((r, idx) => {
114
+ result.push({
115
+ chunkNo: c.chunkNo,
116
+ server: r.server,
117
+ replicaId: r.replicaId,
118
+ replicaKey: r.replicaKey,
119
+ digest: idx === 0 ? c.digest : null,
120
+ chunkSize: c.chunkSize !== defChunkSize && idx === 0 ? c.chunkSize : null
121
+ });
122
+ });
123
+ }
124
+ return result;
125
+ }
126
+ // -- Group replicas by server (for YAML encoding)
127
+ function encodeFileReplicas(defChunkSize, chunks) {
128
+ const flat = unfoldChunksToReplicas(defChunkSize, chunks);
129
+ // Sort by server URI string (matches Haskell Ord for ProtocolServer when
130
+ // all servers share the same scheme and keyHash -- true for typical use).
131
+ flat.sort((a, b) => a.server < b.server ? -1 : a.server > b.server ? 1 : 0);
132
+ const groups = [];
133
+ for (const r of flat) {
134
+ if (groups.length === 0 || groups[groups.length - 1].server !== r.server) {
135
+ groups.push({ server: r.server, chunks: [encodeServerReplica(r)] });
136
+ }
137
+ else {
138
+ groups[groups.length - 1].chunks.push(encodeServerReplica(r));
139
+ }
140
+ }
141
+ return groups;
142
+ }
143
+ // -- Fold flat replicas back into FileChunks
144
+ function bytesEqual(a, b) {
145
+ if (a.length !== b.length)
146
+ return false;
147
+ for (let i = 0; i < a.length; i++)
148
+ if (a[i] !== b[i])
149
+ return false;
150
+ return true;
151
+ }
152
+ function foldReplicasToChunks(defChunkSize, replicas) {
153
+ const sizes = new Map();
154
+ const digests = new Map();
155
+ for (const r of replicas) {
156
+ if (r.chunkSize !== null) {
157
+ const existing = sizes.get(r.chunkNo);
158
+ if (existing !== undefined && existing !== r.chunkSize)
159
+ throw new Error("different size in chunk replicas");
160
+ sizes.set(r.chunkNo, r.chunkSize);
161
+ }
162
+ if (r.digest !== null) {
163
+ const existing = digests.get(r.chunkNo);
164
+ if (existing !== undefined && !bytesEqual(existing, r.digest))
165
+ throw new Error("different digest in chunk replicas");
166
+ digests.set(r.chunkNo, r.digest);
167
+ }
168
+ }
169
+ const chunkMap = new Map();
170
+ for (const r of replicas) {
171
+ const existing = chunkMap.get(r.chunkNo);
172
+ if (existing) {
173
+ existing.replicas.push({ server: r.server, replicaId: r.replicaId, replicaKey: r.replicaKey });
174
+ }
175
+ else {
176
+ const digest = digests.get(r.chunkNo);
177
+ if (!digest)
178
+ throw new Error("no digest for chunk");
179
+ chunkMap.set(r.chunkNo, {
180
+ chunkNo: r.chunkNo,
181
+ chunkSize: sizes.get(r.chunkNo) ?? defChunkSize,
182
+ digest,
183
+ replicas: [{ server: r.server, replicaId: r.replicaId, replicaKey: r.replicaKey }]
184
+ });
185
+ }
186
+ }
187
+ return Array.from(chunkMap.values()).sort((a, b) => a.chunkNo - b.chunkNo);
188
+ }
189
+ // -- YAML encoding (matching Data.Yaml key ordering)
190
+ export function encodeFileDescription(fd) {
191
+ const lines = [];
192
+ // Top-level keys in alphabetical order (matching Data.Yaml / libyaml)
193
+ lines.push("chunkSize: " + encodeFileSize(fd.chunkSize));
194
+ lines.push("digest: " + base64urlEncode(fd.digest));
195
+ lines.push("key: " + base64urlEncode(fd.key));
196
+ lines.push("nonce: " + base64urlEncode(fd.nonce));
197
+ lines.push("party: " + fd.party);
198
+ if (fd.redirect !== null) {
199
+ lines.push("redirect:");
200
+ lines.push(" digest: " + base64urlEncode(fd.redirect.digest));
201
+ lines.push(" size: " + fd.redirect.size);
202
+ }
203
+ const groups = encodeFileReplicas(fd.chunkSize, fd.chunks);
204
+ lines.push("replicas:");
205
+ for (const g of groups) {
206
+ lines.push("- chunks:");
207
+ for (const c of g.chunks) {
208
+ lines.push(" - " + c);
209
+ }
210
+ lines.push(" server: " + g.server);
211
+ }
212
+ lines.push("size: " + encodeFileSize(fd.size));
213
+ return lines.join("\n") + "\n";
214
+ }
215
+ // -- YAML decoding
216
+ export function decodeFileDescription(yaml) {
217
+ const lines = yaml.split("\n");
218
+ const topLevel = {};
219
+ const replicaGroups = [];
220
+ let redirect = null;
221
+ let i = 0;
222
+ while (i < lines.length) {
223
+ const line = lines[i];
224
+ if (line.length === 0) {
225
+ i++;
226
+ continue;
227
+ }
228
+ if (line === "replicas:") {
229
+ i++;
230
+ while (i < lines.length && lines[i].startsWith("- ")) {
231
+ const group = { server: "", chunks: [] };
232
+ i = parseReplicaItem(lines, i, group);
233
+ replicaGroups.push(group);
234
+ }
235
+ }
236
+ else if (line === "redirect:") {
237
+ i++;
238
+ let digestStr = "", sizeStr = "";
239
+ while (i < lines.length && lines[i].startsWith(" ")) {
240
+ const kv = lines[i].substring(2);
241
+ const ci = kv.indexOf(": ");
242
+ if (ci >= 0) {
243
+ const k = kv.substring(0, ci), v = kv.substring(ci + 2);
244
+ if (k === "digest")
245
+ digestStr = v;
246
+ if (k === "size")
247
+ sizeStr = v;
248
+ }
249
+ i++;
250
+ }
251
+ redirect = { size: parseInt(sizeStr), digest: base64urlDecode(digestStr) };
252
+ }
253
+ else {
254
+ const ci = line.indexOf(": ");
255
+ if (ci >= 0)
256
+ topLevel[line.substring(0, ci)] = line.substring(ci + 2);
257
+ i++;
258
+ }
259
+ }
260
+ const chunkSize = decodeFileSize(topLevel["chunkSize"]);
261
+ const serverReplicas = [];
262
+ for (const g of replicaGroups) {
263
+ for (const c of g.chunks)
264
+ serverReplicas.push(decodeServerReplica(g.server, c));
265
+ }
266
+ return {
267
+ party: topLevel["party"],
268
+ size: decodeFileSize(topLevel["size"]),
269
+ digest: base64urlDecode(topLevel["digest"]),
270
+ key: base64urlDecode(topLevel["key"]),
271
+ nonce: base64urlDecode(topLevel["nonce"]),
272
+ chunkSize,
273
+ chunks: foldReplicasToChunks(chunkSize, serverReplicas),
274
+ redirect
275
+ };
276
+ }
277
+ function parseReplicaItem(lines, startIdx, group) {
278
+ let i = startIdx;
279
+ const first = lines[i].substring(2); // strip "- " prefix
280
+ i = parseReplicaField(first, lines, i + 1, group);
281
+ while (i < lines.length && lines[i].startsWith(" ") && !lines[i].startsWith("- ")) {
282
+ i = parseReplicaField(lines[i].substring(2), lines, i + 1, group);
283
+ }
284
+ return i;
285
+ }
286
+ function parseReplicaField(entry, lines, nextIdx, group) {
287
+ if (entry === "chunks:" || entry.startsWith("chunks:")) {
288
+ let i = nextIdx;
289
+ while (i < lines.length && lines[i].startsWith(" - ")) {
290
+ group.chunks.push(lines[i].substring(4));
291
+ i++;
292
+ }
293
+ return i;
294
+ }
295
+ const ci = entry.indexOf(": ");
296
+ if (ci >= 0) {
297
+ const k = entry.substring(0, ci), v = entry.substring(ci + 2);
298
+ if (k === "server")
299
+ group.server = v;
300
+ }
301
+ return nextIdx;
302
+ }
303
+ // -- Validation
304
+ export function validateFileDescription(fd) {
305
+ for (let i = 0; i < fd.chunks.length; i++) {
306
+ if (fd.chunks[i].chunkNo !== i + 1)
307
+ return "chunk numbers are not sequential";
308
+ }
309
+ let total = 0;
310
+ for (const c of fd.chunks)
311
+ total += c.chunkSize;
312
+ if (total !== fd.size)
313
+ return "chunks total size is different than file size";
314
+ return null;
315
+ }
316
+ export const fdSeparator = "################################\n";
317
+ //# sourceMappingURL=description.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description.js","sourceRoot":"","sources":["../../src/protocol/description.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export declare class Decoder {
2
+ readonly buf: Uint8Array;
3
+ private readonly view;
4
+ private pos;
5
+ constructor(buf: Uint8Array);
6
+ take(n: number): Uint8Array;
7
+ takeAll(): Uint8Array;
8
+ anyByte(): number;
9
+ remaining(): number;
10
+ offset(): number;
11
+ }
12
+ export declare function concatBytes(...arrays: Uint8Array[]): Uint8Array;
13
+ export declare function encodeWord16(n: number): Uint8Array;
14
+ export declare function decodeWord16(d: Decoder): number;
15
+ export declare function encodeWord32(n: number): Uint8Array;
16
+ export declare function decodeWord32(d: Decoder): number;
17
+ export declare function encodeInt64(n: bigint): Uint8Array;
18
+ export declare function decodeInt64(d: Decoder): bigint;
19
+ export declare function encodeBytes(bs: Uint8Array): Uint8Array;
20
+ export declare function decodeBytes(d: Decoder): Uint8Array;
21
+ export declare function encodeLarge(bs: Uint8Array): Uint8Array;
22
+ export declare function decodeLarge(d: Decoder): Uint8Array;
23
+ export declare function encodeTail(bs: Uint8Array): Uint8Array;
24
+ export declare function decodeTail(d: Decoder): Uint8Array;
25
+ export declare function encodeBool(b: boolean): Uint8Array;
26
+ export declare function decodeBool(d: Decoder): boolean;
27
+ export declare function encodeString(s: string): Uint8Array;
28
+ export declare function decodeString(d: Decoder): string;
29
+ export declare function encodeMaybe<T>(encode: (v: T) => Uint8Array, v: T | null): Uint8Array;
30
+ export declare function decodeMaybe<T>(decode: (d: Decoder) => T, d: Decoder): T | null;
31
+ export declare function encodeNonEmpty<T>(encode: (v: T) => Uint8Array, xs: T[]): Uint8Array;
32
+ export declare function decodeNonEmpty<T>(decode: (d: Decoder) => T, d: Decoder): T[];
33
+ export declare function encodeList<T>(encode: (v: T) => Uint8Array, xs: T[]): Uint8Array;
34
+ export declare function decodeList<T>(decode: (d: Decoder) => T, d: Decoder): T[];
@@ -0,0 +1,197 @@
1
+ // Binary encoding/decoding matching Haskell Simplex.Messaging.Encoding module.
2
+ // All multi-byte integers are big-endian (network byte order).
3
+ // -- Decoder: sequential parser over a Uint8Array (equivalent to Attoparsec parser)
4
+ export class Decoder {
5
+ buf;
6
+ view;
7
+ pos;
8
+ constructor(buf) {
9
+ this.buf = buf;
10
+ this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
11
+ this.pos = 0;
12
+ }
13
+ take(n) {
14
+ if (this.pos + n > this.buf.length)
15
+ throw new Error("Decoder: unexpected end of input");
16
+ const slice = this.buf.subarray(this.pos, this.pos + n);
17
+ this.pos += n;
18
+ return slice;
19
+ }
20
+ takeAll() {
21
+ const slice = this.buf.subarray(this.pos);
22
+ this.pos = this.buf.length;
23
+ return slice;
24
+ }
25
+ anyByte() {
26
+ if (this.pos >= this.buf.length)
27
+ throw new Error("Decoder: unexpected end of input");
28
+ return this.buf[this.pos++];
29
+ }
30
+ remaining() {
31
+ return this.buf.length - this.pos;
32
+ }
33
+ offset() {
34
+ return this.pos;
35
+ }
36
+ }
37
+ // -- Utility
38
+ export function concatBytes(...arrays) {
39
+ let totalLen = 0;
40
+ for (const a of arrays)
41
+ totalLen += a.length;
42
+ const result = new Uint8Array(totalLen);
43
+ let offset = 0;
44
+ for (const a of arrays) {
45
+ result.set(a, offset);
46
+ offset += a.length;
47
+ }
48
+ return result;
49
+ }
50
+ // -- Word16: 2-byte big-endian (Encoding.hs:70)
51
+ export function encodeWord16(n) {
52
+ const buf = new Uint8Array(2);
53
+ const view = new DataView(buf.buffer);
54
+ view.setUint16(0, n, false);
55
+ return buf;
56
+ }
57
+ export function decodeWord16(d) {
58
+ const bytes = d.take(2);
59
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
60
+ return view.getUint16(0, false);
61
+ }
62
+ // -- Word32: 4-byte big-endian (Encoding.hs:76)
63
+ export function encodeWord32(n) {
64
+ const buf = new Uint8Array(4);
65
+ const view = new DataView(buf.buffer);
66
+ view.setUint32(0, n, false);
67
+ return buf;
68
+ }
69
+ export function decodeWord32(d) {
70
+ const bytes = d.take(4);
71
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
72
+ return view.getUint32(0, false);
73
+ }
74
+ // -- Int64: two Word32s, high then low (Encoding.hs:82)
75
+ // Uses BigInt because JS numbers lose precision beyond 2^53.
76
+ export function encodeInt64(n) {
77
+ const high = Number((n >> 32n) & 0xffffffffn);
78
+ const low = Number(n & 0xffffffffn);
79
+ return concatBytes(encodeWord32(high), encodeWord32(low));
80
+ }
81
+ export function decodeInt64(d) {
82
+ const high = BigInt(decodeWord32(d));
83
+ const low = BigInt(decodeWord32(d));
84
+ const unsigned = (high << 32n) | low;
85
+ // Convert to signed Int64: if bit 63 is set, value is negative
86
+ return unsigned >= 0x8000000000000000n ? unsigned - 0x10000000000000000n : unsigned;
87
+ }
88
+ // -- ByteString: 1-byte length prefix + bytes (Encoding.hs:100)
89
+ // Max 255 bytes.
90
+ export function encodeBytes(bs) {
91
+ if (bs.length > 255)
92
+ throw new Error("encodeBytes: length exceeds 255");
93
+ const result = new Uint8Array(1 + bs.length);
94
+ result[0] = bs.length;
95
+ result.set(bs, 1);
96
+ return result;
97
+ }
98
+ export function decodeBytes(d) {
99
+ const len = d.anyByte();
100
+ return d.take(len);
101
+ }
102
+ // -- Large: 2-byte big-endian length prefix + bytes (Encoding.hs:133)
103
+ // Max 65535 bytes.
104
+ export function encodeLarge(bs) {
105
+ if (bs.length > 65535)
106
+ throw new Error("encodeLarge: length exceeds 65535");
107
+ return concatBytes(encodeWord16(bs.length), bs);
108
+ }
109
+ export function decodeLarge(d) {
110
+ const len = decodeWord16(d);
111
+ return d.take(len);
112
+ }
113
+ // -- Tail: raw bytes, no prefix (Encoding.hs:124)
114
+ export function encodeTail(bs) {
115
+ return bs;
116
+ }
117
+ export function decodeTail(d) {
118
+ return d.takeAll();
119
+ }
120
+ // -- Bool: 'T' (0x54) or 'F' (0x46) (Encoding.hs:58)
121
+ const CHAR_T = 0x54;
122
+ const CHAR_F = 0x46;
123
+ export function encodeBool(b) {
124
+ return new Uint8Array([b ? CHAR_T : CHAR_F]);
125
+ }
126
+ export function decodeBool(d) {
127
+ const byte = d.anyByte();
128
+ if (byte === CHAR_T)
129
+ return true;
130
+ if (byte === CHAR_F)
131
+ return false;
132
+ throw new Error("decodeBool: invalid tag " + byte);
133
+ }
134
+ // -- String/Text: encode as UTF-8 ByteString (Encoding.hs)
135
+ // Matches Haskell's Encoding Text instance: encodeUtf8/decodeUtf8.
136
+ const textEncoder = new TextEncoder();
137
+ const textDecoder = new TextDecoder();
138
+ export function encodeString(s) {
139
+ return encodeBytes(textEncoder.encode(s));
140
+ }
141
+ export function decodeString(d) {
142
+ return textDecoder.decode(decodeBytes(d));
143
+ }
144
+ // -- Maybe: '0' for Nothing, '1' + encoded value for Just (Encoding.hs:114)
145
+ const CHAR_0 = 0x30;
146
+ const CHAR_1 = 0x31;
147
+ export function encodeMaybe(encode, v) {
148
+ if (v === null)
149
+ return new Uint8Array([CHAR_0]);
150
+ return concatBytes(new Uint8Array([CHAR_1]), encode(v));
151
+ }
152
+ export function decodeMaybe(decode, d) {
153
+ const tag = d.anyByte();
154
+ if (tag === CHAR_0)
155
+ return null;
156
+ if (tag === CHAR_1)
157
+ return decode(d);
158
+ throw new Error("decodeMaybe: invalid tag " + tag);
159
+ }
160
+ // -- NonEmpty: 1-byte length + encoded elements (Encoding.hs:165)
161
+ // Fails on empty list (matches Haskell behavior).
162
+ export function encodeNonEmpty(encode, xs) {
163
+ if (xs.length === 0)
164
+ throw new Error("encodeNonEmpty: empty list");
165
+ if (xs.length > 255)
166
+ throw new Error("encodeNonEmpty: length exceeds 255");
167
+ const parts = [new Uint8Array([xs.length])];
168
+ for (const x of xs)
169
+ parts.push(encode(x));
170
+ return concatBytes(...parts);
171
+ }
172
+ export function decodeNonEmpty(decode, d) {
173
+ const len = d.anyByte();
174
+ if (len === 0)
175
+ throw new Error("decodeNonEmpty: empty list");
176
+ const result = [];
177
+ for (let i = 0; i < len; i++)
178
+ result.push(decode(d));
179
+ return result;
180
+ }
181
+ // -- List encoding (smpEncodeList / smpListP, Encoding.hs:153)
182
+ export function encodeList(encode, xs) {
183
+ if (xs.length > 255)
184
+ throw new Error("encodeList: length exceeds 255");
185
+ const parts = [new Uint8Array([xs.length])];
186
+ for (const x of xs)
187
+ parts.push(encode(x));
188
+ return concatBytes(...parts);
189
+ }
190
+ export function decodeList(decode, d) {
191
+ const len = d.anyByte();
192
+ const result = [];
193
+ for (let i = 0; i < len; i++)
194
+ result.push(decode(d));
195
+ return result;
196
+ }
197
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/protocol/encoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { Decoder } from "./encoding.js";
2
+ export interface VersionRange {
3
+ minVersion: number;
4
+ maxVersion: number;
5
+ }
6
+ export declare function encodeVersionRange(vr: VersionRange): Uint8Array;
7
+ export declare function decodeVersionRange(d: Decoder): VersionRange;
8
+ export declare function compatibleVRange(a: VersionRange, b: VersionRange): VersionRange | null;
9
+ export interface XFTPClientHello {
10
+ webChallenge: Uint8Array | null;
11
+ }
12
+ export declare function encodeClientHello(hello: XFTPClientHello): Uint8Array;
13
+ export interface XFTPClientHandshake {
14
+ xftpVersion: number;
15
+ keyHash: Uint8Array;
16
+ }
17
+ export declare function encodeClientHandshake(ch: XFTPClientHandshake): Uint8Array;
18
+ export interface XFTPServerHandshake {
19
+ xftpVersionRange: VersionRange;
20
+ sessionId: Uint8Array;
21
+ certChainDer: Uint8Array[];
22
+ signedKeyDer: Uint8Array;
23
+ webIdentityProof: Uint8Array | null;
24
+ }
25
+ export declare function decodeServerHandshake(block: Uint8Array): XFTPServerHandshake;
26
+ export type ChainCertificates = {
27
+ type: 'empty';
28
+ } | {
29
+ type: 'self';
30
+ cert: Uint8Array;
31
+ } | {
32
+ type: 'valid';
33
+ leafCert: Uint8Array;
34
+ idCert: Uint8Array;
35
+ caCert: Uint8Array;
36
+ } | {
37
+ type: 'long';
38
+ };
39
+ export declare function chainIdCaCerts(certChainDer: Uint8Array[]): ChainCertificates;
40
+ export declare function caFingerprint(certChainDer: Uint8Array[]): Uint8Array;
41
+ export interface SignedKey {
42
+ objectDer: Uint8Array;
43
+ dhKey: Uint8Array;
44
+ algorithm: Uint8Array;
45
+ signature: Uint8Array;
46
+ }
47
+ export declare function extractSignedKey(signedDer: Uint8Array): SignedKey;