@shhhum/xftp-web 0.1.0 → 0.3.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 (52) hide show
  1. package/README.md +83 -15
  2. package/dist/agent.d.ts +6 -4
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +143 -79
  5. package/dist/agent.js.map +1 -1
  6. package/dist/client.d.ts +2 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +6 -1
  9. package/dist/client.js.map +1 -1
  10. package/dist/crypto/digest.d.ts +1 -0
  11. package/dist/crypto/digest.d.ts.map +1 -0
  12. package/dist/crypto/file.d.ts +1 -0
  13. package/dist/crypto/file.d.ts.map +1 -0
  14. package/dist/crypto/identity.d.ts +1 -0
  15. package/dist/crypto/identity.d.ts.map +1 -0
  16. package/dist/crypto/keys.d.ts +1 -0
  17. package/dist/crypto/keys.d.ts.map +1 -0
  18. package/dist/crypto/keys.js +1 -0
  19. package/dist/crypto/keys.js.map +1 -1
  20. package/dist/crypto/padding.d.ts +1 -0
  21. package/dist/crypto/padding.d.ts.map +1 -0
  22. package/dist/crypto/secretbox.d.ts +1 -0
  23. package/dist/crypto/secretbox.d.ts.map +1 -0
  24. package/dist/download.d.ts +1 -0
  25. package/dist/download.d.ts.map +1 -0
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/protocol/address.d.ts +1 -0
  30. package/dist/protocol/address.d.ts.map +1 -0
  31. package/dist/protocol/chunks.d.ts +1 -0
  32. package/dist/protocol/chunks.d.ts.map +1 -0
  33. package/dist/protocol/client.d.ts +1 -0
  34. package/dist/protocol/client.d.ts.map +1 -0
  35. package/dist/protocol/commands.d.ts +10 -1
  36. package/dist/protocol/commands.d.ts.map +1 -0
  37. package/dist/protocol/commands.js +15 -1
  38. package/dist/protocol/commands.js.map +1 -1
  39. package/dist/protocol/description.d.ts +1 -0
  40. package/dist/protocol/description.d.ts.map +1 -0
  41. package/dist/protocol/encoding.d.ts +1 -0
  42. package/dist/protocol/encoding.d.ts.map +1 -0
  43. package/dist/protocol/handshake.d.ts +1 -0
  44. package/dist/protocol/handshake.d.ts.map +1 -0
  45. package/dist/protocol/transmission.d.ts +1 -0
  46. package/dist/protocol/transmission.d.ts.map +1 -0
  47. package/package.json +10 -2
  48. package/src/agent.ts +156 -85
  49. package/src/client.ts +8 -1
  50. package/src/crypto/keys.ts +1 -0
  51. package/src/index.ts +1 -1
  52. package/src/protocol/commands.ts +22 -2
package/README.md CHANGED
@@ -2,13 +2,81 @@
2
2
 
3
3
  Browser-compatible XFTP file transfer client in TypeScript.
4
4
 
5
- ## Prerequisites
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install xftp-web
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import {
15
+ newXFTPAgent, closeXFTPAgent,
16
+ parseXFTPServer,
17
+ encryptFileForUpload, uploadFile, downloadFile, deleteFile,
18
+ decodeDescriptionURI, encodeDescriptionURI,
19
+ XFTPRetriableError, XFTPPermanentError, isRetriable,
20
+ } from "xftp-web"
21
+
22
+ // Create agent (manages connections)
23
+ const agent = newXFTPAgent()
24
+
25
+ // Upload — chunks are distributed randomly across servers
26
+ const servers = [
27
+ parseXFTPServer("xftp://server1..."),
28
+ parseXFTPServer("xftp://server2..."),
29
+ parseXFTPServer("xftp://server3..."),
30
+ ]
31
+ const encrypted = encryptFileForUpload(fileBytes, "photo.jpg")
32
+ const {rcvDescriptions, sndDescription, uri} = await uploadFile(agent, servers, encrypted, {
33
+ onProgress: (uploaded, total) => console.log(`${uploaded}/${total}`),
34
+ })
35
+
36
+ // Download (from URI or FileDescription)
37
+ const fd = decodeDescriptionURI(uri)
38
+ const {header, content} = await downloadFile(agent, fd)
39
+
40
+ // Delete (using sender description)
41
+ await deleteFile(agent, sndDescription)
42
+
43
+ // Cleanup
44
+ closeXFTPAgent(agent)
45
+ ```
46
+
47
+ ### Upload options
48
+
49
+ ```typescript
50
+ await uploadFile(agent, servers, encrypted, {
51
+ onProgress: (uploaded, total) => {}, // progress callback
52
+ auth: basicAuthBytes, // BasicAuth for auth-required servers
53
+ numRecipients: 3, // multiple independent download credentials (default: 1)
54
+ })
55
+ ```
56
+
57
+ ### Error handling
58
+
59
+ ```typescript
60
+ try {
61
+ await uploadFile(agent, servers, encrypted)
62
+ } catch (e) {
63
+ if (e instanceof XFTPRetriableError) {
64
+ // Network/timeout/session errors — safe to retry
65
+ } else if (e instanceof XFTPPermanentError) {
66
+ // AUTH, NO_FILE, BLOCKED, etc. — do not retry
67
+ }
68
+ // or use: isRetriable(e)
69
+ }
70
+ ```
71
+
72
+ ## Development
73
+
74
+ ### Prerequisites
6
75
 
7
76
  - Haskell toolchain with `cabal` (to build `xftp-server`)
8
77
  - Node.js 20+
9
- - Chromium system dependencies (see below)
10
78
 
11
- ## Setup
79
+ ### Setup
12
80
 
13
81
  ```bash
