@contextvm/sdk 0.7.8 → 0.8.0-next.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.
- package/dist/esm/core/constants.d.ts +4 -0
- package/dist/esm/core/constants.d.ts.map +1 -1
- package/dist/esm/core/constants.js +4 -0
- package/dist/esm/core/constants.js.map +1 -1
- package/dist/esm/core/utils/utils.d.ts +3 -0
- package/dist/esm/core/utils/utils.d.ts.map +1 -1
- package/dist/esm/core/utils/utils.js +7 -0
- package/dist/esm/core/utils/utils.js.map +1 -1
- package/dist/esm/transport/nostr-client-transport.d.ts +26 -0
- package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client-transport.js +103 -10
- package/dist/esm/transport/nostr-client-transport.js.map +1 -1
- package/dist/esm/transport/nostr-server/session-store.d.ts +2 -0
- package/dist/esm/transport/nostr-server/session-store.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server/session-store.js +1 -0
- package/dist/esm/transport/nostr-server/session-store.js.map +1 -1
- package/dist/esm/transport/nostr-server-transport.d.ts +22 -0
- package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server-transport.js +144 -24
- package/dist/esm/transport/nostr-server-transport.js.map +1 -1
- package/dist/esm/transport/oversized-transfer/constants.d.ts +11 -0
- package/dist/esm/transport/oversized-transfer/constants.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/constants.js +21 -0
- package/dist/esm/transport/oversized-transfer/constants.js.map +1 -0
- package/dist/esm/transport/oversized-transfer/errors.d.ts +27 -0
- package/dist/esm/transport/oversized-transfer/errors.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/errors.js +45 -0
- package/dist/esm/transport/oversized-transfer/errors.js.map +1 -0
- package/dist/esm/transport/oversized-transfer/index.d.ts +10 -0
- package/dist/esm/transport/oversized-transfer/index.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/index.js +7 -0
- package/dist/esm/transport/oversized-transfer/index.js.map +1 -0
- package/dist/esm/transport/oversized-transfer/receiver.d.ts +57 -0
- package/dist/esm/transport/oversized-transfer/receiver.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/receiver.js +367 -0
- package/dist/esm/transport/oversized-transfer/receiver.js.map +1 -0
- package/dist/esm/transport/oversized-transfer/sender-session.d.ts +16 -0
- package/dist/esm/transport/oversized-transfer/sender-session.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/sender-session.js +22 -0
- package/dist/esm/transport/oversized-transfer/sender-session.js.map +1 -0
- package/dist/esm/transport/oversized-transfer/sender.d.ts +15 -0
- package/dist/esm/transport/oversized-transfer/sender.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/sender.js +81 -0
- package/dist/esm/transport/oversized-transfer/sender.js.map +1 -0
- package/dist/esm/transport/oversized-transfer/types.d.ts +39 -0
- package/dist/esm/transport/oversized-transfer/types.d.ts.map +1 -0
- package/dist/esm/transport/oversized-transfer/types.js +2 -0
- package/dist/esm/transport/oversized-transfer/types.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
2
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
3
|
+
import { DEFAULT_MAX_ACCEPTABLE_BYTES, DEFAULT_MAX_CONCURRENT_TRANSFERS, DEFAULT_MAX_OUT_OF_ORDER_CHUNKS, DEFAULT_MAX_OUT_OF_ORDER_WINDOW, DEFAULT_MAX_TRANSFER_CHUNKS, DEFAULT_TRANSFER_TIMEOUT_MS, DIGEST_PREFIX, } from './constants.js';
|
|
4
|
+
import { JSONRPCMessageSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { OversizedTransferAbortError, OversizedTransferDigestError, OversizedTransferError, OversizedTransferPolicyError, OversizedTransferReassemblyError, OversizedTransferSequenceError, } from './errors.js';
|
|
6
|
+
// Narrows an unknown value to `OversizedTransferFrame` via structural check.
|
|
7
|
+
function isOversizedTransferFrame(value) {
|
|
8
|
+
return (typeof value === 'object' &&
|
|
9
|
+
value !== null &&
|
|
10
|
+
value.type === 'oversized-transfer' &&
|
|
11
|
+
typeof value.frameType === 'string');
|
|
12
|
+
}
|
|
13
|
+
//Stateful reassembly engine for CEP-22 oversized transfers.
|
|
14
|
+
export class OversizedTransferReceiver {
|
|
15
|
+
//sets all the settings and policy constraints
|
|
16
|
+
constructor(policy, logger) {
|
|
17
|
+
var _a, _b, _c, _d, _e, _f;
|
|
18
|
+
this.transfers = new Map();
|
|
19
|
+
this.acceptWaiters = new Map();
|
|
20
|
+
this.maxTransferBytes =
|
|
21
|
+
(_a = policy.maxTransferBytes) !== null && _a !== void 0 ? _a : DEFAULT_MAX_ACCEPTABLE_BYTES;
|
|
22
|
+
this.maxTransferChunks =
|
|
23
|
+
(_b = policy.maxTransferChunks) !== null && _b !== void 0 ? _b : DEFAULT_MAX_TRANSFER_CHUNKS;
|
|
24
|
+
this.maxConcurrentTransfers =
|
|
25
|
+
(_c = policy.maxConcurrentTransfers) !== null && _c !== void 0 ? _c : DEFAULT_MAX_CONCURRENT_TRANSFERS;
|
|
26
|
+
this.maxOutOfOrderWindow =
|
|
27
|
+
(_d = policy.maxOutOfOrderWindow) !== null && _d !== void 0 ? _d : DEFAULT_MAX_OUT_OF_ORDER_WINDOW;
|
|
28
|
+
this.maxOutOfOrderChunks =
|
|
29
|
+
(_e = policy.maxOutOfOrderChunks) !== null && _e !== void 0 ? _e : DEFAULT_MAX_OUT_OF_ORDER_CHUNKS;
|
|
30
|
+
this.transferTimeoutMs =
|
|
31
|
+
(_f = policy.transferTimeoutMs) !== null && _f !== void 0 ? _f : DEFAULT_TRANSFER_TIMEOUT_MS;
|
|
32
|
+
this.logger = logger;
|
|
33
|
+
}
|
|
34
|
+
//Returns true if the notification contains an oversized-transfer frame
|
|
35
|
+
//in its `params.cvm` field.
|
|
36
|
+
static isOversizedFrame(notification) {
|
|
37
|
+
var _a;
|
|
38
|
+
return isOversizedTransferFrame((_a = notification.params) === null || _a === void 0 ? void 0 : _a.cvm);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Process one inbound `notifications/progress` frame.
|
|
42
|
+
*
|
|
43
|
+
* @returns The reassembled `JSONRPCMessage` when the transfer is complete,
|
|
44
|
+
* or `null` when more frames are needed.
|
|
45
|
+
* @throws `OversizedTransferAbortError` on `abort` frame.
|
|
46
|
+
* @throws `OversizedTransferPolicyError` when limits are exceeded.
|
|
47
|
+
* @throws `OversizedTransferDigestError` on integrity failure.
|
|
48
|
+
* @throws `OversizedTransferReassemblyError` on structural failure.
|
|
49
|
+
*/
|
|
50
|
+
//Process one inbound `notifications/progress` frame.
|
|
51
|
+
async processFrame(notification) {
|
|
52
|
+
var _a, _b, _c, _d, _e;
|
|
53
|
+
const cvm = (_a = notification.params) === null || _a === void 0 ? void 0 : _a.cvm;
|
|
54
|
+
if (!isOversizedTransferFrame(cvm))
|
|
55
|
+
return null;
|
|
56
|
+
const token = String((_c = (_b = notification.params) === null || _b === void 0 ? void 0 : _b.progressToken) !== null && _c !== void 0 ? _c : '');
|
|
57
|
+
// The outer `progress` value is the canonical ordering key for chunks.
|
|
58
|
+
const progress = Number((_e = (_d = notification.params) === null || _d === void 0 ? void 0 : _d.progress) !== null && _e !== void 0 ? _e : 0);
|
|
59
|
+
this.assertValidToken(token);
|
|
60
|
+
this.assertValidProgress(progress, token);
|
|
61
|
+
switch (cvm.frameType) {
|
|
62
|
+
case 'start':
|
|
63
|
+
return this.handleStart(token, progress, cvm);
|
|
64
|
+
case 'accept':
|
|
65
|
+
return this.handleAccept(token, progress);
|
|
66
|
+
case 'chunk':
|
|
67
|
+
return this.handleChunk(token, progress, cvm);
|
|
68
|
+
case 'end':
|
|
69
|
+
return this.handleEnd(token, progress);
|
|
70
|
+
case 'abort':
|
|
71
|
+
return this.handleAbort(token, cvm);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//Returns a Promise that resolves when the remote peer sends an `accept` frame
|
|
75
|
+
//or rejects on timeout.
|
|
76
|
+
waitForAccept(token, timeoutMs = this.transferTimeoutMs) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
this.rejectAcceptWaiter(token, new OversizedTransferError(`Superseded wait for accept (token: ${token})`));
|
|
79
|
+
const timer = setTimeout(() => {
|
|
80
|
+
this.acceptWaiters.delete(token);
|
|
81
|
+
reject(new OversizedTransferError(`Timeout waiting for accept (token: ${token})`));
|
|
82
|
+
}, timeoutMs);
|
|
83
|
+
this.acceptWaiters.set(token, { resolve, reject, timer });
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//Returns the number of currently active in-flight transfers.
|
|
87
|
+
get activeTransferCount() {
|
|
88
|
+
return this.transfers.size;
|
|
89
|
+
}
|
|
90
|
+
/** Releases all in-flight transfers and their watchdog timers. */
|
|
91
|
+
clear() {
|
|
92
|
+
for (const t of this.transfers.values()) {
|
|
93
|
+
clearTimeout(t.abortTimer);
|
|
94
|
+
}
|
|
95
|
+
for (const waiter of this.acceptWaiters.values()) {
|
|
96
|
+
clearTimeout(waiter.timer);
|
|
97
|
+
waiter.reject(new OversizedTransferError('Receiver cleared'));
|
|
98
|
+
}
|
|
99
|
+
this.transfers.clear();
|
|
100
|
+
this.acceptWaiters.clear();
|
|
101
|
+
}
|
|
102
|
+
//Handles the start frame
|
|
103
|
+
handleStart(token, progress, frame) {
|
|
104
|
+
if (this.transfers.has(token)) {
|
|
105
|
+
throw new OversizedTransferSequenceError(`Duplicate start frame for active transfer (token: ${token})`);
|
|
106
|
+
}
|
|
107
|
+
if (frame.totalBytes > this.maxTransferBytes) {
|
|
108
|
+
throw new OversizedTransferPolicyError(`totalBytes ${frame.totalBytes} exceeds policy limit ${this.maxTransferBytes} (token: ${token})`);
|
|
109
|
+
}
|
|
110
|
+
if (frame.totalChunks > this.maxTransferChunks) {
|
|
111
|
+
throw new OversizedTransferPolicyError(`totalChunks ${frame.totalChunks} exceeds policy limit ${this.maxTransferChunks} (token: ${token})`);
|
|
112
|
+
}
|
|
113
|
+
if (this.transfers.size >= this.maxConcurrentTransfers) {
|
|
114
|
+
throw new OversizedTransferPolicyError(`Active transfers exceed policy limit ${this.maxConcurrentTransfers} (token: ${token})`);
|
|
115
|
+
}
|
|
116
|
+
if (!frame.digest.startsWith(DIGEST_PREFIX)) {
|
|
117
|
+
throw new OversizedTransferReassemblyError(`Invalid digest format in start frame (token: ${token})`);
|
|
118
|
+
}
|
|
119
|
+
const abortTimer = setTimeout(() => {
|
|
120
|
+
this.logger.warn('Transfer timed out; cleaning up', { token });
|
|
121
|
+
this.rejectAcceptWaiter(token, new OversizedTransferError(`Transfer timed out (token: ${token})`));
|
|
122
|
+
this.cleanup(token);
|
|
123
|
+
}, this.transferTimeoutMs);
|
|
124
|
+
this.transfers.set(token, {
|
|
125
|
+
progressToken: token,
|
|
126
|
+
digest: frame.digest,
|
|
127
|
+
totalBytes: frame.totalBytes,
|
|
128
|
+
totalChunks: frame.totalChunks,
|
|
129
|
+
startProgress: progress,
|
|
130
|
+
acceptProgress: null,
|
|
131
|
+
firstChunkProgress: null,
|
|
132
|
+
nextExpectedChunkProgress: null,
|
|
133
|
+
highestObservedProgress: progress,
|
|
134
|
+
chunks: new Map(),
|
|
135
|
+
abortTimer,
|
|
136
|
+
});
|
|
137
|
+
this.logger.debug('Oversized transfer started', {
|
|
138
|
+
token,
|
|
139
|
+
totalBytes: frame.totalBytes,
|
|
140
|
+
totalChunks: frame.totalChunks,
|
|
141
|
+
});
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
handleAccept(token, progress) {
|
|
145
|
+
const transfer = this.transfers.get(token);
|
|
146
|
+
if (!transfer) {
|
|
147
|
+
// Late or duplicated accept frames are ignored after transfer cleanup.
|
|
148
|
+
if (!this.resolveAcceptWaiter(token)) {
|
|
149
|
+
this.logger.warn('Accept frame with no active transfer', { token });
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if (progress <= transfer.startProgress) {
|
|
154
|
+
this.failTransfer(token, new OversizedTransferSequenceError(`Accept frame progress must be greater than start progress (token: ${token})`));
|
|
155
|
+
}
|
|
156
|
+
transfer.highestObservedProgress = Math.max(transfer.highestObservedProgress, progress);
|
|
157
|
+
transfer.acceptProgress = progress;
|
|
158
|
+
this.resolveAcceptWaiter(token);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
handleChunk(token, progress, frame) {
|
|
162
|
+
const transfer = this.transfers.get(token);
|
|
163
|
+
if (!transfer) {
|
|
164
|
+
// Late or duplicated chunk frames are ignored after transfer cleanup.
|
|
165
|
+
this.logger.warn('Chunk frame with no active transfer', {
|
|
166
|
+
token,
|
|
167
|
+
progress,
|
|
168
|
+
});
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const minimumChunkProgress = transfer.startProgress + 1;
|
|
172
|
+
const maximumChunkProgress = transfer.startProgress + transfer.totalChunks + 1;
|
|
173
|
+
if (progress < minimumChunkProgress) {
|
|
174
|
+
this.failTransfer(token, new OversizedTransferSequenceError(`Chunk progress must be greater than start progress (token: ${token})`));
|
|
175
|
+
}
|
|
176
|
+
const nextExpectedChunkProgress = this.getNextExpectedChunkProgress(transfer);
|
|
177
|
+
const forwardGap = progress - nextExpectedChunkProgress;
|
|
178
|
+
if (forwardGap > this.maxOutOfOrderWindow) {
|
|
179
|
+
this.failTransfer(token, new OversizedTransferPolicyError(`Out-of-order gap ${forwardGap} exceeds policy limit ${this.maxOutOfOrderWindow} (token: ${token})`));
|
|
180
|
+
}
|
|
181
|
+
if (progress > maximumChunkProgress) {
|
|
182
|
+
this.failTransfer(token, new OversizedTransferSequenceError(`Chunk progress exceeds declared transfer bounds (token: ${token})`));
|
|
183
|
+
}
|
|
184
|
+
if (progress > transfer.startProgress + 2 &&
|
|
185
|
+
!transfer.chunks.has(transfer.startProgress + 1) &&
|
|
186
|
+
!transfer.chunks.has(transfer.startProgress + 2)) {
|
|
187
|
+
this.failTransfer(token, new OversizedTransferSequenceError(`First chunk skips beyond the reserved accept slot (token: ${token})`));
|
|
188
|
+
}
|
|
189
|
+
const existingChunk = transfer.chunks.get(progress);
|
|
190
|
+
if (existingChunk !== undefined) {
|
|
191
|
+
if (existingChunk !== frame.data) {
|
|
192
|
+
this.failTransfer(token, new OversizedTransferSequenceError(`Conflicting duplicate chunk detected (token: ${token}, progress: ${progress})`));
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
transfer.chunks.set(progress, frame.data);
|
|
197
|
+
transfer.highestObservedProgress = Math.max(transfer.highestObservedProgress, progress);
|
|
198
|
+
this.refreshChunkProgressState(transfer);
|
|
199
|
+
if (forwardGap > 0) {
|
|
200
|
+
if (this.getBufferedOutOfOrderChunkCount(transfer) >
|
|
201
|
+
this.maxOutOfOrderChunks) {
|
|
202
|
+
this.failTransfer(token, new OversizedTransferPolicyError(`Buffered out-of-order chunks exceed policy limit ${this.maxOutOfOrderChunks} (token: ${token})`));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
this.logger.debug('Chunk received', {
|
|
206
|
+
token,
|
|
207
|
+
progress,
|
|
208
|
+
received: transfer.chunks.size,
|
|
209
|
+
total: transfer.totalChunks,
|
|
210
|
+
});
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
async handleEnd(token, progress) {
|
|
214
|
+
const transfer = this.transfers.get(token);
|
|
215
|
+
if (!transfer) {
|
|
216
|
+
// Late or duplicated end frames are ignored after transfer cleanup.
|
|
217
|
+
this.logger.warn('End frame with no active transfer', { token });
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
if (progress <= transfer.highestObservedProgress) {
|
|
221
|
+
this.failTransfer(token, new OversizedTransferSequenceError(`End frame progress must be greater than all prior transfer frames (token: ${token})`));
|
|
222
|
+
}
|
|
223
|
+
if (transfer.totalChunks > 0 && transfer.chunks.size === 0) {
|
|
224
|
+
this.failTransfer(token, new OversizedTransferReassemblyError(`Transfer ended before any chunks were received (token: ${token})`));
|
|
225
|
+
}
|
|
226
|
+
if (transfer.chunks.size !== transfer.totalChunks) {
|
|
227
|
+
this.failTransfer(token, new OversizedTransferReassemblyError(`Expected ${transfer.totalChunks} chunks but received ${transfer.chunks.size} (token: ${token})`));
|
|
228
|
+
}
|
|
229
|
+
const assembled = this.assembleTransferPayload(transfer, token);
|
|
230
|
+
// 1. Byte-length validation.
|
|
231
|
+
const encodedBytes = new TextEncoder().encode(assembled);
|
|
232
|
+
if (encodedBytes.byteLength !== transfer.totalBytes) {
|
|
233
|
+
this.cleanup(token);
|
|
234
|
+
throw new OversizedTransferDigestError(`Byte length mismatch: expected ${transfer.totalBytes}, got ${encodedBytes.byteLength} (token: ${token})`);
|
|
235
|
+
}
|
|
236
|
+
// 2. SHA-256 digest validation.
|
|
237
|
+
const actualDigest = DIGEST_PREFIX + bytesToHex(sha256(encodedBytes));
|
|
238
|
+
if (actualDigest !== transfer.digest) {
|
|
239
|
+
this.cleanup(token);
|
|
240
|
+
throw new OversizedTransferDigestError(`SHA-256 digest mismatch (token: ${token})`);
|
|
241
|
+
}
|
|
242
|
+
// 3. Parse and validate as a JSON-RPC message.
|
|
243
|
+
let validated;
|
|
244
|
+
try {
|
|
245
|
+
const parsed = JSON.parse(assembled);
|
|
246
|
+
validated = JSONRPCMessageSchema.parse(parsed);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
this.cleanup(token);
|
|
250
|
+
throw new OversizedTransferReassemblyError(`Reassembled payload is not a valid JSON-RPC message (token: ${token}): ${err instanceof Error ? err.message : String(err)}`);
|
|
251
|
+
}
|
|
252
|
+
this.cleanup(token);
|
|
253
|
+
this.logger.debug('Oversized transfer complete', { token });
|
|
254
|
+
return validated;
|
|
255
|
+
}
|
|
256
|
+
handleAbort(token, frame) {
|
|
257
|
+
const error = new OversizedTransferAbortError(token, frame.reason);
|
|
258
|
+
this.rejectAcceptWaiter(token, error);
|
|
259
|
+
this.cleanup(token);
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
assertValidToken(token) {
|
|
263
|
+
if (token.length === 0) {
|
|
264
|
+
throw new OversizedTransferSequenceError('Oversized transfer frame is missing progressToken');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
assertValidProgress(progress, token) {
|
|
268
|
+
if (!Number.isInteger(progress) || progress <= 0) {
|
|
269
|
+
throw new OversizedTransferSequenceError(`Invalid progress value ${String(progress)} (token: ${token})`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
refreshChunkProgressState(transfer) {
|
|
273
|
+
if (transfer.chunks.size === 0) {
|
|
274
|
+
transfer.firstChunkProgress = null;
|
|
275
|
+
transfer.nextExpectedChunkProgress = null;
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const firstChunkProgress = transfer.acceptProgress !== null
|
|
279
|
+
? transfer.startProgress + 2
|
|
280
|
+
: transfer.startProgress + 1;
|
|
281
|
+
let nextExpectedChunkProgress = firstChunkProgress;
|
|
282
|
+
while (transfer.chunks.has(nextExpectedChunkProgress)) {
|
|
283
|
+
nextExpectedChunkProgress++;
|
|
284
|
+
}
|
|
285
|
+
transfer.firstChunkProgress = firstChunkProgress;
|
|
286
|
+
transfer.nextExpectedChunkProgress = nextExpectedChunkProgress;
|
|
287
|
+
}
|
|
288
|
+
getBufferedOutOfOrderChunkCount(transfer) {
|
|
289
|
+
if (transfer.firstChunkProgress === null ||
|
|
290
|
+
transfer.nextExpectedChunkProgress === null) {
|
|
291
|
+
return 0;
|
|
292
|
+
}
|
|
293
|
+
const contiguousChunkCount = transfer.nextExpectedChunkProgress - transfer.firstChunkProgress;
|
|
294
|
+
return transfer.chunks.size - contiguousChunkCount;
|
|
295
|
+
}
|
|
296
|
+
getNextExpectedChunkProgress(transfer) {
|
|
297
|
+
if (transfer.nextExpectedChunkProgress !== null) {
|
|
298
|
+
return transfer.nextExpectedChunkProgress;
|
|
299
|
+
}
|
|
300
|
+
return transfer.acceptProgress !== null
|
|
301
|
+
? transfer.startProgress + 2
|
|
302
|
+
: transfer.startProgress + 1;
|
|
303
|
+
}
|
|
304
|
+
assembleTransferPayload(transfer, token) {
|
|
305
|
+
const firstChunkProgress = this.getAssemblyFirstChunkProgress(transfer, token);
|
|
306
|
+
const chunks = [];
|
|
307
|
+
for (let progress = firstChunkProgress; progress < firstChunkProgress + transfer.totalChunks; progress++) {
|
|
308
|
+
const chunk = transfer.chunks.get(progress);
|
|
309
|
+
if (chunk === undefined) {
|
|
310
|
+
throw new OversizedTransferReassemblyError(`Missing chunk during assembly (token: ${token}, progress: ${progress})`);
|
|
311
|
+
}
|
|
312
|
+
chunks.push(chunk);
|
|
313
|
+
}
|
|
314
|
+
return chunks.join('');
|
|
315
|
+
}
|
|
316
|
+
getAssemblyFirstChunkProgress(transfer, token) {
|
|
317
|
+
const directStartProgress = transfer.startProgress + 1;
|
|
318
|
+
const acceptGatedStartProgress = transfer.startProgress + 2;
|
|
319
|
+
if (this.hasCompleteChunkRange(transfer, directStartProgress)) {
|
|
320
|
+
return directStartProgress;
|
|
321
|
+
}
|
|
322
|
+
if (this.hasCompleteChunkRange(transfer, acceptGatedStartProgress)) {
|
|
323
|
+
return acceptGatedStartProgress;
|
|
324
|
+
}
|
|
325
|
+
throw new OversizedTransferReassemblyError(`Transfer ended with unresolved chunk gaps (token: ${token})`);
|
|
326
|
+
}
|
|
327
|
+
hasCompleteChunkRange(transfer, firstChunkProgress) {
|
|
328
|
+
for (let progress = firstChunkProgress; progress < firstChunkProgress + transfer.totalChunks; progress++) {
|
|
329
|
+
if (!transfer.chunks.has(progress)) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
failTransfer(token, error) {
|
|
336
|
+
this.rejectAcceptWaiter(token, error);
|
|
337
|
+
this.cleanup(token);
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
resolveAcceptWaiter(token) {
|
|
341
|
+
const waiter = this.acceptWaiters.get(token);
|
|
342
|
+
if (!waiter) {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
clearTimeout(waiter.timer);
|
|
346
|
+
this.acceptWaiters.delete(token);
|
|
347
|
+
waiter.resolve();
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
rejectAcceptWaiter(token, error) {
|
|
351
|
+
const waiter = this.acceptWaiters.get(token);
|
|
352
|
+
if (!waiter) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
clearTimeout(waiter.timer);
|
|
356
|
+
this.acceptWaiters.delete(token);
|
|
357
|
+
waiter.reject(error);
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
cleanup(token) {
|
|
361
|
+
const t = this.transfers.get(token);
|
|
362
|
+
if (t)
|
|
363
|
+
clearTimeout(t.abortTimer);
|
|
364
|
+
this.transfers.delete(token);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=receiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receiver.js","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/receiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type SenderOptions } from './sender.js';
|
|
2
|
+
import type { OversizedTransferProgress } from './types.js';
|
|
3
|
+
export interface OversizedFramePublishContext {
|
|
4
|
+
isStartFrame: boolean;
|
|
5
|
+
}
|
|
6
|
+
export type OversizedFramePublisher = (frame: OversizedTransferProgress, ctx: OversizedFramePublishContext) => Promise<string | undefined>;
|
|
7
|
+
export type OversizedAcceptWaiter = (progressToken: string) => Promise<void>;
|
|
8
|
+
export interface OversizedSendOptions extends SenderOptions {
|
|
9
|
+
publishFrame: OversizedFramePublisher;
|
|
10
|
+
waitForAccept?: OversizedAcceptWaiter;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Builds and publishes a full CEP-22 oversized transfer sequence.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sendOversizedTransfer(serialized: string, options: OversizedSendOptions): Promise<string | undefined>;
|
|
16
|
+
//# sourceMappingURL=sender-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-session.d.ts","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/sender-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,yBAAyB,EAChC,GAAG,EAAE,4BAA4B,KAC9B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjC,MAAM,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7E,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,YAAY,EAAE,uBAAuB,CAAC;IACtC,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACvC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { buildOversizedTransferFrames } from './sender.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds and publishes a full CEP-22 oversized transfer sequence.
|
|
4
|
+
*/
|
|
5
|
+
export async function sendOversizedTransfer(serialized, options) {
|
|
6
|
+
var _a;
|
|
7
|
+
const { startFrame, chunkFrames, endFrame } = await buildOversizedTransferFrames(serialized, options);
|
|
8
|
+
await options.publishFrame(startFrame, {
|
|
9
|
+
isStartFrame: true,
|
|
10
|
+
});
|
|
11
|
+
if (options.needsAcceptHandshake) {
|
|
12
|
+
await ((_a = options.waitForAccept) === null || _a === void 0 ? void 0 : _a.call(options, options.progressToken));
|
|
13
|
+
}
|
|
14
|
+
for (const chunk of chunkFrames) {
|
|
15
|
+
await options.publishFrame(chunk, { isStartFrame: false });
|
|
16
|
+
}
|
|
17
|
+
const endEventId = await options.publishFrame(endFrame, {
|
|
18
|
+
isStartFrame: false,
|
|
19
|
+
});
|
|
20
|
+
return typeof endEventId === 'string' ? endEventId : undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=sender-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-session.js","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/sender-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAsB,MAAM,aAAa,CAAC;AAmB/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,OAA6B;;IAE7B,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,GACzC,MAAM,4BAA4B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE1D,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE;QACrC,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,MAAM,CAAA,MAAA,OAAO,CAAC,aAAa,wDAAG,OAAO,CAAC,aAAa,CAAC,CAAA,CAAC;IACvD,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE;QACtD,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IACH,OAAO,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OversizedTransferProgress } from './types.js';
|
|
2
|
+
export interface SenderOptions {
|
|
3
|
+
progressToken: string;
|
|
4
|
+
chunkSizeBytes?: number;
|
|
5
|
+
needsAcceptHandshake?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SenderResult {
|
|
8
|
+
startFrame: OversizedTransferProgress;
|
|
9
|
+
chunkFrames: OversizedTransferProgress[];
|
|
10
|
+
endFrame: OversizedTransferProgress;
|
|
11
|
+
}
|
|
12
|
+
export declare function utf8ByteLength(value: string): number;
|
|
13
|
+
export declare function sha256Digest(value: string): string;
|
|
14
|
+
export declare function buildOversizedTransferFrames(serialized: string, options: SenderOptions): Promise<SenderResult>;
|
|
15
|
+
//# sourceMappingURL=sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/sender.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,yBAAyB,CAAC;IACtC,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACzC,QAAQ,EAAE,yBAAyB,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAwCD,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAiDvB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
2
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
3
|
+
import { DEFAULT_CHUNK_SIZE, DIGEST_PREFIX } from './constants.js';
|
|
4
|
+
export function utf8ByteLength(value) {
|
|
5
|
+
return new TextEncoder().encode(value).byteLength;
|
|
6
|
+
}
|
|
7
|
+
export function sha256Digest(value) {
|
|
8
|
+
return DIGEST_PREFIX + bytesToHex(sha256(new TextEncoder().encode(value)));
|
|
9
|
+
}
|
|
10
|
+
// Splits a string into multiple chunks based on byte size.
|
|
11
|
+
function splitStringByByteSize(str, maxBytes) {
|
|
12
|
+
if (!Number.isInteger(maxBytes) || maxBytes <= 0) {
|
|
13
|
+
throw new Error(`Invalid chunkSizeBytes: ${String(maxBytes)}`);
|
|
14
|
+
}
|
|
15
|
+
const chunks = [];
|
|
16
|
+
let currentChunk = '';
|
|
17
|
+
let currentChunkBytes = 0;
|
|
18
|
+
for (const char of str) {
|
|
19
|
+
const charBytes = utf8ByteLength(char);
|
|
20
|
+
if (charBytes > maxBytes) {
|
|
21
|
+
throw new Error(`Unable to split message: single character exceeds chunk size (${charBytes} > ${maxBytes})`);
|
|
22
|
+
}
|
|
23
|
+
if (currentChunkBytes > 0 && currentChunkBytes + charBytes > maxBytes) {
|
|
24
|
+
chunks.push(currentChunk);
|
|
25
|
+
currentChunk = char;
|
|
26
|
+
currentChunkBytes = charBytes;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
currentChunk += char;
|
|
30
|
+
currentChunkBytes += charBytes;
|
|
31
|
+
}
|
|
32
|
+
if (currentChunk.length > 0) {
|
|
33
|
+
chunks.push(currentChunk);
|
|
34
|
+
}
|
|
35
|
+
return chunks;
|
|
36
|
+
}
|
|
37
|
+
// Splits serialized into an ordered sequence of oversized-transfer frames ready to be sent as notifications/progress messages.
|
|
38
|
+
export async function buildOversizedTransferFrames(serialized, options) {
|
|
39
|
+
var _a;
|
|
40
|
+
const totalBytes = utf8ByteLength(serialized);
|
|
41
|
+
const digest = sha256Digest(serialized);
|
|
42
|
+
const chunkSize = (_a = options.chunkSizeBytes) !== null && _a !== void 0 ? _a : DEFAULT_CHUNK_SIZE;
|
|
43
|
+
const textChunks = splitStringByByteSize(serialized, chunkSize);
|
|
44
|
+
const totalChunks = textChunks.length;
|
|
45
|
+
// When accept handshake is needed, progress=2 is reserved for the server's
|
|
46
|
+
// accept frame, so chunks begin at 3.
|
|
47
|
+
const chunkBaseProgress = options.needsAcceptHandshake ? 3 : 2;
|
|
48
|
+
const startFrame = {
|
|
49
|
+
progressToken: options.progressToken,
|
|
50
|
+
progress: 1,
|
|
51
|
+
message: 'starting oversized transfer',
|
|
52
|
+
cvm: {
|
|
53
|
+
type: 'oversized-transfer',
|
|
54
|
+
frameType: 'start',
|
|
55
|
+
completionMode: 'render',
|
|
56
|
+
digest,
|
|
57
|
+
totalBytes,
|
|
58
|
+
totalChunks,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const chunkFrames = textChunks.map((data, i) => ({
|
|
62
|
+
progressToken: options.progressToken,
|
|
63
|
+
progress: chunkBaseProgress + i,
|
|
64
|
+
cvm: {
|
|
65
|
+
type: 'oversized-transfer',
|
|
66
|
+
frameType: 'chunk',
|
|
67
|
+
data,
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
const endFrame = {
|
|
71
|
+
progressToken: options.progressToken,
|
|
72
|
+
progress: chunkBaseProgress + totalChunks,
|
|
73
|
+
message: 'oversized transfer complete',
|
|
74
|
+
cvm: {
|
|
75
|
+
type: 'oversized-transfer',
|
|
76
|
+
frameType: 'end',
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
return { startFrame, chunkFrames, endFrame };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.js","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/sender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type OversizedTransferCommon = {
|
|
2
|
+
type: 'oversized-transfer';
|
|
3
|
+
frameType: 'start' | 'end' | 'chunk' | 'accept' | 'abort';
|
|
4
|
+
};
|
|
5
|
+
export type StartFrame = OversizedTransferCommon & {
|
|
6
|
+
frameType: 'start';
|
|
7
|
+
completionMode: 'render';
|
|
8
|
+
digest: string;
|
|
9
|
+
totalBytes: number;
|
|
10
|
+
totalChunks: number;
|
|
11
|
+
};
|
|
12
|
+
export type AcceptFrame = OversizedTransferCommon & {
|
|
13
|
+
frameType: 'accept';
|
|
14
|
+
};
|
|
15
|
+
/** `data` is one ordered fragment of the serialized JSON-RPC string. */
|
|
16
|
+
export type ChunkFrame = OversizedTransferCommon & {
|
|
17
|
+
frameType: 'chunk';
|
|
18
|
+
data: string;
|
|
19
|
+
};
|
|
20
|
+
export type EndFrame = OversizedTransferCommon & {
|
|
21
|
+
frameType: 'end';
|
|
22
|
+
};
|
|
23
|
+
export type AbortFrame = OversizedTransferCommon & {
|
|
24
|
+
frameType: 'abort';
|
|
25
|
+
reason?: string;
|
|
26
|
+
};
|
|
27
|
+
export type OversizedTransferFrame = StartFrame | AcceptFrame | ChunkFrame | EndFrame | AbortFrame;
|
|
28
|
+
/**
|
|
29
|
+
* Shape of a `notifications/progress` params object that carries
|
|
30
|
+
* a CEP-22 oversized-transfer frame inside the `cvm` extension field.
|
|
31
|
+
*/
|
|
32
|
+
export type OversizedTransferProgress = {
|
|
33
|
+
progressToken: string | number;
|
|
34
|
+
progress: number;
|
|
35
|
+
message?: string;
|
|
36
|
+
total?: number;
|
|
37
|
+
cvm: OversizedTransferFrame;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,uBAAuB,GAAG;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,QAAQ,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,uBAAuB,GAAG;IAClD,SAAS,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,uBAAuB,GAAG;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,uBAAuB,GAAG;IAC/C,SAAS,EAAE,KAAK,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,uBAAuB,GAAG;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,UAAU,GACV,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,CAAC;AAEf;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,sBAAsB,CAAC;CAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/transport/oversized-transfer/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contextvm/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0-next.0",
|
|
4
4
|
"description": "CtxVM SDK for JavaScript/TypeScript",
|
|
5
5
|
"license": "LGPL-3.0-1",
|
|
6
6
|
"author": "ContextVM",
|
|
@@ -102,6 +102,7 @@
|
|
|
102
102
|
},
|
|
103
103
|
"dependencies": {
|
|
104
104
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
105
|
+
"@noble/hashes": "^2.0.1",
|
|
105
106
|
"applesauce-relay": "^5.1.0",
|
|
106
107
|
"nostr-tools": "~2.18.2",
|
|
107
108
|
"pino": "^10.3.1",
|