dropspace 0.0.0-stage → 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 (63) hide show
  1. package/README.md +17 -2
  2. package/dist/automerge/index.d.ts +103 -0
  3. package/dist/automerge/index.d.ts.map +1 -0
  4. package/dist/automerge/index.js +394 -0
  5. package/dist/automerge/index.js.map +1 -0
  6. package/dist/client/channel.d.ts +131 -0
  7. package/dist/client/channel.d.ts.map +1 -0
  8. package/dist/client/channel.js +566 -0
  9. package/dist/client/channel.js.map +1 -0
  10. package/dist/client/client.d.ts +310 -0
  11. package/dist/client/client.d.ts.map +1 -0
  12. package/dist/client/client.js +1176 -0
  13. package/dist/client/client.js.map +1 -0
  14. package/dist/client/events.d.ts +14 -0
  15. package/dist/client/events.d.ts.map +1 -0
  16. package/dist/client/events.js +71 -0
  17. package/dist/client/events.js.map +1 -0
  18. package/dist/client/identity.d.ts +89 -0
  19. package/dist/client/identity.d.ts.map +1 -0
  20. package/dist/client/identity.js +274 -0
  21. package/dist/client/identity.js.map +1 -0
  22. package/dist/client/index.d.ts +8 -0
  23. package/dist/client/index.d.ts.map +1 -0
  24. package/dist/client/index.js +8 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/client/peer-connection.d.ts +182 -0
  27. package/dist/client/peer-connection.d.ts.map +1 -0
  28. package/dist/client/peer-connection.js +593 -0
  29. package/dist/client/peer-connection.js.map +1 -0
  30. package/dist/client/peer-selection.d.ts +70 -0
  31. package/dist/client/peer-selection.d.ts.map +1 -0
  32. package/dist/client/peer-selection.js +193 -0
  33. package/dist/client/peer-selection.js.map +1 -0
  34. package/dist/client/storage.d.ts +118 -0
  35. package/dist/client/storage.d.ts.map +1 -0
  36. package/dist/client/storage.js +463 -0
  37. package/dist/client/storage.js.map +1 -0
  38. package/dist/files/index.d.ts +136 -0
  39. package/dist/files/index.d.ts.map +1 -0
  40. package/dist/files/index.js +701 -0
  41. package/dist/files/index.js.map +1 -0
  42. package/dist/files/sha256.d.ts +24 -0
  43. package/dist/files/sha256.d.ts.map +1 -0
  44. package/dist/files/sha256.js +133 -0
  45. package/dist/files/sha256.js.map +1 -0
  46. package/dist/index.d.ts +4 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +4 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/protocol/envelope.d.ts +61 -0
  51. package/dist/protocol/envelope.d.ts.map +1 -0
  52. package/dist/protocol/envelope.js +260 -0
  53. package/dist/protocol/envelope.js.map +1 -0
  54. package/dist/protocol/framing.d.ts +56 -0
  55. package/dist/protocol/framing.d.ts.map +1 -0
  56. package/dist/protocol/framing.js +93 -0
  57. package/dist/protocol/framing.js.map +1 -0
  58. package/dist/protocol/index.d.ts +3 -0
  59. package/dist/protocol/index.d.ts.map +1 -0
  60. package/dist/protocol/index.js +3 -0
  61. package/dist/protocol/index.js.map +1 -0
  62. package/fixtures/envelopes.json +132 -0
  63. package/package.json +43 -4