14
82
  # Build the XFTP server binary (from repo root)
@@ -17,31 +85,31 @@ cabal build xftp-server
17
85
  # Install JS dependencies
18
86
  cd xftp-web
19
87
  npm install
20
-
21
- # Install Chromium for Playwright (browser tests)
22
- npx playwright install chromium
23
88
  ```
24
89
 
25
- If Chromium fails to launch due to missing system libraries, install them with:
90
+ ### Running tests
26
91
 
27
92
  ```bash
28
- # Requires root
29
- npx playwright install-deps chromium
93
+ npm run test
30
94
  ```
31
95
 
32
- ## Running tests
96
+ The `pretest` script automatically installs Chromium and sets up the libsodium symlink. The browser test starts an `xftp-server` instance on port 7000 via `globalSetup`.
97
+
98
+ If Chromium fails to launch due to missing system libraries:
33
99
 
34
100
  ```bash
35
- # Browser round-trip test (vitest + Playwright headless Chromium)
36
- npm run test
101
+ # Requires root
102
+ npx playwright install-deps chromium
37
103
  ```
38
104
 
39
- The browser test automatically starts an `xftp-server` instance on port 7000 via `globalSetup`, using certs from `tests/fixtures/`.
40
-
41
- ## Build
105
+ ### Build
42
106
 
43
107
  ```bash
44
108
  npm run build
