openrtc-file-transfer 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/dist/index.d.ts +54 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +486 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# openrtc-file-transfer
|
|
2
2
|
|
|
3
|
-
Optional file-transfer protocol for OpenRTC applications.
|
|
4
|
-
|
|
3
|
+
Optional file-transfer protocol for OpenRTC applications. OpenRTC remains the
|
|
4
|
+
connection and route owner; this package supplies application framing.
|
|
5
5
|
|
|
6
6
|
```ts
|
|
7
7
|
import { createFileTransferProtocol } from 'openrtc-file-transfer';
|
|
@@ -11,6 +11,15 @@ const stop = files.onIncoming(({ file }) => saveBlob(file.blob, file.name));
|
|
|
11
11
|
await files.send(deviceId, selectedFile, { onProgress: console.log });
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
+
When the client exposes OpenRTC's application-message surface, the protocol
|
|
15
|
+
uses bounded `OFT2` segments. OpenRTC selects the best currently proven route
|
|
16
|
+
for every segment, so an in-flight transfer can promote from relay to WebRTC,
|
|
17
|
+
MoQ, LAN, or direct QUIC and can fall back again without restarting. The
|
|
18
|
+
receiver ACKs its highest contiguous accepted offset; a missing ACK or route
|
|
19
|
+
failure causes a bounded resume negotiation from that receiver-owned offset.
|
|
20
|
+
The older named-stream framing remains the compatibility path for clients that
|
|
21
|
+
do not expose application messages.
|
|
22
|
+
|
|
14
23
|
The package owns reusable framing, bounded validation, acknowledgement,
|
|
15
24
|
progress, cancellation, and optional SHA-256 verification. Applications own
|
|
16
25
|
file pickers, destination paths, acceptance policy, persistent queues, history,
|
|
@@ -22,3 +31,7 @@ custom sink receiving SHA-256-protected transfers must implement
|
|
|
22
31
|
unchecked native file. Resume uses a declared `offset`: the sender starts at
|
|
23
32
|
that byte and the receiver accepts it only when its sink reports the exact
|
|
24
33
|
application-verified `resumeOffset`.
|
|
34
|
+
|
|
35
|
+
The protocol never caches a transport, dials a peer, or promotes a route. The
|
|
36
|
+
consumer keeps durable product intent pending until the receiver confirms the
|
|
37
|
+
completed size and integrity.
|
package/dist/index.d.ts
CHANGED
|
@@ -42,10 +42,14 @@ export interface IncomingTransfer<Result = ReceivedFile> {
|
|
|
42
42
|
result: Result;
|
|
43
43
|
}
|
|
44
44
|
export interface FileTransferProtocolOptions<Result = ReceivedFile> {
|
|
45
|
+
/** Adaptive uses route-selected segments; stream retains the v1 named-stream carrier. */
|
|
46
|
+
routing?: 'adaptive' | 'stream';
|
|
45
47
|
channel?: RuntimeChannelDescriptor;
|
|
46
48
|
chunkBytes?: number;
|
|
47
49
|
maxHeaderBytes?: number;
|
|
48
50
|
maxFileBytes?: number;
|
|
51
|
+
/** Maximum time to wait for the receiver's persisted-and-verified ACK. */
|
|
52
|
+
ackTimeoutMs?: number;
|
|
49
53
|
createReceiveSink?: (header: FileTransferHeader, remoteNodeId: string) => Promise<ReceiveSink<Result>>;
|
|
50
54
|
}
|
|
51
55
|
export interface SendFileOptions {
|
|
@@ -62,9 +66,58 @@ export interface ReceiveFileOptions<Result> {
|
|
|
62
66
|
onFile: (transfer: IncomingTransfer<Result>) => void | Promise<void>;
|
|
63
67
|
onError?: (error: Error) => void;
|
|
64
68
|
}
|
|
69
|
+
export type RoutedTransferFrame = {
|
|
70
|
+
kind: 'offer';
|
|
71
|
+
header: FileTransferHeader;
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'resume';
|
|
74
|
+
transferId: string;
|
|
75
|
+
offset: number;
|
|
76
|
+
} | {
|
|
77
|
+
kind: 'chunk';
|
|
78
|
+
transferId: string;
|
|
79
|
+
offset: number;
|
|
80
|
+
ackRequested: boolean;
|
|
81
|
+
bytes: Uint8Array;
|
|
82
|
+
} | {
|
|
83
|
+
kind: 'ack';
|
|
84
|
+
transferId: string;
|
|
85
|
+
offset: number;
|
|
86
|
+
} | {
|
|
87
|
+
kind: 'complete';
|
|
88
|
+
transferId: string;
|
|
89
|
+
size: number;
|
|
90
|
+
} | {
|
|
91
|
+
kind: 'completed';
|
|
92
|
+
transferId: string;
|
|
93
|
+
size: number;
|
|
94
|
+
} | {
|
|
95
|
+
kind: 'reject';
|
|
96
|
+
transferId: string;
|
|
97
|
+
reason: string;
|
|
98
|
+
};
|
|
99
|
+
export interface RoutedFileTransferProtocolOptions<Result = ReceivedFile> extends FileTransferProtocolOptions<Result> {
|
|
100
|
+
/** Number of chunks sent before requiring a receiver-persisted offset ACK. */
|
|
101
|
+
windowChunks?: number;
|
|
102
|
+
/** Bounded protocol recovery attempts before the app outbox retries later. */
|
|
103
|
+
maxRecoveryAttempts?: number;
|
|
104
|
+
}
|
|
105
|
+
export declare function encodeRoutedTransferFrame(frame: RoutedTransferFrame, maxHeaderBytes?: number, maxChunkBytes?: number): Uint8Array;
|
|
106
|
+
export declare function decodeRoutedTransferFrame(input: Uint8Array, maxFileBytes?: number, maxHeaderBytes?: number, maxChunkBytes?: number): RoutedTransferFrame | null;
|
|
65
107
|
export declare function createFileTransferProtocol<Result = ReceivedFile>(client: OpenRTCClient, options?: FileTransferProtocolOptions<Result>): {
|
|
66
108
|
send(deviceId: string, file: File, sendOptions?: SendFileOptions): Promise<string>;
|
|
67
|
-
onIncoming(
|
|
109
|
+
onIncoming(configured: ReceiveFileOptions<Result>): () => void;
|
|
110
|
+
dispose(): void;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Route-adaptive file transfer. Each bounded chunk is sent through
|
|
114
|
+
* `Connection.send`, so OpenRTC re-ranks the currently proven routes for every
|
|
115
|
+
* chunk. Receiver-confirmed offsets survive optional-route promotion/failure;
|
|
116
|
+
* the consumer remains responsible for persisting the surrounding intent.
|
|
117
|
+
*/
|
|
118
|
+
export declare function createRoutedFileTransferProtocol<Result = ReceivedFile>(client: OpenRTCClient, options?: RoutedFileTransferProtocolOptions<Result>): {
|
|
119
|
+
send(deviceId: string, file: File, sendOptions?: SendFileOptions): Promise<string>;
|
|
120
|
+
onIncoming(configured: ReceiveFileOptions<Result>): () => void;
|
|
68
121
|
dispose(): void;
|
|
69
122
|
};
|
|
70
123
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEvE,eAAO,MAAM,qBAAqB,EAAE,wBAQnC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,149 @@ const ACK_REJECTED = 0x02;
|
|
|
12
12
|
const DEFAULT_CHUNK_BYTES = 64 * 1024;
|
|
13
13
|
const DEFAULT_MAX_HEADER_BYTES = 64 * 1024;
|
|
14
14
|
const DEFAULT_MAX_BUFFERED_FILE_BYTES = 256 * 1024 * 1024;
|
|
15
|
+
const DEFAULT_ACK_TIMEOUT_MS = 15000;
|
|
16
|
+
const ROUTED_FRAME_MAGIC = new Uint8Array([0x4f, 0x46, 0x54, 0x32]); // OFT2
|
|
17
|
+
const ROUTED_KIND_OFFER = 0x01;
|
|
18
|
+
const ROUTED_KIND_RESUME = 0x02;
|
|
19
|
+
const ROUTED_KIND_CHUNK = 0x03;
|
|
20
|
+
const ROUTED_KIND_ACK = 0x04;
|
|
21
|
+
const ROUTED_KIND_COMPLETE = 0x05;
|
|
22
|
+
const ROUTED_KIND_COMPLETED = 0x06;
|
|
23
|
+
const ROUTED_KIND_REJECT = 0x07;
|
|
24
|
+
const DEFAULT_ROUTED_CHUNK_BYTES = 48 * 1024;
|
|
25
|
+
const DEFAULT_ROUTED_WINDOW_CHUNKS = 8;
|
|
26
|
+
const MAX_ROUTED_TRANSFER_ID_BYTES = 512;
|
|
27
|
+
function routedTransferId(frame) {
|
|
28
|
+
return frame.kind === 'offer' ? frame.header.transferId : frame.transferId;
|
|
29
|
+
}
|
|
30
|
+
function writeU64(view, offset, value) {
|
|
31
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
32
|
+
throw new Error('routed transfer offset is invalid');
|
|
33
|
+
view.setBigUint64(offset, BigInt(value), false);
|
|
34
|
+
}
|
|
35
|
+
function readU64(view, offset) {
|
|
36
|
+
const value = view.getBigUint64(offset, false);
|
|
37
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER))
|
|
38
|
+
throw new Error('routed transfer offset exceeds JavaScript safe integer range');
|
|
39
|
+
return Number(value);
|
|
40
|
+
}
|
|
41
|
+
export function encodeRoutedTransferFrame(frame, maxHeaderBytes = DEFAULT_MAX_HEADER_BYTES, maxChunkBytes = DEFAULT_ROUTED_CHUNK_BYTES) {
|
|
42
|
+
const transferId = frame.kind === 'offer' ? frame.header.transferId : frame.transferId;
|
|
43
|
+
const id = new TextEncoder().encode(transferId);
|
|
44
|
+
if (!id.byteLength || id.byteLength > MAX_ROUTED_TRANSFER_ID_BYTES) {
|
|
45
|
+
throw new Error('routed transferId length is invalid');
|
|
46
|
+
}
|
|
47
|
+
let kind;
|
|
48
|
+
let body;
|
|
49
|
+
switch (frame.kind) {
|
|
50
|
+
case 'offer': {
|
|
51
|
+
kind = ROUTED_KIND_OFFER;
|
|
52
|
+
const header = new TextEncoder().encode(JSON.stringify(frame.header));
|
|
53
|
+
if (!header.byteLength || header.byteLength > maxHeaderBytes)
|
|
54
|
+
throw new Error('routed offer header is too large');
|
|
55
|
+
body = new Uint8Array(4 + header.byteLength);
|
|
56
|
+
new DataView(body.buffer).setUint32(0, header.byteLength, false);
|
|
57
|
+
body.set(header, 4);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'resume':
|
|
61
|
+
case 'ack':
|
|
62
|
+
case 'complete':
|
|
63
|
+
case 'completed': {
|
|
64
|
+
kind = frame.kind === 'resume' ? ROUTED_KIND_RESUME
|
|
65
|
+
: frame.kind === 'ack' ? ROUTED_KIND_ACK
|
|
66
|
+
: frame.kind === 'complete' ? ROUTED_KIND_COMPLETE
|
|
67
|
+
: ROUTED_KIND_COMPLETED;
|
|
68
|
+
body = new Uint8Array(8);
|
|
69
|
+
writeU64(new DataView(body.buffer), 0, frame.kind === 'resume' || frame.kind === 'ack' ? frame.offset : frame.size);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case 'chunk': {
|
|
73
|
+
kind = ROUTED_KIND_CHUNK;
|
|
74
|
+
if (!frame.bytes.byteLength || frame.bytes.byteLength > maxChunkBytes) {
|
|
75
|
+
throw new Error(`routed transfer chunk must contain 1..${maxChunkBytes} bytes`);
|
|
76
|
+
}
|
|
77
|
+
body = new Uint8Array(9 + frame.bytes.byteLength);
|
|
78
|
+
writeU64(new DataView(body.buffer), 0, frame.offset);
|
|
79
|
+
body[8] = frame.ackRequested ? 1 : 0;
|
|
80
|
+
body.set(frame.bytes, 9);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case 'reject': {
|
|
84
|
+
kind = ROUTED_KIND_REJECT;
|
|
85
|
+
const reason = new TextEncoder().encode(frame.reason);
|
|
86
|
+
if (reason.byteLength > Math.min(maxHeaderBytes, 0xffff))
|
|
87
|
+
throw new Error('routed rejection reason is too large');
|
|
88
|
+
body = new Uint8Array(2 + reason.byteLength);
|
|
89
|
+
new DataView(body.buffer).setUint16(0, reason.byteLength, false);
|
|
90
|
+
body.set(reason, 2);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const output = new Uint8Array(7 + id.byteLength + body.byteLength);
|
|
95
|
+
output.set(ROUTED_FRAME_MAGIC, 0);
|
|
96
|
+
output[4] = kind;
|
|
97
|
+
new DataView(output.buffer).setUint16(5, id.byteLength, false);
|
|
98
|
+
output.set(id, 7);
|
|
99
|
+
output.set(body, 7 + id.byteLength);
|
|
100
|
+
return output;
|
|
101
|
+
}
|
|
102
|
+
export function decodeRoutedTransferFrame(input, maxFileBytes = DEFAULT_MAX_BUFFERED_FILE_BYTES, maxHeaderBytes = DEFAULT_MAX_HEADER_BYTES, maxChunkBytes = DEFAULT_ROUTED_CHUNK_BYTES) {
|
|
103
|
+
if (input.byteLength < 7 || ROUTED_FRAME_MAGIC.some((byte, index) => input[index] !== byte))
|
|
104
|
+
return null;
|
|
105
|
+
const view = new DataView(input.buffer, input.byteOffset, input.byteLength);
|
|
106
|
+
const kind = input[4];
|
|
107
|
+
const idLength = view.getUint16(5, false);
|
|
108
|
+
if (!idLength || idLength > MAX_ROUTED_TRANSFER_ID_BYTES || input.byteLength < 7 + idLength) {
|
|
109
|
+
throw new Error('invalid routed transferId');
|
|
110
|
+
}
|
|
111
|
+
const transferId = new TextDecoder().decode(input.slice(7, 7 + idLength));
|
|
112
|
+
const body = input.slice(7 + idLength);
|
|
113
|
+
const bodyView = new DataView(body.buffer, body.byteOffset, body.byteLength);
|
|
114
|
+
if (kind === ROUTED_KIND_OFFER) {
|
|
115
|
+
if (body.byteLength < 4)
|
|
116
|
+
throw new Error('truncated routed offer');
|
|
117
|
+
const length = bodyView.getUint32(0, false);
|
|
118
|
+
if (!length || length > maxHeaderBytes || body.byteLength !== 4 + length) {
|
|
119
|
+
throw new Error('invalid routed offer header length');
|
|
120
|
+
}
|
|
121
|
+
const header = parseHeader(body.slice(4), maxFileBytes);
|
|
122
|
+
if (header.transferId !== transferId)
|
|
123
|
+
throw new Error('routed offer transferId mismatch');
|
|
124
|
+
return { kind: 'offer', header };
|
|
125
|
+
}
|
|
126
|
+
if ([ROUTED_KIND_RESUME, ROUTED_KIND_ACK, ROUTED_KIND_COMPLETE, ROUTED_KIND_COMPLETED].includes(kind)) {
|
|
127
|
+
if (body.byteLength !== 8)
|
|
128
|
+
throw new Error('invalid routed offset frame');
|
|
129
|
+
const value = readU64(bodyView, 0);
|
|
130
|
+
if (value > maxFileBytes)
|
|
131
|
+
throw new Error('routed transfer offset exceeds configured limit');
|
|
132
|
+
if (kind === ROUTED_KIND_RESUME)
|
|
133
|
+
return { kind: 'resume', transferId, offset: value };
|
|
134
|
+
if (kind === ROUTED_KIND_ACK)
|
|
135
|
+
return { kind: 'ack', transferId, offset: value };
|
|
136
|
+
if (kind === ROUTED_KIND_COMPLETE)
|
|
137
|
+
return { kind: 'complete', transferId, size: value };
|
|
138
|
+
return { kind: 'completed', transferId, size: value };
|
|
139
|
+
}
|
|
140
|
+
if (kind === ROUTED_KIND_CHUNK) {
|
|
141
|
+
if (body.byteLength <= 9
|
|
142
|
+
|| body.byteLength - 9 > maxChunkBytes
|
|
143
|
+
|| (body[8] !== 0 && body[8] !== 1))
|
|
144
|
+
throw new Error('invalid routed chunk');
|
|
145
|
+
return { kind: 'chunk', transferId, offset: readU64(bodyView, 0), ackRequested: body[8] === 1, bytes: body.slice(9) };
|
|
146
|
+
}
|
|
147
|
+
if (kind === ROUTED_KIND_REJECT) {
|
|
148
|
+
if (body.byteLength < 2)
|
|
149
|
+
throw new Error('truncated routed rejection');
|
|
150
|
+
const length = bodyView.getUint16(0, false);
|
|
151
|
+
if (length > maxHeaderBytes || body.byteLength !== 2 + length) {
|
|
152
|
+
throw new Error('invalid routed rejection length');
|
|
153
|
+
}
|
|
154
|
+
return { kind: 'reject', transferId, reason: new TextDecoder().decode(body.slice(2)) };
|
|
155
|
+
}
|
|
156
|
+
throw new Error('unknown routed file-transfer frame');
|
|
157
|
+
}
|
|
15
158
|
class ByteReader {
|
|
16
159
|
constructor(stream) {
|
|
17
160
|
this.buffer = new Uint8Array(0);
|
|
@@ -60,6 +203,24 @@ function throwIfAborted(signal) {
|
|
|
60
203
|
if (signal?.aborted)
|
|
61
204
|
throw signal.reason ?? new DOMException('Transfer aborted', 'AbortError');
|
|
62
205
|
}
|
|
206
|
+
async function waitWithDeadline(operation, timeoutMs, signal) {
|
|
207
|
+
throwIfAborted(signal);
|
|
208
|
+
return new Promise((resolve, reject) => {
|
|
209
|
+
let settled = false;
|
|
210
|
+
const settle = (callback) => {
|
|
211
|
+
if (settled)
|
|
212
|
+
return;
|
|
213
|
+
settled = true;
|
|
214
|
+
clearTimeout(timer);
|
|
215
|
+
signal?.removeEventListener('abort', onAbort);
|
|
216
|
+
callback();
|
|
217
|
+
};
|
|
218
|
+
const onAbort = () => settle(() => reject(signal?.reason ?? new DOMException('Transfer aborted', 'AbortError')));
|
|
219
|
+
const timer = setTimeout(() => settle(() => reject(new Error(`file transfer acknowledgement timed out after ${timeoutMs}ms`))), timeoutMs);
|
|
220
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
221
|
+
operation.then((value) => settle(() => resolve(value)), (error) => settle(() => reject(error)));
|
|
222
|
+
});
|
|
223
|
+
}
|
|
63
224
|
function transferId() {
|
|
64
225
|
return globalThis.crypto?.randomUUID?.() ?? `transfer-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
65
226
|
}
|
|
@@ -120,12 +281,21 @@ function bufferedSink(header, remoteNodeId) {
|
|
|
120
281
|
};
|
|
121
282
|
}
|
|
122
283
|
export function createFileTransferProtocol(client, options = {}) {
|
|
284
|
+
const adaptiveClient = client;
|
|
285
|
+
if (options.routing !== 'stream'
|
|
286
|
+
&& typeof adaptiveClient.onMessage === 'function'
|
|
287
|
+
&& (typeof adaptiveClient.getConnections === 'function' || !!adaptiveClient.diagnostics)) {
|
|
288
|
+
return createRoutedFileTransferProtocol(client, options);
|
|
289
|
+
}
|
|
123
290
|
const channel = options.channel ?? FILE_TRANSFER_CHANNEL;
|
|
124
291
|
const chunkBytes = options.chunkBytes ?? DEFAULT_CHUNK_BYTES;
|
|
125
292
|
const maxHeaderBytes = options.maxHeaderBytes ?? DEFAULT_MAX_HEADER_BYTES;
|
|
126
293
|
const maxFileBytes = options.maxFileBytes ?? DEFAULT_MAX_BUFFERED_FILE_BYTES;
|
|
294
|
+
const ackTimeoutMs = options.ackTimeoutMs ?? DEFAULT_ACK_TIMEOUT_MS;
|
|
127
295
|
if (!Number.isSafeInteger(chunkBytes) || chunkBytes <= 0)
|
|
128
296
|
throw new Error('chunkBytes must be positive');
|
|
297
|
+
if (!Number.isSafeInteger(ackTimeoutMs) || ackTimeoutMs <= 0)
|
|
298
|
+
throw new Error('ackTimeoutMs must be positive');
|
|
129
299
|
client.channels.register(channel);
|
|
130
300
|
return {
|
|
131
301
|
async send(deviceId, file, sendOptions = {}) {
|
|
@@ -166,7 +336,15 @@ export function createFileTransferProtocol(client, options = {}) {
|
|
|
166
336
|
await writer.abort(error).catch(() => undefined);
|
|
167
337
|
throw error;
|
|
168
338
|
}
|
|
169
|
-
const
|
|
339
|
+
const ackReader = new ByteReader(stream.readable);
|
|
340
|
+
let ack;
|
|
341
|
+
try {
|
|
342
|
+
ack = await waitWithDeadline(ackReader.exact(1, sendOptions.signal), ackTimeoutMs, sendOptions.signal);
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
await ackReader.cancel(error);
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
170
348
|
if (ack[0] !== ACK_OK)
|
|
171
349
|
throw new Error(ack[0] === ACK_REJECTED ? 'file transfer rejected' : 'invalid file transfer acknowledgement');
|
|
172
350
|
return id;
|
|
@@ -237,4 +415,311 @@ export function createFileTransferProtocol(client, options = {}) {
|
|
|
237
415
|
},
|
|
238
416
|
};
|
|
239
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Route-adaptive file transfer. Each bounded chunk is sent through
|
|
420
|
+
* `Connection.send`, so OpenRTC re-ranks the currently proven routes for every
|
|
421
|
+
* chunk. Receiver-confirmed offsets survive optional-route promotion/failure;
|
|
422
|
+
* the consumer remains responsible for persisting the surrounding intent.
|
|
423
|
+
*/
|
|
424
|
+
export function createRoutedFileTransferProtocol(client, options = {}) {
|
|
425
|
+
const chunkBytes = options.chunkBytes ?? DEFAULT_ROUTED_CHUNK_BYTES;
|
|
426
|
+
const maxHeaderBytes = options.maxHeaderBytes ?? DEFAULT_MAX_HEADER_BYTES;
|
|
427
|
+
const maxFileBytes = options.maxFileBytes ?? DEFAULT_MAX_BUFFERED_FILE_BYTES;
|
|
428
|
+
const ackTimeoutMs = options.ackTimeoutMs ?? DEFAULT_ACK_TIMEOUT_MS;
|
|
429
|
+
const windowChunks = options.windowChunks ?? DEFAULT_ROUTED_WINDOW_CHUNKS;
|
|
430
|
+
const maxRecoveryAttempts = options.maxRecoveryAttempts ?? 3;
|
|
431
|
+
if (!Number.isSafeInteger(chunkBytes) || chunkBytes <= 0 || chunkBytes > DEFAULT_ROUTED_CHUNK_BYTES) {
|
|
432
|
+
throw new Error(`routed chunkBytes must be within 1..${DEFAULT_ROUTED_CHUNK_BYTES}`);
|
|
433
|
+
}
|
|
434
|
+
if (!Number.isSafeInteger(windowChunks) || windowChunks <= 0)
|
|
435
|
+
throw new Error('windowChunks must be positive');
|
|
436
|
+
if (!Number.isSafeInteger(maxRecoveryAttempts) || maxRecoveryAttempts < 0)
|
|
437
|
+
throw new Error('maxRecoveryAttempts must be non-negative');
|
|
438
|
+
const incoming = new Map();
|
|
439
|
+
const completed = new Map();
|
|
440
|
+
const controlListeners = new Map();
|
|
441
|
+
let receiveOptions = null;
|
|
442
|
+
let disposed = false;
|
|
443
|
+
const connectionMatches = (connection, id) => [connection.id, connection.remoteNodeId, connection.deviceId]
|
|
444
|
+
.some((candidate) => typeof candidate === 'string' && candidate === id);
|
|
445
|
+
const runtimeClient = client;
|
|
446
|
+
const resolveConnection = async (id) => {
|
|
447
|
+
const settled = await (runtimeClient.peers?.waitConnected(id, ackTimeoutMs)
|
|
448
|
+
?? runtimeClient.waitForConnectedPeer?.(id, ackTimeoutMs)
|
|
449
|
+
?? Promise.resolve(null)).catch(() => null);
|
|
450
|
+
const settledIds = settled && typeof settled === 'object'
|
|
451
|
+
? [
|
|
452
|
+
settled.activeConnectionId,
|
|
453
|
+
...(settled.candidateConnectionIds ?? []),
|
|
454
|
+
settled.peerId,
|
|
455
|
+
settled.deviceId,
|
|
456
|
+
settled.deviceIdHint,
|
|
457
|
+
settled.nodeId,
|
|
458
|
+
].filter((candidate) => typeof candidate === 'string' && !!candidate)
|
|
459
|
+
: [];
|
|
460
|
+
const lookupIds = new Set([id, ...settledIds]);
|
|
461
|
+
const connections = runtimeClient.diagnostics?.applicationReadyConnections?.()
|
|
462
|
+
?? runtimeClient.getApplicationReadyConnections?.()
|
|
463
|
+
?? runtimeClient.diagnostics?.connections()
|
|
464
|
+
?? runtimeClient.getConnections?.()
|
|
465
|
+
?? [];
|
|
466
|
+
const connection = connections.find((candidate) => !candidate.isClosed && [...lookupIds].some((lookupId) => connectionMatches(candidate, lookupId)));
|
|
467
|
+
if (!connection)
|
|
468
|
+
throw new Error(`no application-ready OpenRTC route for ${id}`);
|
|
469
|
+
return connection;
|
|
470
|
+
};
|
|
471
|
+
const sendFrame = async (target, frame) => {
|
|
472
|
+
const connection = typeof target === 'string' ? await resolveConnection(target) : target;
|
|
473
|
+
await connection.send(encodeRoutedTransferFrame(frame, maxHeaderBytes, chunkBytes));
|
|
474
|
+
};
|
|
475
|
+
const waitForControl = async (transferId, predicate, send, signal) => {
|
|
476
|
+
let resolveFrame;
|
|
477
|
+
const operation = new Promise((resolve) => { resolveFrame = resolve; });
|
|
478
|
+
const listener = (frame) => {
|
|
479
|
+
if (predicate(frame))
|
|
480
|
+
resolveFrame(frame);
|
|
481
|
+
};
|
|
482
|
+
const listeners = controlListeners.get(transferId) ?? new Set();
|
|
483
|
+
listeners.add(listener);
|
|
484
|
+
controlListeners.set(transferId, listeners);
|
|
485
|
+
try {
|
|
486
|
+
await send();
|
|
487
|
+
return await waitWithDeadline(operation, ackTimeoutMs, signal);
|
|
488
|
+
}
|
|
489
|
+
finally {
|
|
490
|
+
listeners.delete(listener);
|
|
491
|
+
if (!listeners.size)
|
|
492
|
+
controlListeners.delete(transferId);
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
const respond = async (connection, frame) => {
|
|
496
|
+
try {
|
|
497
|
+
await sendFrame(connection, frame);
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
receiveOptions?.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
501
|
+
}
|
|
502
|
+
};
|
|
503
|
+
const processIncoming = async (connection, remoteNodeId, frame) => {
|
|
504
|
+
const configured = receiveOptions;
|
|
505
|
+
if (!configured)
|
|
506
|
+
return;
|
|
507
|
+
if (frame.kind === 'offer') {
|
|
508
|
+
const alreadyCompleted = completed.get(frame.header.transferId);
|
|
509
|
+
if (alreadyCompleted === frame.header.size) {
|
|
510
|
+
await respond(connection, { kind: 'completed', transferId: frame.header.transferId, size: alreadyCompleted });
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const existing = incoming.get(frame.header.transferId);
|
|
514
|
+
if (existing) {
|
|
515
|
+
await respond(connection, { kind: 'resume', transferId: frame.header.transferId, offset: existing.received });
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
try {
|
|
519
|
+
const sink = options.createReceiveSink
|
|
520
|
+
? await options.createReceiveSink(frame.header, remoteNodeId)
|
|
521
|
+
: bufferedSink(frame.header, remoteNodeId);
|
|
522
|
+
const received = sink.resumeOffset ?? 0;
|
|
523
|
+
if (!Number.isSafeInteger(received) || received < 0 || received > frame.header.size) {
|
|
524
|
+
throw new Error('receive sink returned an invalid resumeOffset');
|
|
525
|
+
}
|
|
526
|
+
incoming.set(frame.header.transferId, {
|
|
527
|
+
header: frame.header,
|
|
528
|
+
remoteNodeId,
|
|
529
|
+
connection,
|
|
530
|
+
sink,
|
|
531
|
+
received,
|
|
532
|
+
chain: Promise.resolve(),
|
|
533
|
+
});
|
|
534
|
+
configured.onProgress?.({ transferId: frame.header.transferId, transferredBytes: received, totalBytes: frame.header.size, direction: 'receive' });
|
|
535
|
+
await respond(connection, { kind: 'resume', transferId: frame.header.transferId, offset: received });
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
configured.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
539
|
+
await respond(connection, { kind: 'reject', transferId: frame.header.transferId, reason: String(error) });
|
|
540
|
+
}
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
const state = incoming.get(frame.transferId);
|
|
544
|
+
if (!state) {
|
|
545
|
+
if (frame.kind === 'complete' && completed.get(frame.transferId) === frame.size) {
|
|
546
|
+
await respond(connection, { kind: 'completed', transferId: frame.transferId, size: frame.size });
|
|
547
|
+
}
|
|
548
|
+
else if (frame.kind === 'chunk' || frame.kind === 'complete') {
|
|
549
|
+
await respond(connection, { kind: 'reject', transferId: frame.transferId, reason: 'transfer offer is required' });
|
|
550
|
+
}
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
state.connection = connection;
|
|
554
|
+
if (frame.kind === 'chunk') {
|
|
555
|
+
if (frame.offset < state.received && frame.offset + frame.bytes.byteLength <= state.received) {
|
|
556
|
+
if (frame.ackRequested)
|
|
557
|
+
await respond(connection, { kind: 'ack', transferId: frame.transferId, offset: state.received });
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (frame.offset !== state.received || state.received + frame.bytes.byteLength > state.header.size) {
|
|
561
|
+
await respond(connection, { kind: 'ack', transferId: frame.transferId, offset: state.received });
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
await state.sink.write(frame.bytes);
|
|
565
|
+
state.received += frame.bytes.byteLength;
|
|
566
|
+
configured.onProgress?.({ transferId: frame.transferId, transferredBytes: state.received, totalBytes: state.header.size, direction: 'receive' });
|
|
567
|
+
if (frame.ackRequested)
|
|
568
|
+
await respond(connection, { kind: 'ack', transferId: frame.transferId, offset: state.received });
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
if (frame.kind === 'complete') {
|
|
572
|
+
if (frame.size !== state.header.size || state.received !== state.header.size) {
|
|
573
|
+
await respond(connection, { kind: 'ack', transferId: frame.transferId, offset: state.received });
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
const result = await state.sink.close();
|
|
577
|
+
if (state.header.sha256) {
|
|
578
|
+
const verified = state.sink.verifySha256
|
|
579
|
+
? await state.sink.verifySha256(state.header.sha256)
|
|
580
|
+
: result && typeof result === 'object' && 'blob' in result
|
|
581
|
+
? await sha256(result.blob) === state.header.sha256.toLowerCase()
|
|
582
|
+
: false;
|
|
583
|
+
if (!verified)
|
|
584
|
+
throw new Error('file transfer integrity check failed');
|
|
585
|
+
}
|
|
586
|
+
incoming.delete(frame.transferId);
|
|
587
|
+
completed.set(frame.transferId, frame.size);
|
|
588
|
+
if (completed.size > 1024)
|
|
589
|
+
completed.delete(completed.keys().next().value);
|
|
590
|
+
await configured.onFile({ header: state.header, remoteNodeId: state.remoteNodeId, result });
|
|
591
|
+
await respond(connection, { kind: 'completed', transferId: frame.transferId, size: frame.size });
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
const messageSource = client;
|
|
595
|
+
const offMessage = messageSource.onMessage((connection, message) => {
|
|
596
|
+
const bytes = message instanceof Uint8Array
|
|
597
|
+
? message
|
|
598
|
+
: message instanceof ArrayBuffer
|
|
599
|
+
? new Uint8Array(message)
|
|
600
|
+
: null;
|
|
601
|
+
if (!bytes)
|
|
602
|
+
return;
|
|
603
|
+
let frame;
|
|
604
|
+
try {
|
|
605
|
+
frame = decodeRoutedTransferFrame(bytes, maxFileBytes, maxHeaderBytes, chunkBytes);
|
|
606
|
+
}
|
|
607
|
+
catch (error) {
|
|
608
|
+
receiveOptions?.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
if (!frame)
|
|
612
|
+
return;
|
|
613
|
+
const frameId = routedTransferId(frame);
|
|
614
|
+
const listeners = controlListeners.get(frameId);
|
|
615
|
+
if (listeners && ['resume', 'ack', 'completed', 'reject'].includes(frame.kind)) {
|
|
616
|
+
for (const listener of [...listeners])
|
|
617
|
+
listener(frame);
|
|
618
|
+
}
|
|
619
|
+
if (['resume', 'ack', 'completed', 'reject'].includes(frame.kind))
|
|
620
|
+
return;
|
|
621
|
+
const routeConnection = connection;
|
|
622
|
+
const remoteNodeId = routeConnection.deviceId ?? routeConnection.remoteNodeId ?? routeConnection.id ?? 'unknown';
|
|
623
|
+
const current = incoming.get(frameId);
|
|
624
|
+
const chain = (current?.chain ?? Promise.resolve())
|
|
625
|
+
.then(() => processIncoming(routeConnection, remoteNodeId, frame))
|
|
626
|
+
.catch(async (error) => {
|
|
627
|
+
const state = incoming.get(routedTransferId(frame));
|
|
628
|
+
incoming.delete(routedTransferId(frame));
|
|
629
|
+
await state?.sink.abort(error).catch(() => undefined);
|
|
630
|
+
receiveOptions?.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
631
|
+
await respond(routeConnection, { kind: 'reject', transferId: routedTransferId(frame), reason: String(error) });
|
|
632
|
+
});
|
|
633
|
+
if (current)
|
|
634
|
+
current.chain = chain;
|
|
635
|
+
void chain;
|
|
636
|
+
});
|
|
637
|
+
return {
|
|
638
|
+
async send(deviceId, file, sendOptions = {}) {
|
|
639
|
+
if (disposed)
|
|
640
|
+
throw new Error('routed file-transfer protocol is disposed');
|
|
641
|
+
if (file.size > maxFileBytes)
|
|
642
|
+
throw new Error(`file exceeds ${maxFileBytes} byte transfer limit`);
|
|
643
|
+
throwIfAborted(sendOptions.signal);
|
|
644
|
+
const id = sendOptions.transferId ?? transferId();
|
|
645
|
+
const header = {
|
|
646
|
+
version: 1,
|
|
647
|
+
transferId: id,
|
|
648
|
+
name: file.name,
|
|
649
|
+
size: file.size,
|
|
650
|
+
mimeType: file.type || 'application/octet-stream',
|
|
651
|
+
metadata: sendOptions.metadata,
|
|
652
|
+
sha256: sendOptions.integrity === 'sha256' ? await sha256(file) : undefined,
|
|
653
|
+
};
|
|
654
|
+
let recoveryAttempts = 0;
|
|
655
|
+
const offer = async () => {
|
|
656
|
+
const response = await waitForControl(id, (frame) => frame.kind === 'resume' || frame.kind === 'completed' || frame.kind === 'reject', () => sendFrame(deviceId, { kind: 'offer', header }), sendOptions.signal);
|
|
657
|
+
if (response.kind === 'reject')
|
|
658
|
+
throw new Error(`file transfer rejected: ${response.reason}`);
|
|
659
|
+
if (response.kind === 'completed')
|
|
660
|
+
return response.size;
|
|
661
|
+
if (response.kind !== 'resume' || response.offset > file.size)
|
|
662
|
+
throw new Error('invalid file transfer resume response');
|
|
663
|
+
return response.offset;
|
|
664
|
+
};
|
|
665
|
+
let confirmed = await offer();
|
|
666
|
+
sendOptions.onProgress?.({ transferId: id, transferredBytes: confirmed, totalBytes: file.size, direction: 'send' });
|
|
667
|
+
while (confirmed < file.size) {
|
|
668
|
+
throwIfAborted(sendOptions.signal);
|
|
669
|
+
const windowStart = confirmed;
|
|
670
|
+
let cursor = confirmed;
|
|
671
|
+
const frames = [];
|
|
672
|
+
for (let index = 0; index < windowChunks && cursor < file.size; index += 1) {
|
|
673
|
+
const bytes = new Uint8Array(await file.slice(cursor, cursor + chunkBytes).arrayBuffer());
|
|
674
|
+
const end = cursor + bytes.byteLength;
|
|
675
|
+
frames.push({ kind: 'chunk', transferId: id, offset: cursor, ackRequested: end === file.size || index === windowChunks - 1, bytes });
|
|
676
|
+
cursor = end;
|
|
677
|
+
}
|
|
678
|
+
try {
|
|
679
|
+
const response = await waitForControl(id, (frame) => (frame.kind === 'ack' && frame.offset >= windowStart) || frame.kind === 'reject', async () => {
|
|
680
|
+
for (const frame of frames)
|
|
681
|
+
await sendFrame(deviceId, frame);
|
|
682
|
+
}, sendOptions.signal);
|
|
683
|
+
if (response.kind === 'reject')
|
|
684
|
+
throw new Error(`file transfer rejected: ${response.reason}`);
|
|
685
|
+
if (response.kind !== 'ack' || response.offset < windowStart || response.offset > cursor) {
|
|
686
|
+
throw new Error('invalid file transfer offset acknowledgement');
|
|
687
|
+
}
|
|
688
|
+
confirmed = response.offset;
|
|
689
|
+
recoveryAttempts = 0;
|
|
690
|
+
sendOptions.onProgress?.({ transferId: id, transferredBytes: confirmed, totalBytes: file.size, direction: 'send' });
|
|
691
|
+
}
|
|
692
|
+
catch (error) {
|
|
693
|
+
if (recoveryAttempts >= maxRecoveryAttempts)
|
|
694
|
+
throw error;
|
|
695
|
+
recoveryAttempts += 1;
|
|
696
|
+
confirmed = await offer();
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
const completion = await waitForControl(id, (frame) => frame.kind === 'completed' || frame.kind === 'ack' || frame.kind === 'reject', () => sendFrame(deviceId, { kind: 'complete', transferId: id, size: file.size }), sendOptions.signal);
|
|
700
|
+
if (completion.kind === 'reject')
|
|
701
|
+
throw new Error(`file transfer rejected: ${completion.reason}`);
|
|
702
|
+
if (completion.kind !== 'completed' || completion.size !== file.size) {
|
|
703
|
+
throw new Error('receiver did not confirm completed file transfer');
|
|
704
|
+
}
|
|
705
|
+
return id;
|
|
706
|
+
},
|
|
707
|
+
onIncoming(configured) {
|
|
708
|
+
receiveOptions = configured;
|
|
709
|
+
return () => {
|
|
710
|
+
if (receiveOptions === configured)
|
|
711
|
+
receiveOptions = null;
|
|
712
|
+
};
|
|
713
|
+
},
|
|
714
|
+
dispose() {
|
|
715
|
+
disposed = true;
|
|
716
|
+
offMessage();
|
|
717
|
+
receiveOptions = null;
|
|
718
|
+
controlListeners.clear();
|
|
719
|
+
for (const state of incoming.values())
|
|
720
|
+
void state.sink.abort(new Error('file-transfer protocol disposed'));
|
|
721
|
+
incoming.clear();
|
|
722
|
+
},
|
|
723
|
+
};
|
|
724
|
+
}
|
|
240
725
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|