@@ -0,0 +1,463 @@
1
+ export class DropspaceStorageError extends Error {
2
+ code;
3
+ causeError;
4
+ constructor(message, code, causeError) {
5
+ super(message);
6
+ this.code = code;
7
+ this.causeError = causeError;
8
+ this.name = "DropspaceStorageError";
9
+ }
10
+ }
11
+ /**
12
+ * Runtime feature detection for browser storage APIs.
13
+ * Never accesses browser globals at module import time (SSR safe).
14
+ */
15
+ export function detectStorageCapabilities() {
16
+ const g = globalThis;
17
+ const nav = g.navigator;
18
+ return {
19
+ indexedDb: typeof g.indexedDB !== "undefined",
20
+ opfs: typeof nav?.storage?.getDirectory === "function",
21
+ fileSystemAccess: typeof g.showDirectoryPicker === "function" ||
22
+ typeof g.showSaveFilePicker === "function",
23
+ storageEstimate: typeof nav?.storage?.estimate === "function",
24
+ persistentStorageRequest: typeof nav?.storage?.persist === "function",
25
+ };
26
+ }
27
+ export async function getStorageQuotaEstimate() {
28
+ const nav = globalThis.navigator;
29
+ if (!nav?.storage?.estimate) {
30
+ return {
31
+ usageBytes: 0,
32
+ quotaBytes: 0,
33
+ usageRatio: 0,
34
+ persisted: null,
35
+ supported: false,
36
+ };
37
+ }
38
+ const est = await nav.storage.estimate();
39
+ const usageBytes = est.usage ?? 0;
40
+ const quotaBytes = est.quota ?? 0;
41
+ let persisted = null;
42
+ if (typeof nav.storage.persisted === "function") {
43
+ try {
44
+ persisted = await nav.storage.persisted();
45
+ }
46
+ catch {
47
+ persisted = null;
48
+ }
49
+ }
50
+ return {
51
+ usageBytes,
52
+ quotaBytes,
53
+ usageRatio: quotaBytes > 0 ? usageBytes / quotaBytes : 0,
54
+ persisted,
55
+ supported: true,
56
+ };
57
+ }
58
+ export async function requestPersistentStorage() {
59
+ const nav = globalThis.navigator;
60
+ if (!nav?.storage?.persist) {
61
+ return false;
62
+ }
63
+ try {
64
+ return await nav.storage.persist();
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ export function normalizeStorageError(err) {
71
+ if (err instanceof DropspaceStorageError) {
72
+ return err;
73
+ }
74
+ const name = err?.name ?? "";
75
+ const message = err?.message ?? String(err);
76
+ if (name === "QuotaExceededError" ||
77
+ message.toLowerCase().includes("quota") ||
78
+ message.includes("NS_ERROR_DOM_QUOTA_REACHED")) {
79
+ return new DropspaceStorageError(`Storage quota exceeded: ${message}`, "QUOTA_EXCEEDED", err);
80
+ }
81
+ if (name === "NotAllowedError" ||
82
+ name === "SecurityError" ||
83
+ message.toLowerCase().includes("permission")) {
84
+ return new DropspaceStorageError(`Storage permission denied: ${message}`, "PERMISSION_DENIED", err);
85
+ }
86
+ if (name === "NotFoundError") {
87
+ return new DropspaceStorageError(`Storage entry not found: ${message}`, "NOT_FOUND", err);
88
+ }
89
+ return new DropspaceStorageError(`Storage I/O error: ${message}`, "IO_ERROR", err);
90
+ }
91
+ /**
92
+ * Sanitizes an untrusted remote filename to prevent path traversal, null bytes,
93
+ * reserved OS device names, and hidden dot-files.
94
+ */
95
+ export function sanitizeFileName(rawName) {
96
+ if (typeof rawName !== "string" || rawName.trim().length === 0) {
97
+ throw new DropspaceStorageError("Filename must be a non-empty string", "PATH_TRAVERSAL_BLOCKED");
98
+ }
99
+ if (rawName.includes("..") ||
100
+ rawName.includes("/") ||
101
+ rawName.includes("\\") ||
102
+ rawName.includes("\0")) {
103
+ throw new DropspaceStorageError(`Unsafe remote filename rejected (path traversal or separator detected): '${rawName}'`, "PATH_TRAVERSAL_BLOCKED");
104
+ }
105
+ const cleaned = rawName.replace(/[\x00-\x1f\x7f<>:"|?*]/g, "_").trim();
106
+ if (!cleaned || cleaned === "." || cleaned === "..") {
107
+ throw new DropspaceStorageError(`Invalid filename after sanitization: '${rawName}'`, "PATH_TRAVERSAL_BLOCKED");
108
+ }
109
+ return cleaned.slice(0, 200);
110
+ }
111
+ /**
112
+ * In-memory staging & file storage adapter with configurable quota limit (for deterministic quota testing and SSR).
113
+ */
114
+ export class InMemoryBinaryStagingAdapter {
115
+ maxQuotaBytes;
116
+ kind = "memory";
117
+ stagingChunks = new Map();
118
+ completedFiles = new Map();
119
+ currentBytes = 0;
120
+ constructor(maxQuotaBytes = Number.POSITIVE_INFINITY) {
121
+ this.maxQuotaBytes = maxQuotaBytes;
122
+ }
123
+ setMaxQuotaBytes(bytes) {
124
+ this.maxQuotaBytes = bytes;
125
+ }
126
+ getUsedBytes() {
127
+ return this.currentBytes;
128
+ }
129
+ async writeChunk(transferId, chunkIndex, data) {
130
+ let transferMap = this.stagingChunks.get(transferId);
131
+ if (!transferMap) {
132
+ transferMap = new Map();
133
+ this.stagingChunks.set(transferId, transferMap);
134
+ }
135
+ const existing = transferMap.get(chunkIndex);
136
+ const delta = data.byteLength - (existing?.byteLength ?? 0);
137
+ if (this.currentBytes + delta > this.maxQuotaBytes) {
138
+ throw new DropspaceStorageError(`Storage quota exceeded (${this.currentBytes + delta} > ${this.maxQuotaBytes} bytes)`, "QUOTA_EXCEEDED");
139
+ }
140
+ const copy = new Uint8Array(data.byteLength);
141
+ copy.set(data);
142
+ transferMap.set(chunkIndex, copy);
143
+ this.currentBytes += delta;
144
+ }
145
+ async readChunk(transferId, chunkIndex) {
146
+ const chunk = this.stagingChunks.get(transferId)?.get(chunkIndex);
147
+ if (!chunk)
148
+ return null;
149
+ return new Uint8Array(chunk);
150
+ }
151
+ async listWrittenChunks(transferId) {
152
+ const map = this.stagingChunks.get(transferId);
153
+ if (!map)
154
+ return [];
155
+ return Array.from(map.keys()).sort((a, b) => a - b);
156
+ }
157
+ async finalizeTransfer(transferId, rawFileName, totalChunks, options) {
158
+ const safeName = sanitizeFileName(rawFileName);
159
+ if (!options?.allowOverwrite && this.completedFiles.has(safeName)) {
160
+ throw new DropspaceStorageError(`File '${safeName}' already exists and allowOverwrite is false`, "OVERWRITE_BLOCKED");
161
+ }
162
+ const map = this.stagingChunks.get(transferId);
163
+ if (!map) {
164
+ throw new DropspaceStorageError(`Staging data not found for transfer '${transferId}'`, "NOT_FOUND");
165
+ }
166
+ let totalBytes = 0;
167
+ const ordered = [];
168
+ for (let i = 0; i < totalChunks; i++) {
169
+ const part = map.get(i);
170
+ if (!part) {
171
+ throw new DropspaceStorageError(`Cannot finalize transfer '${transferId}': missing chunk ${i} of ${totalChunks}`, "IO_ERROR");
172
+ }
173
+ ordered.push(part);
174
+ totalBytes += part.byteLength;
175
+ }
176
+ const assembled = new Uint8Array(totalBytes);
177
+ let offset = 0;
178
+ for (let i = 0; i < ordered.length; i++) {
179
+ assembled.set(ordered[i], offset);
180
+ offset += ordered[i].byteLength;
181
+ }
182
+ this.completedFiles.set(safeName, assembled);
183
+ await this.deleteTransferStaging(transferId);
184
+ return { finalKey: safeName, byteLength: totalBytes };
185
+ }
186
+ async readCompletedFile(finalKey) {
187
+ const safeName = sanitizeFileName(finalKey);
188
+ const data = this.completedFiles.get(safeName);
189
+ return data ? new Uint8Array(data) : null;
190
+ }
191
+ async deleteTransferStaging(transferId) {
192
+ const map = this.stagingChunks.get(transferId);
193
+ if (map) {
194
+ for (const chunk of map.values()) {
195
+ this.currentBytes = Math.max(0, this.currentBytes - chunk.byteLength);
196
+ }
197
+ this.stagingChunks.delete(transferId);
198
+ }
199
+ }
200
+ async exportBackup() {
201
+ const out = {};
202
+ for (const [key, bytes] of this.completedFiles.entries()) {
203
+ out[key] = Buffer.from(bytes).toString("base64");
204
+ }
205
+ return out;
206
+ }
207
+ async importBackup(snapshot) {
208
+ for (const [key, b64] of Object.entries(snapshot)) {
209
+ const safe = sanitizeFileName(key);
210
+ this.completedFiles.set(safe, new Uint8Array(Buffer.from(b64, "base64")));
211
+ }
212
+ }
213
+ }
214
+ /**
215
+ * Origin Private File System (OPFS) adapter for large binary staging and completed files.
216
+ * Keeps incomplete transfers in `.staging/<transferId>/chunk_<idx>.part` and promotes to `completed/<safeFileName>`.
217
+ */
218
+ export class OpfsBinaryStagingAdapter {
219
+ kind = "opfs";
220
+ async getRootDir() {
221
+ const nav = globalThis.navigator;
222
+ if (!nav?.storage?.getDirectory) {
223
+ throw new DropspaceStorageError("OPFS (navigator.storage.getDirectory) is not supported in this browser", "NOT_SUPPORTED");
224
+ }
225
+ try {
226
+ return await nav.storage.getDirectory();
227
+ }
228
+ catch (err) {
229
+ throw normalizeStorageError(err);
230
+ }
231
+ }
232
+ async getTransferStagingDir(transferId, create) {
233
+ const root = await this.getRootDir();
234
+ const stagingRoot = await root.getDirectoryHandle("dropspace_staging", { create });
235
+ return await stagingRoot.getDirectoryHandle(sanitizeFileName(transferId), { create });
236
+ }
237
+ async getCompletedDir(create) {
238
+ const root = await this.getRootDir();
239
+ return await root.getDirectoryHandle("dropspace_completed", { create });
240
+ }
241
+ async writeChunk(transferId, chunkIndex, data) {
242
+ try {
243
+ const dir = await this.getTransferStagingDir(transferId, true);
244
+ const fileHandle = await dir.getFileHandle(`chunk_${chunkIndex}.part`, { create: true });
245
+ const writable = await fileHandle.createWritable();
246
+ await writable.write(data);
247
+ await writable.close();
248
+ }
249
+ catch (err) {
250
+ throw normalizeStorageError(err);
251
+ }
252
+ }
253
+ async readChunk(transferId, chunkIndex) {
254
+ try {
255
+ const dir = await this.getTransferStagingDir(transferId, false);
256
+ const fileHandle = await dir.getFileHandle(`chunk_${chunkIndex}.part`, { create: false });
257
+ const file = await fileHandle.getFile();
258
+ return new Uint8Array(await file.arrayBuffer());
259
+ }
260
+ catch {
261
+ return null;
262
+ }
263
+ }
264
+ async listWrittenChunks(transferId) {
265
+ try {
266
+ const dir = await this.getTransferStagingDir(transferId, false);
267
+ const indices = [];
268
+ const entriesIter = dir.entries();
269
+ for await (const [name] of entriesIter) {
270
+ const match = /^chunk_(\d+)\.part$/.exec(name);
271
+ if (match && match[1]) {
272
+ indices.push(Number(match[1]));
273
+ }
274
+ }
275
+ return indices.sort((a, b) => a - b);
276
+ }
277
+ catch {
278
+ return [];
279
+ }
280
+ }
281
+ async finalizeTransfer(transferId, rawFileName, totalChunks, options) {
282
+ const safeName = sanitizeFileName(rawFileName);
283
+ try {
284
+ const completedDir = await this.getCompletedDir(true);
285
+ if (!options?.allowOverwrite) {
286
+ let exists = false;
287
+ try {
288
+ await completedDir.getFileHandle(safeName, { create: false });
289
+ exists = true;
290
+ }
291
+ catch {
292
+ exists = false;
293
+ }
294
+ if (exists) {
295
+ throw new DropspaceStorageError(`File '${safeName}' already exists in OPFS and allowOverwrite is false`, "OVERWRITE_BLOCKED");
296
+ }
297
+ }
298
+ const outHandle = await completedDir.getFileHandle(safeName, { create: true });
299
+ const writable = await outHandle.createWritable();
300
+ let totalBytes = 0;
301
+ for (let i = 0; i < totalChunks; i++) {
302
+ const chunk = await this.readChunk(transferId, i);
303
+ if (!chunk) {
304
+ await writable.abort();
305
+ throw new DropspaceStorageError(`Missing chunk ${i} during OPFS finalize for '${transferId}'`, "IO_ERROR");
306
+ }
307
+ await writable.write(chunk);
308
+ totalBytes += chunk.byteLength;
309
+ }
310
+ await writable.close();
311
+ await this.deleteTransferStaging(transferId);
312
+ return { finalKey: safeName, byteLength: totalBytes };
313
+ }
314
+ catch (err) {
315
+ throw normalizeStorageError(err);
316
+ }
317
+ }
318
+ async readCompletedFile(finalKey) {
319
+ const safeName = sanitizeFileName(finalKey);
320
+ try {
321
+ const completedDir = await this.getCompletedDir(false);
322
+ const fh = await completedDir.getFileHandle(safeName, { create: false });
323
+ const file = await fh.getFile();
324
+ return new Uint8Array(await file.arrayBuffer());
325
+ }
326
+ catch {
327
+ return null;
328
+ }
329
+ }
330
+ async deleteTransferStaging(transferId) {
331
+ try {
332
+ const root = await this.getRootDir();
333
+ const stagingRoot = await root.getDirectoryHandle("dropspace_staging", { create: false });
334
+ await stagingRoot.removeEntry(sanitizeFileName(transferId), { recursive: true });
335
+ }
336
+ catch {
337
+ // Already cleaned up
338
+ }
339
+ }
340
+ async exportBackup() {
341
+ const out = {};
342
+ try {
343
+ const completedDir = await this.getCompletedDir(false);
344
+ const entriesIter = completedDir.entries();
345
+ for await (const [name, handle] of entriesIter) {
346
+ const file = await handle.getFile();
347
+ const bytes = new Uint8Array(await file.arrayBuffer());
348
+ let bin = "";
349
+ for (let i = 0; i < bytes.byteLength; i++) {
350
+ bin += String.fromCharCode(bytes[i]);
351
+ }
352
+ out[name] = globalThis.btoa(bin);
353
+ }
354
+ }
355
+ catch {
356
+ // Ignore if directory does not exist yet
357
+ }
358
+ return out;
359
+ }
360
+ async importBackup(snapshot) {
361
+ const completedDir = await this.getCompletedDir(true);
362
+ for (const [name, b64] of Object.entries(snapshot)) {
363
+ const safeName = sanitizeFileName(name);
364
+ const bin = globalThis.atob(b64);
365
+ const bytes = new Uint8Array(bin.length);
366
+ for (let i = 0; i < bin.length; i++) {
367
+ bytes[i] = bin.charCodeAt(i);
368
+ }
369
+ const fh = await completedDir.getFileHandle(safeName, { create: true });
370
+ const writable = await fh.createWritable();
371
+ await writable.write(bytes);
372
+ await writable.close();
373
+ }
374
+ }
375
+ }
376
+ /**
377
+ * Real user directory adapter using File System Access API (`FileSystemDirectoryHandle`),
378
+ * strictly distinct from Origin-Private Storage (OPFS).
379
+ * Handles permission re-prompting on stored handles and download fallback when unsupported.
380
+ */
381
+ export class UserDirectoryStorageAdapter {
382
+ directoryHandle;
383
+ constructor(directoryHandle = null) {
384
+ this.directoryHandle = directoryHandle;
385
+ }
386
+ setDirectoryHandle(handle) {
387
+ this.directoryHandle = handle;
388
+ }
389
+ getDirectoryHandle() {
390
+ return this.directoryHandle;
391
+ }
392
+ async verifyOrRequestPermission(mode = "readwrite") {
393
+ if (!this.directoryHandle) {
394
+ throw new DropspaceStorageError("No user directory handle selected", "PERMISSION_DENIED");
395
+ }
396
+ const h = this.directoryHandle;
397
+ try {
398
+ if (typeof h.queryPermission === "function") {
399
+ const state = await h.queryPermission({ mode });
400
+ if (state === "granted")
401
+ return true;
402
+ }
403
+ if (typeof h.requestPermission === "function") {
404
+ const requested = await h.requestPermission({ mode });
405
+ if (requested === "granted")
406
+ return true;
407
+ }
408
+ return false;
409
+ }
410
+ catch (err) {
411
+ throw normalizeStorageError(err);
412
+ }
413
+ }
414
+ async saveFileToUserDirectory(rawFileName, content, options) {
415
+ const safeName = sanitizeFileName(rawFileName);
416
+ const hasPerm = await this.verifyOrRequestPermission("readwrite");
417
+ if (!hasPerm || !this.directoryHandle) {
418
+ throw new DropspaceStorageError("User denied write permission to selected directory", "PERMISSION_DENIED");
419
+ }
420
+ if (!options?.allowOverwrite) {
421
+ let exists = false;
422
+ try {
423
+ await this.directoryHandle.getFileHandle(safeName, { create: false });
424
+ exists = true;
425
+ }
426
+ catch {
427
+ exists = false;
428
+ }
429
+ if (exists) {
430
+ throw new DropspaceStorageError(`File '${safeName}' already exists in user directory`, "OVERWRITE_BLOCKED");
431
+ }
432
+ }
433
+ try {
434
+ const fh = await this.directoryHandle.getFileHandle(safeName, { create: true });
435
+ const writable = await fh.createWritable();
436
+ await writable.write(content);
437
+ await writable.close();
438
+ }
439
+ catch (err) {
440
+ throw normalizeStorageError(err);
441
+ }
442
+ }
443
+ /**
444
+ * Browser download fallback when File System Access API is unavailable.
445
+ */
446
+ triggerBrowserDownloadFallback(rawFileName, content, mimeType = "application/octet-stream") {
447
+ const safeName = sanitizeFileName(rawFileName);
448
+ if (typeof document === "undefined" || typeof URL === "undefined") {
449
+ throw new DropspaceStorageError("Browser download fallback requires DOM environment", "NOT_SUPPORTED");
450
+ }
451
+ const blob = new Blob([content], { type: mimeType });
452
+ const url = URL.createObjectURL(blob);
453
+ const a = document.createElement("a");
454
+ a.href = url;
455
+ a.download = safeName;
456
+ a.style.display = "none";
457
+ document.body.appendChild(a);
458
+ a.click();
459
+ document.body.removeChild(a);
460
+ URL.revokeObjectURL(url);
461
+ }
462
+ }
463
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/client/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { TypedEventEmitter, type BinaryStagingStorageAdapter, type DropspaceClient } from "../client/index.js";
2
+ import { StreamingSha256, sha256HexSync } from "./sha256.js";
3
+ export { StreamingSha256, sha256HexSync };
4
+ export type TransferState = "offered" | "accepted" | "transferring" | "paused" | "verifying" | "completed" | "cancelled" | "failed";
5
+ export type TransferErrorCode = "FILE_TOO_LARGE" | "POLICY_REJECTED" | "SOURCE_FILE_MODIFIED" | "HASH_MISMATCH" | "QUOTA_EXCEEDED" | "PERMISSION_DENIED" | "PATH_TRAVERSAL_BLOCKED" | "OVERWRITE_BLOCKED" | "CANCELLED" | "PEER_DISCONNECTED" | "IO_ERROR";
6
+ export declare class FileTransferError extends Error {
7
+ readonly code: TransferErrorCode;
8
+ readonly transferId?: string | undefined;
9
+ constructor(message: string, code: TransferErrorCode, transferId?: string | undefined);
10
+ }
11
+ /**
12
+ * Abstract streaming/sliceable file source that avoids loading the whole file into memory.
13
+ */
14
+ export interface SliceableFileSource {
15
+ readonly name: string;
16
+ readonly size: number;
17
+ readonly mimeType: string;
18
+ readonly lastModified: number;
19
+ readSlice(start: number, end: number): Promise<Uint8Array>;
20
+ }
21
+ export declare function createBlobFileSource(blob: Blob & {
22
+ name?: string;
23
+ lastModified?: number;
24
+ }, overrideName?: string): SliceableFileSource;
25
+ export interface FileTransferManifest {
26
+ transferId: string;
27
+ peerDeviceId: string;
28
+ direction: "send" | "receive";
29
+ fileName: string;
30
+ mimeType: string;
31
+ totalBytes: number;
32
+ chunkSize: number;
33
+ totalChunks: number;
34
+ fileSha256: string;
35
+ lastModified: number;
36
+ state: TransferState;
37
+ completedChunks: number[];
38
+ transferredBytes: number;
39
+ finalStorageKey?: string;
40
+ error?: {
41
+ code: TransferErrorCode;
42
+ message: string;
43
+ };
44
+ startedAt: number;
45
+ updatedAt: number;
46
+ }
47
+ export interface TransferProgressEvent {
48
+ transferId: string;
49
+ peerDeviceId: string;
50
+ direction: "send" | "receive";
51
+ fileName: string;
52
+ state: TransferState;
53
+ transferredBytes: number;
54
+ totalBytes: number;
55
+ completedChunks: number;
56
+ totalChunks: number;
57
+ progressRatio: number;
58
+ bytesPerSecond: number;
59
+ }
60
+ export interface FileAcceptancePolicy {
61
+ maxFileSizeBytes?: number;
62
+ allowedMimeTypes?: string[];
63
+ allowOverwrite?: boolean;
64
+ autoAccept?: boolean;
65
+ onIncomingOffer?: (manifest: FileTransferManifest) => Promise<boolean> | boolean;
66
+ }
67
+ export interface FileTransferManagerOptions {
68
+ client: DropspaceClient;
69
+ storage?: BinaryStagingStorageAdapter;
70
+ chunkSize?: number;
71
+ policy?: FileAcceptancePolicy;
72
+ }
73
+ export type FileTransferManagerEvents = {
74
+ incomingOffer: FileTransferManifest;
75
+ progress: TransferProgressEvent;
76
+ stateChange: FileTransferManifest;
77
+ completed: {
78
+ manifest: FileTransferManifest;
79
+ finalStorageKey?: string;
80
+ };
81
+ error: {
82
+ transferId: string;
83
+ error: FileTransferError;
84
+ };
85
+ };
86
+ /**
87
+ * Bounded-memory, chunk-tracked, pausable and resumable file transfer engine over Dropspace DataChannels.
88
+ */
89
+ export declare class FileTransferManager {
90
+ private readonly options;
91
+ readonly events: TypedEventEmitter<FileTransferManagerEvents>;
92
+ readonly storage: BinaryStagingStorageAdapter;
93
+ private readonly chunkSize;
94
+ private readonly policy;
95
+ private readonly outgoing;
96
+ private readonly incoming;
97
+ private readonly unsubscribeClient;
98
+ constructor(options: FileTransferManagerOptions);
99
+ /**
100
+ * Computes the SHA-256 hash of a `SliceableFileSource` in bounded memory (one chunk at a time).
101
+ */
102
+ computeSourceSha256(source: SliceableFileSource, chunkSize?: number): Promise<string>;
103
+ /**
104
+ * Verifies that the underlying file source has not mutated since the transfer started.
105
+ */
106
+ private verifySourceUnchanged;
107
+ sendFile(peerDeviceId: string, sourceInput: SliceableFileSource | (Blob & {
108
+ name?: string;
109
+ lastModified?: number;
110
+ }), options?: {
111
+ transferId?: string;
112
+ chunkSize?: number;
113
+ waitForCompletion?: boolean;
114
+ signal?: AbortSignal;
115
+ }): Promise<FileTransferManifest>;
116
+ pauseTransfer(transferId: string): Promise<void>;
117
+ /**
118
+ * Resumes a paused or interrupted transfer from the exact missing chunks without re-sending
119
+ * chunks that have already been persisted on the receiver.
120
+ * Before resuming on the sender side, verifies that the source file has not been modified!
121
+ */
122
+ resumeTransfer(transferId: string): Promise<void>;
123
+ cancelTransfer(transferId: string, reason?: string): Promise<void>;
124
+ getTransfer(transferId: string): FileTransferManifest | undefined;
125
+ listTransfers(): FileTransferManifest[];
126
+ private sendControlFrame;
127
+ private handleIncomingFrame;
128
+ private handleIncomingOffer;
129
+ private pumpOutgoingChunks;
130
+ private handleIncomingChunk;
131
+ private verifyAndFinalizeIncoming;
132
+ private failOutgoingTransfer;
133
+ private failIncomingTransfer;
134
+ close(): void;
135
+ }
136
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/files/index.ts"],"names":[],"mappings":"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"}