45
109
  ```
46
110
 
47
111
  Output goes to `dist/`.
112
+
113
+ ## License
114
+
115
+ [AGPL-3.0-only](https://www.gnu.org/licenses/agpl-3.0.html)
package/dist/agent.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type FileDescription } from "./protocol/description.js";
2
2
  import { type XFTPClientAgent } from "./client.js";
3
- export { newXFTPAgent, closeXFTPAgent, type XFTPClientAgent, type TransportConfig } from "./client.js";
3
+ export { newXFTPAgent, closeXFTPAgent, type XFTPClientAgent, type TransportConfig, XFTPRetriableError, XFTPPermanentError, isRetriable, categorizeError, humanReadableMessage, ackXFTPChunk, addXFTPRecipients } from "./client.js";
4
4
  import type { XFTPServer } from "./protocol/address.js";
5
5
  import type { FileHeader } from "./crypto/file.js";
6
6
  export interface EncryptedFileMetadata {
@@ -13,7 +13,7 @@ export interface EncryptedFileInfo extends EncryptedFileMetadata {
13
13
  encData: Uint8Array;
14
14
  }
15
15
  export interface UploadResult {
16
- rcvDescription: FileDescription;
16
+ rcvDescriptions: FileDescription[];
17
17
  sndDescription: FileDescription;
18
18
  uri: string;
19
19
  }
@@ -28,8 +28,10 @@ export interface UploadOptions {
28
28
  onProgress?: (uploaded: number, total: number) => void;
29
29
  redirectThreshold?: number;
30
30
  readChunk?: (offset: number, size: number) => Promise<Uint8Array>;
31
+ auth?: Uint8Array;
32
+ numRecipients?: number;
31
33
  }
32
- export declare function uploadFile(agent: XFTPClientAgent, server: XFTPServer, encrypted: EncryptedFileMetadata, options?: UploadOptions): Promise<UploadResult>;
34
+ export declare function uploadFile(agent: XFTPClientAgent, servers: XFTPServer[], encrypted: EncryptedFileMetadata, options?: UploadOptions): Promise<UploadResult>;
33
35
  export interface RawDownloadedChunk {
34
36
  chunkNo: number;
35
37
  dhSecret: Uint8Array;
@@ -39,8 +41,8 @@ export interface RawDownloadedChunk {
39
41
  }
40
42
  export interface DownloadRawOptions {
41
43
  onProgress?: (downloaded: number, total: number) => void;
42
- concurrency?: number;
43
44
  }
44
45
  export declare function downloadFileRaw(agent: XFTPClientAgent, fd: FileDescription, onRawChunk: (chunk: RawDownloadedChunk) => Promise<void>, options?: DownloadRawOptions): Promise<FileDescription>;
45
46
  export declare function downloadFile(agent: XFTPClientAgent, fd: FileDescription, onProgress?: (downloaded: number, total: number) => void): Promise<DownloadResult>;
46
47
  export declare function deleteFile(agent: XFTPClientAgent, sndDescription: FileDescription): Promise<void>;
48
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -8,8 +8,8 @@ import { generateEd25519KeyPair, encodePubKeyEd25519, encodePrivKeyEd25519, deco
8
8
  import { sha512Streaming } from "./crypto/digest.js";
9
9
  import { prepareChunkSizes, prepareChunkSpecs, getChunkDigest, fileSizeLen, authTagSize } from "./protocol/chunks.js";
10
10
  import { encodeFileDescription, decodeFileDescription, validateFileDescription, base64urlEncode, base64urlDecode } from "./protocol/description.js";
11
- import { createXFTPChunk, uploadXFTPChunk, downloadXFTPChunk, downloadXFTPChunkRaw, deleteXFTPChunk } from "./client.js";
12
- export { newXFTPAgent, closeXFTPAgent } from "./client.js";
11
+ import { createXFTPChunk, addXFTPRecipients, uploadXFTPChunk, downloadXFTPChunk, downloadXFTPChunkRaw, deleteXFTPChunk, ackXFTPChunk } from "./client.js";
12
+ export { newXFTPAgent, closeXFTPAgent, XFTPRetriableError, XFTPPermanentError, isRetriable, categorizeError, humanReadableMessage, ackXFTPChunk, addXFTPRecipients } from "./client.js";
13
13
  import { processDownloadedFile, decryptReceivedChunk } from "./download.js";
14
14
  import { formatXFTPServer, parseXFTPServer } from "./protocol/address.js";
15
15
  // -- URI encoding/decoding (RFC section 4.1: DEFLATE + base64url)
@@ -44,8 +44,11 @@ export function encryptFileForUpload(source, fileName) {
44
44
  return { encData, digest, key, nonce, chunkSizes };
45
45
  }
46
46
  const DEFAULT_REDIRECT_THRESHOLD = 400;
47
- export async function uploadFile(agent, server, encrypted, options) {
48
- const { onProgress, redirectThreshold, readChunk: readChunkOpt } = options ?? {};
47
+ const MAX_RECIPIENTS_PER_REQUEST = 200;
48
+ export async function uploadFile(agent, servers, encrypted, options) {
49
+ if (servers.length === 0)
50
+ throw new Error("uploadFile: servers list is empty");
51
+ const { onProgress, redirectThreshold, readChunk: readChunkOpt, auth, numRecipients = 1 } = options ?? {};
49
52
  const readChunk = readChunkOpt
50
53
  ? readChunkOpt
51
54
  : ('encData' in encrypted
@@ -53,44 +56,72 @@ export async function uploadFile(agent, server, encrypted, options) {
53
56
  : () => { throw new Error("uploadFile: readChunk required when encData is absent"); });
54
57
  const total = encrypted.chunkSizes.reduce((a, b) => a + b, 0);
55
58
  const specs = prepareChunkSpecs(encrypted.chunkSizes);
56
- const sentChunks = [];
57
- let uploaded = 0;
58
- for (let i = 0; i < specs.length; i++) {
59
- const spec = specs[i];
60
- const chunkNo = i + 1;
61
- const sndKp = generateEd25519KeyPair();
62
- const rcvKp = generateEd25519KeyPair();
63
- const chunkData = await readChunk(spec.chunkOffset, spec.chunkSize);
64
- const chunkDigest = getChunkDigest(chunkData);
65
- console.log(`[AGENT-DBG] upload chunk=${chunkNo} offset=${spec.chunkOffset} size=${spec.chunkSize} digest=${_dbgHex(chunkDigest, 32)} data[0..8]=${_dbgHex(chunkData)} data[-8..]=${_dbgHex(chunkData.slice(-8))}`);
66
- const fileInfo = {
67
- sndKey: encodePubKeyEd25519(sndKp.publicKey),
68
- size: spec.chunkSize,
69
- digest: chunkDigest
70
- };
71
- const rcvKeysForChunk = [encodePubKeyEd25519(rcvKp.publicKey)];
72
- const { senderId, recipientIds } = await createXFTPChunk(agent, server, sndKp.privateKey, fileInfo, rcvKeysForChunk);
73
- await uploadXFTPChunk(agent, server, sndKp.privateKey, senderId, chunkData);
74
- sentChunks.push({
75
- chunkNo, senderId, senderKey: sndKp.privateKey,
76
- recipientId: recipientIds[0], recipientKey: rcvKp.privateKey,
77
- chunkSize: spec.chunkSize, digest: chunkDigest, server
78
- });
79
- uploaded += spec.chunkSize;
80
- onProgress?.(uploaded, total);
59
+ // Pre-assign servers and group by server (matching Haskell groupAllOn)
60
+ const chunkJobs = specs.map((spec, i) => ({
61
+ index: i,
62
+ spec,
63
+ server: servers[Math.floor(Math.random() * servers.length)]
64
+ }));
65
+ const byServer = new Map();
66
+ for (const job of chunkJobs) {
67
+ const key = formatXFTPServer(job.server);
68
+ if (!byServer.has(key))
69
+ byServer.set(key, []);
70
+ byServer.get(key).push(job);
81
71
  }
82
- const rcvDescription = buildDescription("recipient", encrypted, sentChunks);
83
- const sndDescription = buildDescription("sender", encrypted, sentChunks);
84
- let uri = encodeDescriptionURI(rcvDescription);
85
- let finalRcvDescription = rcvDescription;
72
+ // Upload groups in parallel, sequential within each group
73
+ const sentChunks = new Array(specs.length);
74
+ let uploaded = 0;
75
+ await Promise.all([...byServer.values()].map(async (jobs) => {
76
+ for (const { index, spec, server } of jobs) {
77
+ const chunkNo = index + 1;
78
+ const sndKp = generateEd25519KeyPair();
79
+ const rcvKps = Array.from({ length: numRecipients }, () => generateEd25519KeyPair());
80
+ const chunkData = await readChunk(spec.chunkOffset, spec.chunkSize);
81
+ const chunkDigest = getChunkDigest(chunkData);
82
+ console.log(`[AGENT-DBG] upload chunk=${chunkNo} offset=${spec.chunkOffset} size=${spec.chunkSize} digest=${_dbgHex(chunkDigest, 32)} data[0..8]=${_dbgHex(chunkData)} data[-8..]=${_dbgHex(chunkData.slice(-8))}`);
83
+ const fileInfo = {
84
+ sndKey: encodePubKeyEd25519(sndKp.publicKey),
85
+ size: spec.chunkSize,
86
+ digest: chunkDigest
87
+ };
88
+ const firstBatch = Math.min(numRecipients, MAX_RECIPIENTS_PER_REQUEST);
89
+ const firstBatchKeys = rcvKps.slice(0, firstBatch).map(kp => encodePubKeyEd25519(kp.publicKey));
90
+ const { senderId, recipientIds: firstIds } = await createXFTPChunk(agent, server, sndKp.privateKey, fileInfo, firstBatchKeys, auth ?? null);
91
+ const allRecipientIds = [...firstIds];
92
+ let added = firstBatch;
93
+ while (added < numRecipients) {
94
+ const batchSize = Math.min(numRecipients - added, MAX_RECIPIENTS_PER_REQUEST);
95
+ const batchKeys = rcvKps.slice(added, added + batchSize).map(kp => encodePubKeyEd25519(kp.publicKey));
96
+ const moreIds = await addXFTPRecipients(agent, server, sndKp.privateKey, senderId, batchKeys);
97
+ allRecipientIds.push(...moreIds);
98
+ added += batchSize;
99
+ }
100
+ await uploadXFTPChunk(agent, server, sndKp.privateKey, senderId, chunkData);
101
+ sentChunks[index] = {
102
+ chunkNo, senderId, senderKey: sndKp.privateKey,
103
+ recipients: allRecipientIds.map((rid, ri) => ({
104
+ recipientId: rid, recipientKey: rcvKps[ri].privateKey
105
+ })),
106
+ chunkSize: spec.chunkSize, digest: chunkDigest, server
107
+ };
108
+ uploaded += spec.chunkSize;
109
+ onProgress?.(uploaded, total);
110
+ }
111
+ }));
112
+ const rcvDescriptions = Array.from({ length: numRecipients }, (_, ri) => buildDescription("recipient", ri, encrypted, sentChunks));
113
+ const sndDescription = buildDescription("sender", 0, encrypted, sentChunks);
114
+ let uri = encodeDescriptionURI(rcvDescriptions[0]);
115
+ let finalRcvDescriptions = rcvDescriptions;
86
116
  const threshold = redirectThreshold ?? DEFAULT_REDIRECT_THRESHOLD;
87
117
  if (uri.length > threshold && sentChunks.length > 1) {
88
- finalRcvDescription = await uploadRedirectDescription(agent, server, rcvDescription);
89
- uri = encodeDescriptionURI(finalRcvDescription);
118
+ const redirected = await uploadRedirectDescription(agent, servers, rcvDescriptions[0], auth);
119
+ finalRcvDescriptions = [redirected, ...rcvDescriptions.slice(1)];
120
+ uri = encodeDescriptionURI(redirected);
90
121
  }
91
- return { rcvDescription: finalRcvDescription, sndDescription, uri };
122
+ return { rcvDescriptions: finalRcvDescriptions, sndDescription, uri };
92
123
  }
93
- function buildDescription(party, enc, chunks) {
124
+ function buildDescription(party, recipientIndex, enc, chunks) {
94
125
  const defChunkSize = enc.chunkSizes[0];
95
126
  return {
96
127
  party,
@@ -105,40 +136,53 @@ function buildDescription(party, enc, chunks) {
105
136
  digest: c.digest,
106
137
  replicas: [{
107
138
  server: formatXFTPServer(c.server),
108
- replicaId: party === "recipient" ? c.recipientId : c.senderId,
109
- replicaKey: encodePrivKeyEd25519(party === "recipient" ? c.recipientKey : c.senderKey)
139
+ replicaId: party === "recipient" ? c.recipients[recipientIndex].recipientId : c.senderId,
140
+ replicaKey: encodePrivKeyEd25519(party === "recipient" ? c.recipients[recipientIndex].recipientKey : c.senderKey)
110
141
  }]
111
142
  })),
112
143
  redirect: null
113
144
  };
114
145
  }
115
- async function uploadRedirectDescription(agent, server, innerFd) {
146
+ async function uploadRedirectDescription(agent, servers, innerFd, auth) {
116
147
  const yaml = encodeFileDescription(innerFd);
117
148
  const yamlBytes = new TextEncoder().encode(yaml);
118
149
  const enc = encryptFileForUpload(yamlBytes, "");
119
150
  const specs = prepareChunkSpecs(enc.chunkSizes);
120
- const sentChunks = [];
121
- for (let i = 0; i < specs.length; i++) {
122
- const spec = specs[i];
123
- const chunkNo = i + 1;
124
- const sndKp = generateEd25519KeyPair();
125
- const rcvKp = generateEd25519KeyPair();
126
- const chunkData = enc.encData.subarray(spec.chunkOffset, spec.chunkOffset + spec.chunkSize);
127
- const chunkDigest = getChunkDigest(chunkData);
128
- const fileInfo = {
129
- sndKey: encodePubKeyEd25519(sndKp.publicKey),
130
- size: spec.chunkSize,
131
- digest: chunkDigest
132
- };
133
- const rcvKeysForChunk = [encodePubKeyEd25519(rcvKp.publicKey)];
134
- const { senderId, recipientIds } = await createXFTPChunk(agent, server, sndKp.privateKey, fileInfo, rcvKeysForChunk);
135
- await uploadXFTPChunk(agent, server, sndKp.privateKey, senderId, chunkData);
136
- sentChunks.push({
137
- chunkNo, senderId, senderKey: sndKp.privateKey,
138
- recipientId: recipientIds[0], recipientKey: rcvKp.privateKey,
139
- chunkSize: spec.chunkSize, digest: chunkDigest, server
140
- });
151
+ const chunkJobs = specs.map((spec, i) => ({
152
+ index: i,
153
+ spec,
154
+ server: servers[Math.floor(Math.random() * servers.length)]
155
+ }));
156
+ const byServer = new Map();
157
+ for (const job of chunkJobs) {
158
+ const key = formatXFTPServer(job.server);
159
+ if (!byServer.has(key))
160
+ byServer.set(key, []);
161
+ byServer.get(key).push(job);
141
162
  }
163
+ const sentChunks = new Array(specs.length);
164
+ await Promise.all([...byServer.values()].map(async (jobs) => {
165
+ for (const { index, spec, server } of jobs) {
166
+ const chunkNo = index + 1;
167
+ const sndKp = generateEd25519KeyPair();
168
+ const rcvKp = generateEd25519KeyPair();
169
+ const chunkData = enc.encData.subarray(spec.chunkOffset, spec.chunkOffset + spec.chunkSize);
170
+ const chunkDigest = getChunkDigest(chunkData);
171
+ const fileInfo = {
172
+ sndKey: encodePubKeyEd25519(sndKp.publicKey),
173
+ size: spec.chunkSize,
174
+ digest: chunkDigest
175
+ };
176
+ const rcvKeysForChunk = [encodePubKeyEd25519(rcvKp.publicKey)];
177
+ const { senderId, recipientIds } = await createXFTPChunk(agent, server, sndKp.privateKey, fileInfo, rcvKeysForChunk, auth ?? null);
178
+ await uploadXFTPChunk(agent, server, sndKp.privateKey, senderId, chunkData);
179
+ sentChunks[index] = {
180
+ chunkNo, senderId, senderKey: sndKp.privateKey,
181
+ recipients: [{ recipientId: recipientIds[0], recipientKey: rcvKp.privateKey }],
182
+ chunkSize: spec.chunkSize, digest: chunkDigest, server
183
+ };
184
+ }
185
+ }));
142
186
  return {
143
187
  party: "recipient",
144
188
  size: enc.chunkSizes.reduce((a, b) => a + b, 0),
@@ -152,8 +196,8 @@ async function uploadRedirectDescription(agent, server, innerFd) {
152
196
  digest: c.digest,
153
197
  replicas: [{
154
198
  server: formatXFTPServer(c.server),
155
- replicaId: c.recipientId,
156
- replicaKey: encodePrivKeyEd25519(c.recipientKey)
199
+ replicaId: c.recipients[0].recipientId,
200
+ replicaKey: encodePrivKeyEd25519(c.recipients[0].recipientKey)
157
201
  }]
158
202
  })),
159
203
  redirect: { size: innerFd.size, digest: innerFd.digest }
@@ -163,7 +207,7 @@ export async function downloadFileRaw(agent, fd, onRawChunk, options) {
163
207
  const err = validateFileDescription(fd);
164
208
  if (err)
165
209
  throw new Error("downloadFileRaw: " + err);
166
- const { onProgress, concurrency = 1 } = options ?? {};
210
+ const { onProgress } = options ?? {};
167
211
  // Resolve redirect on main thread (redirect data is small)
168
212
  if (fd.redirect !== null) {
169
213
  console.log(`[AGENT-DBG] resolving redirect: outer size=${fd.size} chunks=${fd.chunks.length}`);
@@ -197,6 +241,7 @@ export async function downloadFileRaw(agent, fd, onRawChunk, options) {
197
241
  body: raw.body,
198
242
  digest: chunk.digest
199
243
  });
244
+ await ackXFTPChunk(agent, server, kp.privateKey, replica.replicaId);
200
245
  downloaded += chunk.chunkSize;
201
246
  onProgress?.(downloaded, resolvedFd.size);
202
247
  }
@@ -218,16 +263,26 @@ export async function downloadFile(agent, fd, onProgress) {
218
263
  }
219
264
  async function resolveRedirect(agent, fd) {
220
265
  const plaintextChunks = new Array(fd.chunks.length);
266
+ const byServer = new Map();
221
267
  for (const chunk of fd.chunks) {
222
- const replica = chunk.replicas[0];
223
- if (!replica)
224
- throw new Error("resolveRedirect: chunk has no replicas");
225
- const server = parseXFTPServer(replica.server);
226
- const seed = decodePrivKeyEd25519(replica.replicaKey);
227
- const kp = ed25519KeyPairFromSeed(seed);
228
- const data = await downloadXFTPChunk(agent, server, kp.privateKey, replica.replicaId, chunk.digest);
229
- plaintextChunks[chunk.chunkNo - 1] = data;
268
+ const srv = chunk.replicas[0]?.server ?? "";
269
+ if (!byServer.has(srv))
270
+ byServer.set(srv, []);
271
+ byServer.get(srv).push(chunk);
230
272
  }
273
+ await Promise.all([...byServer.entries()].map(async ([srv, chunks]) => {
274
+ const server = parseXFTPServer(srv);
275
+ for (const chunk of chunks) {
276
+ const replica = chunk.replicas[0];
277
+ if (!replica)
278
+ throw new Error("resolveRedirect: chunk has no replicas");
279
+ const seed = decodePrivKeyEd25519(replica.replicaKey);
280
+ const kp = ed25519KeyPairFromSeed(seed);
281
+ const data = await downloadXFTPChunk(agent, server, kp.privateKey, replica.replicaId, chunk.digest);
282
+ plaintextChunks[chunk.chunkNo - 1] = data;
283
+ await ackXFTPChunk(agent, server, kp.privateKey, replica.replicaId);
284
+ }
285
+ }));
231
286
  const totalSize = plaintextChunks.reduce((s, c) => s + c.length, 0);
232
287
  if (totalSize !== fd.size)
233
288
  throw new Error("resolveRedirect: redirect file size mismatch");
@@ -248,15 +303,24 @@ async function resolveRedirect(agent, fd) {
248
303
  }
249
304
  // -- Delete
250
305
  export async function deleteFile(agent, sndDescription) {
306
+ const byServer = new Map();
251
307
  for (const chunk of sndDescription.chunks) {
252
- const replica = chunk.replicas[0];
253
- if (!replica)
254
- throw new Error("deleteFile: chunk has no replicas");
255
- const server = parseXFTPServer(replica.server);
256
- const seed = decodePrivKeyEd25519(replica.replicaKey);
257
- const kp = ed25519KeyPairFromSeed(seed);
258
- await deleteXFTPChunk(agent, server, kp.privateKey, replica.replicaId);
308
+ const srv = chunk.replicas[0]?.server ?? "";
309
+ if (!byServer.has(srv))
310
+ byServer.set(srv, []);
311
+ byServer.get(srv).push(chunk);
259
312
  }
313
+ await Promise.all([...byServer.entries()].map(async ([srv, chunks]) => {
314
+ const server = parseXFTPServer(srv);
315
+ for (const chunk of chunks) {
316
+ const replica = chunk.replicas[0];
317
+ if (!replica)
318
+ throw new Error("deleteFile: chunk has no replicas");
319
+ const seed = decodePrivKeyEd25519(replica.replicaKey);
320
+ const kp = ed25519KeyPairFromSeed(seed);
321
+ await deleteXFTPChunk(agent, server, kp.privateKey, replica.replicaId);
322
+ }
323
+ }));
260
324
  }
261
325
  // -- Internal
262
326
  function _dbgHex(b, n = 8) {
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,EAAE;AACF,4EAA4E;AAC5E,0DAA0D;AAE1D,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAC,WAAW,EAAE,gBAAgB,EAAC,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAC,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAC,MAAM,kBAAkB,CAAA;AAChJ,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAC,MAAM,sBAAsB,CAAA;AACnH,OAAO,EACL,qBAAqB,EAAE,qBAAqB,EAAE,uBAAuB,EACrE,eAAe,EAAE,eAAe,EAEjC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EACzE,eAAe,EAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAC,YAAY,EAAE,cAAc,EAA6C,MAAM,aAAa,CAAA;AACpG,OAAO,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAA;AAEzE,OAAO,EAAC,gBAAgB,EAAE,eAAe,EAAC,MAAM,uBAAuB,CAAA;AAsCvE,kEAAkE;AAElE,MAAM,UAAU,oBAAoB,CAAC,EAAmB;IACtD,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,OAAO,eAAe,CAAC,UAAU,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;IAClE,MAAM,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,GAAG,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAA;IACvC,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAA;IACxD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,YAAY;AAEZ,MAAM,UAAU,oBAAoB,CAAC,MAAkB,EAAE,QAAgB;IACvE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC,CAAA;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAW,GAAG,WAAW,CAAA;IAChE,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,oCAAoC,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpI,OAAO,EAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAC,CAAA;AAClD,CAAC;AAED,MAAM,0BAA0B,GAAG,GAAG,CAAA;AAQtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAsB,EACtB,MAAkB,EAClB,SAAgC,EAChC,OAAuB;IAEvB,MAAM,EAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAC,GAAG,OAAO,IAAI,EAAE,CAAA;IAC9E,MAAM,SAAS,GAA0D,YAAY;QACnF,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS;YACrB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAE,SAA+B,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAChG,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IAC3F,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACrD,MAAM,UAAU,GAAgB,EAAE,CAAA;IAClC,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA;QACtC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACnE,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,WAAW,IAAI,CAAC,WAAW,SAAS,IAAI,CAAC,SAAS,WAAW,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,eAAe,OAAO,CAAC,SAAS,CAAC,eAAe,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACnN,MAAM,QAAQ,GAAa;YACzB,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,MAAM,eAAe,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;QAC9D,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAC,GAAG,MAAM,eAAe,CACpD,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,CAC3D,CAAA;QACD,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC3E,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU;YAC9C,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,UAAU;YAC5D,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;SACvD,CAAC,CAAA;QACF,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAA;QAC1B,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;IAC3E,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;IACxE,IAAI,GAAG,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAA;IAC9C,IAAI,mBAAmB,GAAG,cAAc,CAAA;IACxC,MAAM,SAAS,GAAG,iBAAiB,IAAI,0BAA0B,CAAA;IACjE,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,mBAAmB,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,CAAA;QACpF,GAAG,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,EAAC,CAAA;AACnE,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA6B,EAC7B,GAA0B,EAC1B,MAAmB;IAEnB,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACtC,OAAO;QACL,KAAK;QACL,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC;oBACT,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClC,SAAS,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;oBAC7D,UAAU,EAAE,oBAAoB,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;iBACvF,CAAC;SACH,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI;KACf,CAAA;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,KAAsB,EACtB,MAAkB,EAClB,OAAwB;IAExB,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,UAAU,GAAgB,EAAE,CAAA;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA;QACtC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3F,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAa;YACzB,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,MAAM,EAAE,WAAW;SACpB,CAAA;QACD,MAAM,eAAe,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;QAC9D,MAAM,EAAC,QAAQ,EAAE,YAAY,EAAC,GAAG,MAAM,eAAe,CACpD,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,CAC3D,CAAA;QACD,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC3E,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU;YAC9C,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,UAAU;YAC5D,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;SACvD,CAAC,CAAA;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC;oBACT,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClC,SAAS,EAAE,CAAC,CAAC,WAAW;oBACxB,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC;iBACjD,CAAC;SACH,CAAC,CAAC;QACH,QAAQ,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAC;KACvD,CAAA;AACH,CAAC;AAiBD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAsB,EACtB,EAAmB,EACnB,UAAwD,EACxD,OAA4B;IAE5B,MAAM,GAAG,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAA;IACvC,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,GAAG,CAAC,CAAA;IACnD,MAAM,EAAC,UAAU,EAAE,WAAW,GAAG,CAAC,EAAC,GAAG,OAAO,IAAI,EAAE,CAAA;IACnD,2DAA2D;IAC3D,IAAI,EAAE,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC/F,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IAClL,CAAC;IACD,MAAM,UAAU,GAAG,EAAE,CAAA;IACrB,iFAAiF;IACjF,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAA;IAC5D,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAA;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC7C,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;QACpE,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACjC,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACrD,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;YACvC,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;YACvF,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,OAAO,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,sBAAsB,KAAK,CAAC,SAAS,WAAW,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,UAAU,2BAA2B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;YAClP,MAAM,UAAU,CAAC;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAA;YACF,UAAU,IAAI,KAAK,CAAC,SAAS,CAAA;YAC7B,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC,CAAA;IACH,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAsB,EACtB,EAAmB,EACnB,UAAwD;IAExD,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAChE,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAC5C,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAC9C,CAAA;IACH,CAAC,EAAE,EAAC,UAAU,EAAC,CAAC,CAAA;IAChB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1D,IAAI,SAAS,KAAK,UAAU,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACtF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAClG,OAAO,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;AAClD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAsB,EACtB,EAAmB;IAEnB,MAAM,eAAe,GAAiB,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACjE,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QACvE,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACrD,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACnG,eAAe,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;IAC3C,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACnE,IAAI,SAAS,KAAK,EAAE,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAC1F,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,CAAC,CAAA;IAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACtG,MAAM,EAAC,OAAO,EAAE,SAAS,EAAC,GAAG,qBAAqB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAA;IACvE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,QAAQ,CAAC,CAAA;IACxF,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,QAAS,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;IAClG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,QAAS,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IACnH,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,YAAY;AAEZ,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB,EAAE,cAA+B;IACtF,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACrD,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACxE,CAAC;AACH,CAAC;AAED,cAAc;AAEd,SAAS,OAAO,CAAC,CAAa,EAAE,CAAC,GAAG,CAAC;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACrF,CAAC;AAED,SAAS,WAAW,CAAC,CAAa,EAAE,CAAa;IAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,OAAO,IAAI,KAAK,CAAC,CAAA;AACnB,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -58,6 +58,8 @@ export interface RawChunkResponse {
58
58
  export declare function downloadXFTPChunkRaw(agent: XFTPClientAgent, server: XFTPServer, rpKey: Uint8Array, fId: Uint8Array): Promise<RawChunkResponse>;
59
59
  export declare function downloadXFTPChunk(agent: XFTPClientAgent, server: XFTPServer, rpKey: Uint8Array, fId: Uint8Array, digest?: Uint8Array): Promise<Uint8Array>;
60
60
  export declare function deleteXFTPChunk(agent: XFTPClientAgent, server: XFTPServer, spKey: Uint8Array, sId: Uint8Array): Promise<void>;
61
+ export declare function ackXFTPChunk(agent: XFTPClientAgent, server: XFTPServer, rpKey: Uint8Array, rId: Uint8Array): Promise<void>;
61
62
  export declare function pingXFTP(agent: XFTPClientAgent, server: XFTPServer): Promise<void>;
62
63
  export declare function closeXFTP(c: XFTPClient): void;
63
64
  export {};
65
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEW,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EACrE,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAOrD,qBAAa,kBAAmB,SAAQ,KAAK;aACf,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAI9C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aACf,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI/D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAM/C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,CAKjD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAiB9E;AAID,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,UAAU,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB;AAID,UAAU,SAAS;IACjB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC7E,KAAK,IAAI,IAAI,CAAA;CACd;AA0ED,UAAU,gBAAgB;IACxB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAC1C,iEAAiE;IACjE,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CACxD;AAED,wBAAgB,YAAY,IAAI,eAAe,CAE9C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAanG;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAY/F;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GACvE,IAAI,CAON;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAOtF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAK3D;AAID,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAoD5G;AAiDD,wBAAsB,eAAe,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,UAAU,EACtB,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAC,CAAC,CAqBrD;AAID,wBAAsB,eAAe,CACnC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAC7E,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,UAAU,GAAG,IAAW,GACpD,OAAO,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,UAAU,EAAE,CAAA;CAAC,CAAC,CAI7D;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,GACpG,OAAO,CAAC,UAAU,EAAE,CAAC,CAIvB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GACpG,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,UAAU,CAAA;IACpB,KAAK,EAAE,UAAU,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAC7E,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,UAAU,GAClG,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAC7E,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAC7E,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CASxF;AAID,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAE7C"}
package/dist/client.js CHANGED
@@ -8,7 +8,7 @@ import { encodeAuthTransmission, encodeTransmission, decodeTransmission, XFTP_BL
8
8
  import { encodeClientHello, encodeClientHandshake, decodeServerHandshake, compatibleVRange } from "./protocol/handshake.js";
9
9
  import { verifyIdentityProof } from "./crypto/identity.js";
10
10
  import { generateX25519KeyPair, encodePubKeyX25519, dh } from "./crypto/keys.js";
11
- import { encodeFNEW, encodeFADD, encodeFPUT, encodeFGET, encodeFDEL, encodePING, decodeResponse } from "./protocol/commands.js";
11
+ import { encodeFNEW, encodeFADD, encodeFPUT, encodeFGET, encodeFACK, encodeFDEL, encodePING, decodeResponse } from "./protocol/commands.js";
12
12
  import { decryptReceivedChunk } from "./download.js";
13
13
  import { formatXFTPServer } from "./protocol/address.js";
14
14
  import { concatBytes } from "./protocol/encoding.js";
@@ -334,6 +334,11 @@ export async function deleteXFTPChunk(agent, server, spKey, sId) {
334
334
  if (response.type !== "FROk")
335
335
  throw new Error("unexpected response: " + response.type);
336
336
  }
337
+ export async function ackXFTPChunk(agent, server, rpKey, rId) {
338
+ const { response } = await sendXFTPCommand(agent, server, rpKey, rId, encodeFACK());
339
+ if (response.type !== "FROk")
340
+ throw new Error("unexpected response: " + response.type);
341
+ }
337
342
  export async function pingXFTP(agent, server) {
338
343
  const client = await getXFTPServerClient(agent, server);
339
344
  const corrId = new Uint8Array(0);