@api.global/typedsocket 6.3.0 → 7.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 (35) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.typedsocket.d.ts +24 -52
  3. package/dist_ts/classes.typedsocket.js +277 -358
  4. package/dist_ts/classes.typedsockettagpolicymanager.d.ts +1 -0
  5. package/dist_ts/classes.typedsockettagpolicymanager.js +26 -2
  6. package/dist_ts/classes.virtualstreammanager.d.ts +274 -0
  7. package/dist_ts/classes.virtualstreammanager.js +2115 -0
  8. package/dist_ts/constants.virtualstream.d.ts +58 -0
  9. package/dist_ts/constants.virtualstream.js +58 -0
  10. package/dist_ts/helpers.virtualstreamcodec.d.ts +14 -0
  11. package/dist_ts/helpers.virtualstreamcodec.js +349 -0
  12. package/dist_ts/index.d.ts +5 -9
  13. package/dist_ts/index.js +3 -6
  14. package/dist_ts/interfaces.diagnostics.d.ts +6 -18
  15. package/dist_ts/interfaces.virtualstream.d.ts +131 -0
  16. package/dist_ts/interfaces.virtualstream.js +2 -0
  17. package/package.json +5 -5
  18. package/readme.hints.md +11 -59
  19. package/readme.md +306 -840
  20. package/dist_ts/classes.nativebyteerror.d.ts +0 -26
  21. package/dist_ts/classes.nativebyteerror.js +0 -51
  22. package/dist_ts/classes.nativebytemanager.d.ts +0 -505
  23. package/dist_ts/classes.nativebytemanager.js +0 -3691
  24. package/dist_ts/constants.nativebytes.d.ts +0 -59
  25. package/dist_ts/constants.nativebytes.js +0 -58
  26. package/dist_ts/constants.nativemessages.d.ts +0 -45
  27. package/dist_ts/constants.nativemessages.js +0 -44
  28. package/dist_ts/helpers.nativebytecodec.d.ts +0 -8
  29. package/dist_ts/helpers.nativebytecodec.js +0 -328
  30. package/dist_ts/helpers.nativemessagecodec.d.ts +0 -6
  31. package/dist_ts/helpers.nativemessagecodec.js +0 -267
  32. package/dist_ts/interfaces.nativebytes.d.ts +0 -187
  33. package/dist_ts/interfaces.nativebytes.js +0 -2
  34. package/dist_ts/interfaces.nativemessages.d.ts +0 -144
  35. package/dist_ts/interfaces.nativemessages.js +0 -2
@@ -0,0 +1,2115 @@
1
+ import * as plugins from './plugins.js';
2
+ import { TYPEDSOCKET_HANDSHAKE_TIMEOUT_MS, TYPEDSOCKET_PACKAGE_MAJOR, TYPEDSOCKET_VERSION_METHOD, VIRTUAL_STREAM_CAPABILITY_TIMEOUT_MS, VIRTUAL_STREAM_FRAME_TYPES, VIRTUAL_STREAM_MAX_ARRIVAL_STAMP_BYTES_PER_CONNECTION, VIRTUAL_STREAM_MAX_ARRIVAL_STAMPS_PER_CONNECTION, VIRTUAL_STREAM_MAX_CONNECTIONS_PER_SERVER, VIRTUAL_STREAM_MAX_CORRELATION_ID_BYTES, VIRTUAL_STREAM_MAX_FRAGMENT_PAYLOAD_BYTES, VIRTUAL_STREAM_MAX_LOGICAL_CHUNK_BYTES, VIRTUAL_STREAM_MAX_OUTBOUND_FRAMES_PER_CONNECTION, VIRTUAL_STREAM_MAX_QUEUED_BYTES_PER_CONNECTION, VIRTUAL_STREAM_MAX_QUEUED_BYTES_PER_STREAM, VIRTUAL_STREAM_MAX_QUEUED_CHUNKS_PER_CONNECTION, VIRTUAL_STREAM_MAX_QUEUED_CHUNKS_PER_STREAM, VIRTUAL_STREAM_MAX_RAW_QUEUE_BYTES, VIRTUAL_STREAM_MAX_RAW_QUEUE_FRAMES, VIRTUAL_STREAM_MAX_REVALIDATIONS_PER_CONNECTION, VIRTUAL_STREAM_MAX_REVALIDATIONS_PER_SERVER, VIRTUAL_STREAM_MAX_RETAINED_BYTES_PER_SERVER, VIRTUAL_STREAM_MAX_STREAMS_PER_CONNECTION, VIRTUAL_STREAM_MAX_STREAMS_PER_SERVER, VIRTUAL_STREAM_MAX_TOMBSTONES_PER_CONNECTION, VIRTUAL_STREAM_PROGRESS_TIMEOUT_MS, VIRTUAL_STREAM_PROTOCOL, VIRTUAL_STREAM_REVALIDATION_TIMEOUT_MS, VIRTUAL_STREAM_RESET_CODES, VIRTUAL_STREAM_TOMBSTONE_RETENTION_MS, } from './constants.virtualstream.js';
3
+ import { copyVirtualStreamBytes, createVirtualStreamDescriptorDigest, decodeVirtualStreamFrame, encodeVirtualStreamFrame, getVirtualStreamFrameByteLength, normalizeVirtualStreamCapability, normalizeVirtualStreamContentType, normalizeVirtualStreamId, normalizeVirtualStreamIntegrity, VirtualStreamProtocolError, } from './helpers.virtualstreamcodec.js';
4
+ import { toClientWebSocketCloseCode } from './helpers.websocket.js';
5
+ const virtualStreamTextEncoder = new TextEncoder();
6
+ const nativePromiseThen = Promise.prototype.then;
7
+ const createAuthorizedServerRegistrationSymbol = Symbol('createAuthorizedServerVirtualStreamRegistration');
8
+ const setServerHandshakeReadyCallbackSymbol = Symbol('setServerHandshakeReadyCallback');
9
+ export class TypedSocketVirtualStreamError extends Error {
10
+ constructor(messageArg, optionsArg) {
11
+ super(messageArg, optionsArg);
12
+ this.name = 'TypedSocketVirtualStreamError';
13
+ }
14
+ }
15
+ function createDeferred() {
16
+ let resolvePromise;
17
+ let rejectPromise;
18
+ let settled = false;
19
+ const promise = new Promise((resolveArg, rejectArg) => {
20
+ resolvePromise = resolveArg;
21
+ rejectPromise = rejectArg;
22
+ });
23
+ void promise.catch(() => { });
24
+ return {
25
+ promise,
26
+ get settled() {
27
+ return settled;
28
+ },
29
+ resolve(valueArg) {
30
+ if (settled)
31
+ return;
32
+ settled = true;
33
+ resolvePromise(valueArg);
34
+ },
35
+ reject(reasonArg) {
36
+ if (settled)
37
+ return;
38
+ settled = true;
39
+ rejectPromise(reasonArg);
40
+ },
41
+ };
42
+ }
43
+ function createDefaultTimer(callbackArg, delayMsArg) {
44
+ const timer = setTimeout(callbackArg, delayMsArg);
45
+ timer.unref?.();
46
+ return Object.freeze({ cancel: () => clearTimeout(timer) });
47
+ }
48
+ function clearDefaultTimer(timerArg) {
49
+ if (!timerArg || typeof timerArg !== 'object')
50
+ return;
51
+ const cancel = Reflect.get(timerArg, 'cancel');
52
+ if (typeof cancel === 'function')
53
+ Reflect.apply(cancel, timerArg, []);
54
+ }
55
+ function defaultRuntime() {
56
+ return {
57
+ now: () => Date.now(),
58
+ randomBytes: (lengthArg) => {
59
+ const bytes = new Uint8Array(lengthArg);
60
+ crypto.getRandomValues(bytes);
61
+ return bytes;
62
+ },
63
+ setTimer: createDefaultTimer,
64
+ clearTimer: clearDefaultTimer,
65
+ scheduleMacrotask: (callbackArg) => createDefaultTimer(callbackArg, 0),
66
+ };
67
+ }
68
+ function bytesToHex(bytesArg) {
69
+ let result = '';
70
+ for (const byte of bytesArg)
71
+ result += byte.toString(16).padStart(2, '0');
72
+ return result;
73
+ }
74
+ function randomStreamId(runtimeArg) {
75
+ const hex = bytesToHex(runtimeArg.randomBytes(16));
76
+ if (hex.length !== 32) {
77
+ throw new VirtualStreamProtocolError('runtime must return exactly 16 random stream ID bytes');
78
+ }
79
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
80
+ }
81
+ function randomCapability(runtimeArg) {
82
+ const capability = bytesToHex(runtimeArg.randomBytes(32));
83
+ return normalizeVirtualStreamCapability(capability);
84
+ }
85
+ function asError(reasonArg, fallbackArg) {
86
+ return reasonArg instanceof Error
87
+ ? reasonArg
88
+ : new TypedSocketVirtualStreamError(reasonArg === undefined ? fallbackArg : String(reasonArg));
89
+ }
90
+ function asPeer(targetArg) {
91
+ return 'peer' in targetArg ? targetArg.peer : targetArg;
92
+ }
93
+ function isPlainRecord(valueArg) {
94
+ if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg))
95
+ return false;
96
+ const prototype = Object.getPrototypeOf(valueArg);
97
+ return prototype === Object.prototype || prototype === null;
98
+ }
99
+ function getOwnEnumerableData(valueArg, keyArg) {
100
+ const property = Object.getOwnPropertyDescriptor(valueArg, keyArg);
101
+ return property && property.enumerable && 'value' in property
102
+ ? property.value
103
+ : undefined;
104
+ }
105
+ function hasExactEnumerableDataKeys(valueArg, keysArg) {
106
+ const ownKeys = Reflect.ownKeys(valueArg);
107
+ return ownKeys.length === keysArg.length
108
+ && ownKeys.every((keyArg) => typeof keyArg === 'string' && keysArg.includes(keyArg));
109
+ }
110
+ function parseArrivalIdentity(valueArg) {
111
+ if (!isPlainRecord(valueArg))
112
+ return undefined;
113
+ const method = getOwnEnumerableData(valueArg, 'method');
114
+ const correlation = getOwnEnumerableData(valueArg, 'correlation');
115
+ if (typeof method !== 'string' || method.length === 0 || !isPlainRecord(correlation)) {
116
+ return undefined;
117
+ }
118
+ const correlationId = getOwnEnumerableData(correlation, 'id');
119
+ const phase = getOwnEnumerableData(correlation, 'phase');
120
+ if (typeof correlationId !== 'string'
121
+ || correlationId.length === 0
122
+ || virtualStreamTextEncoder.encode(correlationId).byteLength
123
+ > VIRTUAL_STREAM_MAX_CORRELATION_ID_BYTES
124
+ || (phase !== 'request' && phase !== 'response')) {
125
+ return undefined;
126
+ }
127
+ return { method, correlationId, phase };
128
+ }
129
+ function isExactPackageMajor(valueArg) {
130
+ return isPlainRecord(valueArg)
131
+ && hasExactEnumerableDataKeys(valueArg, ['packageMajor'])
132
+ && getOwnEnumerableData(valueArg, 'packageMajor') === TYPEDSOCKET_PACKAGE_MAJOR;
133
+ }
134
+ function isExactHandshakeRequest(valueArg) {
135
+ const identity = parseArrivalIdentity(valueArg);
136
+ if (!identity || !isPlainRecord(valueArg))
137
+ return false;
138
+ return identity.method === TYPEDSOCKET_VERSION_METHOD
139
+ && identity.phase === 'request'
140
+ && hasExactEnumerableDataKeys(valueArg, ['method', 'request', 'response', 'correlation'])
141
+ && isPlainRecord(getOwnEnumerableData(valueArg, 'correlation'))
142
+ && hasExactEnumerableDataKeys(getOwnEnumerableData(valueArg, 'correlation'), ['id', 'phase'])
143
+ && isExactPackageMajor(getOwnEnumerableData(valueArg, 'request'))
144
+ && getOwnEnumerableData(valueArg, 'response') === null;
145
+ }
146
+ function isExactHandshakeResponse(valueArg, correlationIdArg) {
147
+ const identity = parseArrivalIdentity(valueArg);
148
+ if (!identity || !isPlainRecord(valueArg))
149
+ return false;
150
+ const correlation = getOwnEnumerableData(valueArg, 'correlation');
151
+ return identity.method === TYPEDSOCKET_VERSION_METHOD
152
+ && identity.phase === 'response'
153
+ && identity.correlationId === correlationIdArg
154
+ && hasExactEnumerableDataKeys(valueArg, ['method', 'request', 'response', 'correlation'])
155
+ && isPlainRecord(correlation)
156
+ && hasExactEnumerableDataKeys(correlation, ['id', 'phase'])
157
+ && isExactPackageMajor(getOwnEnumerableData(valueArg, 'request'))
158
+ && isExactPackageMajor(getOwnEnumerableData(valueArg, 'response'));
159
+ }
160
+ function createReceipt(stateArg) {
161
+ return Object.freeze({
162
+ streamId: stateArg.descriptor.streamId,
163
+ chunkCount: stateArg.processedChunkCount,
164
+ byteLength: stateArg.processedByteLength,
165
+ accepted: true,
166
+ verifiedIntegrity: stateArg.descriptor.integrity ?? null,
167
+ });
168
+ }
169
+ class VirtualStreamEndpointBase {
170
+ constructor(manager, state) {
171
+ this.manager = manager;
172
+ this.state = state;
173
+ this.protocol = VIRTUAL_STREAM_PROTOCOL;
174
+ }
175
+ get streamId() {
176
+ return this.state.descriptor.streamId;
177
+ }
178
+ get contentType() {
179
+ return this.state.descriptor.contentType;
180
+ }
181
+ get integrity() {
182
+ return this.state.descriptor.integrity;
183
+ }
184
+ get opened() {
185
+ return this.manager.ensureOpened(this.state);
186
+ }
187
+ get completion() {
188
+ return this.state.completionDeferred.promise;
189
+ }
190
+ get closed() {
191
+ return this.state.closedDeferred.promise;
192
+ }
193
+ async abort(reasonArg) {
194
+ await this.manager.abortEndpoint(this.state, reasonArg);
195
+ }
196
+ }
197
+ export class VirtualStreamSender extends VirtualStreamEndpointBase {
198
+ constructor() {
199
+ super(...arguments);
200
+ this.direction = 'send';
201
+ }
202
+ get writable() {
203
+ void this.manager.ensureOpened(this.state).catch(() => { });
204
+ return this.writableInternal ??= new WritableStream({
205
+ write: async (chunkArg) => this.send(chunkArg),
206
+ close: async () => { await this.close(); },
207
+ abort: async (reasonArg) => this.abort(reasonArg),
208
+ });
209
+ }
210
+ async send(chunkArg) {
211
+ await this.manager.send(this.state, chunkArg);
212
+ }
213
+ async close() {
214
+ return await this.manager.closeSender(this.state);
215
+ }
216
+ }
217
+ export class VirtualStreamReceiver extends VirtualStreamEndpointBase {
218
+ constructor() {
219
+ super(...arguments);
220
+ this.direction = 'receive';
221
+ }
222
+ get readable() {
223
+ if (this.state.receiveMode === 'direct') {
224
+ throw new TypedSocketVirtualStreamError('VirtualStream direct receive and readable consumption are mutually exclusive');
225
+ }
226
+ this.state.receiveMode = 'readable';
227
+ void this.manager.ensureOpened(this.state).catch(() => { });
228
+ return this.readableInternal ??= new ReadableStream({
229
+ pull: async (controllerArg) => {
230
+ try {
231
+ const chunk = await this.manager.receive(this.state, 'readable');
232
+ if (chunk)
233
+ controllerArg.enqueue(chunk);
234
+ else
235
+ controllerArg.close();
236
+ }
237
+ catch (errorArg) {
238
+ controllerArg.error(errorArg);
239
+ }
240
+ },
241
+ cancel: async (reasonArg) => this.reject(reasonArg),
242
+ }, { highWaterMark: 0 });
243
+ }
244
+ async receive() {
245
+ return await this.manager.receive(this.state, 'direct');
246
+ }
247
+ async accept() {
248
+ return await this.manager.acceptReceiver(this.state);
249
+ }
250
+ async reject(reasonArg) {
251
+ await this.manager.rejectReceiver(this.state, reasonArg);
252
+ }
253
+ }
254
+ class VirtualStreamConnectionTransport {
255
+ constructor(manager, connection) {
256
+ this.manager = manager;
257
+ this.connection = connection;
258
+ }
259
+ async openVirtualStream(descriptorArg, optionsArg) {
260
+ return this.manager.stageDescriptor(this.connection, descriptorArg, optionsArg);
261
+ }
262
+ }
263
+ export class VirtualStreamManager {
264
+ constructor(optionsArg) {
265
+ this.serverConnections = new Map();
266
+ this.serverSettlementConnections = new Map();
267
+ this.observedInvalidReadyPromises = new WeakSet();
268
+ this.serverAttached = false;
269
+ this.retainedRevalidations = 0;
270
+ this.serverRetainedBytes = 0;
271
+ if (optionsArg.side !== 'client' && optionsArg.side !== 'server') {
272
+ throw new TypeError('VirtualStreamManager side must be client or server');
273
+ }
274
+ this.side = optionsArg.side;
275
+ this.runtime = optionsArg.runtime ?? defaultRuntime();
276
+ this.onDiagnostic = optionsArg.onDiagnostic;
277
+ this.webSocketTransportOwner = Object.freeze({
278
+ onOpen: (peerArg) => this.bindServerPeer(peerArg),
279
+ onFrame: (peerArg, frameArg) => {
280
+ if (frameArg.type === 'binary') {
281
+ this.enqueueServerRawFrame(peerArg, frameArg.data);
282
+ return;
283
+ }
284
+ this.stampServerTextFrame(peerArg, frameArg.text, frameArg.size);
285
+ },
286
+ onClose: (peerArg) => this.unbindServerPeer(peerArg, new Error('WebSocket peer closed')),
287
+ onError: (peerArg, errorArg) => {
288
+ const connection = this.serverConnections.get(peerArg);
289
+ if (connection)
290
+ this.failConnection(connection, errorArg, true);
291
+ },
292
+ pullBinaryFrame: (peerArg) => this.pullServerBinaryFrame(peerArg),
293
+ onOutboundFrameSettled: (peerArg, frameArg, settlementArg) => {
294
+ this.settleServerOutboundFrame(peerArg, frameArg, settlementArg);
295
+ },
296
+ onTypedResponseSettled: (peerArg, responseArg, settlementArg) => {
297
+ this.settleServerHandshake(peerArg, responseArg, settlementArg);
298
+ },
299
+ });
300
+ }
301
+ attachServer() {
302
+ if (this.side !== 'server') {
303
+ throw new TypedSocketVirtualStreamError('attachServer is server-only');
304
+ }
305
+ this.serverAttached = true;
306
+ }
307
+ detachServer() {
308
+ this.serverAttached = false;
309
+ this.onServerHandshakeReady = undefined;
310
+ for (const connection of [...this.serverConnections.values()]) {
311
+ this.failConnection(connection, new Error('TypedSocket server detached'), false);
312
+ }
313
+ this.serverConnections.clear();
314
+ }
315
+ [setServerHandshakeReadyCallbackSymbol](callbackArg) {
316
+ this.onServerHandshakeReady = callbackArg;
317
+ }
318
+ bindClientConnection(webSocketArg, generationArg) {
319
+ if (this.side !== 'client') {
320
+ throw new TypedSocketVirtualStreamError('bindClientConnection is client-only');
321
+ }
322
+ if (!Number.isSafeInteger(generationArg) || generationArg <= 0) {
323
+ throw new RangeError('client generation must be a positive safe integer');
324
+ }
325
+ if (this.currentClientConnection) {
326
+ this.failConnection(this.currentClientConnection, new Error('TypedSocket client generation replaced'), false);
327
+ }
328
+ this.currentClientConnection = this.createConnection(Object.freeze({
329
+ side: 'client',
330
+ generation: generationArg,
331
+ webSocket: webSocketArg,
332
+ }));
333
+ }
334
+ setClientHandshakeReady(webSocketArg, generationArg) {
335
+ const connection = this.currentClientConnection;
336
+ if (!connection
337
+ || connection.binding.side !== 'client'
338
+ || connection.binding.webSocket !== webSocketArg
339
+ || connection.binding.generation !== generationArg
340
+ || connection.closed) {
341
+ throw new TypedSocketVirtualStreamError('TypedSocket client generation changed during version handshake');
342
+ }
343
+ connection.handshakeReady = true;
344
+ this.clearConnectionTimer(connection, 'handshakeTimer');
345
+ }
346
+ unbindClientConnection(webSocketArg, generationArg, reasonArg) {
347
+ const connection = this.currentClientConnection;
348
+ if (!connection
349
+ || connection.binding.side !== 'client'
350
+ || connection.binding.webSocket !== webSocketArg
351
+ || connection.binding.generation !== generationArg)
352
+ return;
353
+ this.failConnection(connection, asError(reasonArg, 'TypedSocket client disconnected'), false);
354
+ if (this.currentClientConnection === connection)
355
+ this.currentClientConnection = undefined;
356
+ }
357
+ enqueueClientRawFrame(webSocketArg, generationArg, dataArg) {
358
+ const connection = this.currentClientConnection;
359
+ if (!connection
360
+ || connection.binding.side !== 'client'
361
+ || connection.binding.webSocket !== webSocketArg
362
+ || connection.binding.generation !== generationArg)
363
+ return;
364
+ const bytes = dataArg instanceof ArrayBuffer
365
+ ? new Uint8Array(dataArg)
366
+ : new Uint8Array(dataArg.buffer, dataArg.byteOffset, dataArg.byteLength);
367
+ this.enqueueRawFrame(connection, bytes);
368
+ }
369
+ prepareServerHandshake(peerArg, packageMajorArg) {
370
+ const connection = this.serverConnections.get(peerArg);
371
+ const authority = connection?.authorizedHandshake;
372
+ if (!connection
373
+ || connection.closed
374
+ || connection.handshakePending
375
+ || connection.handshakeReady
376
+ || !authority
377
+ || peerArg.transportOwner !== this.webSocketTransportOwner) {
378
+ throw new TypedSocketVirtualStreamError('TypedSocket peer cannot start a version handshake');
379
+ }
380
+ connection.authorizedHandshake = undefined;
381
+ if (packageMajorArg !== TYPEDSOCKET_PACKAGE_MAJOR) {
382
+ this.closeConnection(connection, 1008, 'TypedSocket package major mismatch');
383
+ throw new TypedSocketVirtualStreamError('TypedSocket packageMajor is malformed');
384
+ }
385
+ connection.pendingHandshake = authority;
386
+ connection.handshakePending = true;
387
+ }
388
+ isServerPeerReady(peerArg) {
389
+ const connection = this.serverConnections.get(peerArg);
390
+ return Boolean(connection
391
+ && !connection.closed
392
+ && connection.handshakeReady
393
+ && connection.binding.side === 'server'
394
+ && connection.binding.peer === peerArg
395
+ && peerArg.transportOwner === this.webSocketTransportOwner);
396
+ }
397
+ authorizeServerIncomingEnvelope(peerArg, envelopeArg) {
398
+ const connection = this.serverConnections.get(peerArg);
399
+ if (!connection
400
+ || connection.closed
401
+ || connection.binding.side !== 'server'
402
+ || connection.binding.peer !== peerArg
403
+ || peerArg.transportOwner !== this.webSocketTransportOwner) {
404
+ return false;
405
+ }
406
+ const stamp = connection.arrivalStamps[0];
407
+ if (!stamp)
408
+ return false;
409
+ const identity = parseArrivalIdentity(envelopeArg);
410
+ if (!identity
411
+ || stamp.method !== identity.method
412
+ || stamp.correlationId !== identity.correlationId
413
+ || stamp.phase !== identity.phase) {
414
+ this.closeConnection(connection, 1008, 'TypedSocket text arrival sequence mismatch');
415
+ return false;
416
+ }
417
+ connection.arrivalStamps.shift();
418
+ connection.arrivalStampBytes -= stamp.byteLength;
419
+ this.releaseServerRetainedBytes(connection, stamp.byteLength);
420
+ if (!stamp.readyAtArrival) {
421
+ if (!stamp.handshake
422
+ || !isExactHandshakeRequest(envelopeArg)
423
+ || connection.authorizedHandshake
424
+ || connection.pendingHandshake
425
+ || connection.handshakePending
426
+ || connection.handshakeReady) {
427
+ this.closeConnection(connection, 1008, 'TypedSocket pre-ready text authority mismatch');
428
+ return false;
429
+ }
430
+ connection.authorizedHandshake = Object.freeze({
431
+ correlationId: identity.correlationId,
432
+ sequence: stamp.sequence,
433
+ });
434
+ return true;
435
+ }
436
+ if (!connection.handshakeReady || identity.method === TYPEDSOCKET_VERSION_METHOD) {
437
+ this.closeConnection(connection, 1008, 'TypedSocket text readiness authority mismatch');
438
+ return false;
439
+ }
440
+ return true;
441
+ }
442
+ getClientTransport() {
443
+ const connection = this.currentClientConnection;
444
+ return connection && !connection.closed ? connection.transport : undefined;
445
+ }
446
+ getServerTransport(peerArg) {
447
+ const connection = this.serverConnections.get(peerArg);
448
+ return connection
449
+ && !connection.closed
450
+ && peerArg.transportOwner === this.webSocketTransportOwner
451
+ ? connection.transport
452
+ : undefined;
453
+ }
454
+ createRegistration(optionsArg) {
455
+ if (this.side !== 'client') {
456
+ throw new TypedSocketVirtualStreamError('Advanced VirtualStream registrations are client-only');
457
+ }
458
+ return this.createRegistrationForConnection(this.resolveConnection(), optionsArg);
459
+ }
460
+ [createAuthorizedServerRegistrationSymbol](peerArg, optionsArg) {
461
+ if (this.side !== 'server') {
462
+ throw new TypedSocketVirtualStreamError('Server VirtualStream registration is server-only');
463
+ }
464
+ if (typeof optionsArg.revalidate !== 'function') {
465
+ throw new TypeError('Server VirtualStream registration requires revalidation');
466
+ }
467
+ const connection = this.resolveConnection(peerArg);
468
+ if (connection.binding.side !== 'server' || connection.binding.peer !== peerArg) {
469
+ throw new TypedSocketVirtualStreamError('VirtualStream server peer binding is not exact');
470
+ }
471
+ return this.createRegistrationForConnection(connection, optionsArg);
472
+ }
473
+ createRegistrationForConnection(connection, optionsArg) {
474
+ this.requireReadyConnection(connection);
475
+ this.reserveStreamSlot(connection);
476
+ if (optionsArg.revalidate !== undefined && typeof optionsArg.revalidate !== 'function') {
477
+ throw new TypeError('VirtualStream revalidate must be a function');
478
+ }
479
+ const creatorDirection = optionsArg.creatorDirection;
480
+ if (creatorDirection !== 'send' && creatorDirection !== 'receive') {
481
+ throw new TypeError('creatorDirection must be send or receive');
482
+ }
483
+ const contentType = normalizeVirtualStreamContentType(optionsArg.contentType);
484
+ const integrity = normalizeVirtualStreamIntegrity(optionsArg.integrity);
485
+ const now = this.runtime.now();
486
+ if (!Number.isSafeInteger(now) || now < 0 || now > Number.MAX_SAFE_INTEGER - VIRTUAL_STREAM_CAPABILITY_TIMEOUT_MS) {
487
+ throw new VirtualStreamProtocolError('runtime now() cannot create a capability deadline');
488
+ }
489
+ this.pruneTombstones(connection);
490
+ let streamId = '';
491
+ for (let attempt = 0; attempt < 8; attempt++) {
492
+ const candidate = randomStreamId(this.runtime);
493
+ if (!connection.registrations.has(candidate)
494
+ && !connection.streams.has(candidate)
495
+ && !connection.tombstones.has(candidate)) {
496
+ streamId = candidate;
497
+ break;
498
+ }
499
+ }
500
+ if (!streamId) {
501
+ throw new TypedSocketVirtualStreamError('runtime repeatedly generated an occupied stream ID');
502
+ }
503
+ const descriptor = Object.freeze({
504
+ _isVirtualStream: true,
505
+ protocol: VIRTUAL_STREAM_PROTOCOL,
506
+ streamId,
507
+ creatorDirection,
508
+ ...(contentType === undefined ? {} : { contentType }),
509
+ ...(integrity === undefined ? {} : { integrity }),
510
+ transport: Object.freeze({
511
+ capability: randomCapability(this.runtime),
512
+ expiresAt: now + VIRTUAL_STREAM_CAPABILITY_TIMEOUT_MS,
513
+ }),
514
+ });
515
+ const state = this.createEndpointState(connection, descriptor, creatorDirection, true, optionsArg.revalidate, 'registered');
516
+ connection.registrations.set(streamId, state);
517
+ state.timer = this.runtime.setTimer(() => {
518
+ this.cleanupEndpoint(state, new TypedSocketVirtualStreamError('VirtualStream capability expired'), true, false);
519
+ if (!connection.closed)
520
+ this.addTombstone(connection, streamId);
521
+ }, VIRTUAL_STREAM_CAPABILITY_TIMEOUT_MS);
522
+ let disposed = false;
523
+ return Object.freeze({
524
+ descriptor,
525
+ endpoint: state.endpoint,
526
+ dispose: () => {
527
+ if (disposed)
528
+ return;
529
+ disposed = true;
530
+ if (state.status !== 'registered')
531
+ return;
532
+ this.cleanupEndpoint(state, new TypedSocketVirtualStreamError('VirtualStream registration disposed'), true, false);
533
+ },
534
+ });
535
+ }
536
+ getStats(targetArg) {
537
+ const connection = this.resolveConnectionForInspection(targetArg);
538
+ let serverStreams = 0;
539
+ for (const current of this.serverConnections.values()) {
540
+ serverStreams += current.registrations.size + current.streams.size;
541
+ }
542
+ if (!connection) {
543
+ return {
544
+ connection: 'none',
545
+ handshakeReady: false,
546
+ registeredCapabilities: 0,
547
+ activeStreams: 0,
548
+ queuedChunks: 0,
549
+ queuedBytes: 0,
550
+ rawQueueFrames: 0,
551
+ rawQueueBytes: 0,
552
+ arrivalStamps: 0,
553
+ arrivalStampBytes: 0,
554
+ outboundFrames: 0,
555
+ retainedRevalidations: 0,
556
+ tombstones: 0,
557
+ serverConnections: this.serverConnections.size,
558
+ serverStreams,
559
+ serverRetainedRevalidations: this.retainedRevalidations,
560
+ serverRetainedBytes: this.serverRetainedBytes,
561
+ };
562
+ }
563
+ this.pruneTombstones(connection);
564
+ return {
565
+ connection: connection.binding.side,
566
+ handshakeReady: connection.handshakeReady,
567
+ registeredCapabilities: connection.registrations.size,
568
+ activeStreams: connection.streams.size,
569
+ queuedChunks: connection.queuedChunks,
570
+ queuedBytes: connection.queuedBytes,
571
+ rawQueueFrames: connection.rawQueue.length,
572
+ rawQueueBytes: connection.rawQueueBytes,
573
+ arrivalStamps: connection.arrivalStamps.length,
574
+ arrivalStampBytes: connection.arrivalStampBytes,
575
+ outboundFrames: connection.controlQueue.length
576
+ + connection.dataQueue.length
577
+ + (connection.serverInflight ? 1 : 0),
578
+ retainedRevalidations: connection.retainedRevalidations,
579
+ tombstones: connection.tombstones.size,
580
+ serverConnections: this.serverConnections.size,
581
+ serverStreams,
582
+ serverRetainedRevalidations: this.retainedRevalidations,
583
+ serverRetainedBytes: this.serverRetainedBytes,
584
+ };
585
+ }
586
+ async stageDescriptor(connectionArg, descriptorArg, optionsArg) {
587
+ if (!optionsArg
588
+ || !(optionsArg.abortSignal instanceof AbortSignal)
589
+ || !Number.isSafeInteger(optionsArg.timeoutMs)
590
+ || optionsArg.timeoutMs <= 0) {
591
+ throw new TypeError('VirtualStream open options are invalid');
592
+ }
593
+ if (optionsArg.abortSignal.aborted) {
594
+ throw optionsArg.abortSignal.reason ?? new Error('VirtualStream staging aborted');
595
+ }
596
+ this.requireReadyConnection(connectionArg);
597
+ const descriptor = this.validateDescriptor(descriptorArg);
598
+ const now = this.runtime.now();
599
+ if (!Number.isSafeInteger(now) || now < 0 || descriptor.transport.expiresAt <= now) {
600
+ throw new TypedSocketVirtualStreamError('VirtualStream capability is expired');
601
+ }
602
+ this.pruneTombstones(connectionArg);
603
+ if (connectionArg.registrations.has(descriptor.streamId)
604
+ || connectionArg.streams.has(descriptor.streamId)
605
+ || connectionArg.tombstones.has(descriptor.streamId)) {
606
+ throw new TypedSocketVirtualStreamError('VirtualStream descriptor is already active or consumed on this physical peer');
607
+ }
608
+ this.reserveStreamSlot(connectionArg);
609
+ const direction = descriptor.creatorDirection === 'send' ? 'receive' : 'send';
610
+ const state = this.createEndpointState(connectionArg, descriptor, direction, false, undefined, 'staged');
611
+ connectionArg.streams.set(descriptor.streamId, state);
612
+ state.timer = this.runtime.setTimer(() => {
613
+ this.cleanupEndpoint(state, new TypedSocketVirtualStreamError('VirtualStream staged capability expired'), true, false);
614
+ }, Math.min(descriptor.transport.expiresAt - now, VIRTUAL_STREAM_CAPABILITY_TIMEOUT_MS));
615
+ if (optionsArg.abortSignal.aborted) {
616
+ this.cleanupEndpoint(state, optionsArg.abortSignal.reason, true, false);
617
+ throw optionsArg.abortSignal.reason ?? new Error('VirtualStream staging aborted');
618
+ }
619
+ return state.endpoint;
620
+ }
621
+ ensureOpened(stateArg) {
622
+ if (stateArg.status === 'closed') {
623
+ return Promise.reject(stateArg.closeError ?? new Error('VirtualStream is closed'));
624
+ }
625
+ if (stateArg.status === 'open' || stateArg.status === 'fin-received' || stateArg.status === 'accepting' || stateArg.status === 'closing') {
626
+ return Promise.resolve();
627
+ }
628
+ if (stateArg.creator)
629
+ return stateArg.openedDeferred.promise;
630
+ if (stateArg.activationPromise)
631
+ return stateArg.activationPromise;
632
+ stateArg.activationPromise = this.activateStagedEndpoint(stateArg);
633
+ void stateArg.activationPromise.catch(() => { });
634
+ return stateArg.activationPromise;
635
+ }
636
+ async activateStagedEndpoint(stateArg) {
637
+ if (stateArg.status !== 'staged')
638
+ return await stateArg.openedDeferred.promise;
639
+ const remainingCapabilityMs = stateArg.descriptor.transport.expiresAt - this.runtime.now();
640
+ if (!Number.isSafeInteger(remainingCapabilityMs) || remainingCapabilityMs <= 0) {
641
+ const error = new TypedSocketVirtualStreamError('VirtualStream capability expired before OPEN');
642
+ this.cleanupEndpoint(stateArg, error, true, false);
643
+ throw error;
644
+ }
645
+ this.clearEndpointTimer(stateArg);
646
+ stateArg.status = 'opening';
647
+ stateArg.timer = this.runtime.setTimer(() => {
648
+ void this.failEndpoint(stateArg, new TypedSocketVirtualStreamError('VirtualStream OPEN timed out'), VIRTUAL_STREAM_RESET_CODES.TIMEOUT);
649
+ }, Math.min(remainingCapabilityMs, VIRTUAL_STREAM_CAPABILITY_TIMEOUT_MS));
650
+ try {
651
+ await this.enqueueFrame(stateArg.connection, {
652
+ type: VIRTUAL_STREAM_FRAME_TYPES.OPEN,
653
+ streamId: stateArg.descriptor.streamId,
654
+ capability: stateArg.descriptor.transport.capability,
655
+ descriptorDigest: createVirtualStreamDescriptorDigest(stateArg.descriptor),
656
+ });
657
+ await stateArg.openedDeferred.promise;
658
+ }
659
+ catch (errorArg) {
660
+ await this.failEndpoint(stateArg, errorArg, VIRTUAL_STREAM_RESET_CODES.ABORTED, false);
661
+ throw errorArg;
662
+ }
663
+ }
664
+ send(stateArg, chunkArg) {
665
+ let admission;
666
+ try {
667
+ admission = this.admitChunk(stateArg, chunkArg);
668
+ }
669
+ catch (errorArg) {
670
+ return Promise.reject(errorArg);
671
+ }
672
+ const result = stateArg.operationTail.then(async () => {
673
+ try {
674
+ await this.ensureOpened(stateArg);
675
+ await this.revalidate(stateArg, 'chunk');
676
+ this.assertEndpointOpen(stateArg, 'send');
677
+ await this.sendAdmission(stateArg, admission);
678
+ }
679
+ catch (errorArg) {
680
+ await this.failEndpoint(stateArg, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.ABORTED));
681
+ throw errorArg;
682
+ }
683
+ });
684
+ stateArg.operationTail = result.then(() => undefined, () => undefined);
685
+ return result.finally(() => this.releaseAdmission(stateArg, admission));
686
+ }
687
+ admitChunk(stateArg, chunkArg) {
688
+ if (!(chunkArg instanceof Uint8Array)) {
689
+ throw new TypeError('VirtualStream.send accepts only Uint8Array chunks');
690
+ }
691
+ if (stateArg.direction !== 'send' || stateArg.status === 'closed' || stateArg.terminalRequested) {
692
+ throw stateArg.closeError ?? new TypedSocketVirtualStreamError('VirtualStream sender is closing');
693
+ }
694
+ if (chunkArg.byteLength > VIRTUAL_STREAM_MAX_LOGICAL_CHUNK_BYTES) {
695
+ throw new RangeError(`VirtualStream logical chunks must not exceed ${VIRTUAL_STREAM_MAX_LOGICAL_CHUNK_BYTES} bytes`);
696
+ }
697
+ if (stateArg.admittedChunkCount >= 0xffffffff) {
698
+ throw new TypedSocketVirtualStreamError('VirtualStream chunk sequence is exhausted');
699
+ }
700
+ const nextByteLength = stateArg.admittedByteLength + chunkArg.byteLength;
701
+ if (!Number.isSafeInteger(nextByteLength)) {
702
+ throw new TypedSocketVirtualStreamError('VirtualStream byteLength exceeds the safe integer range');
703
+ }
704
+ if (stateArg.descriptor.integrity && nextByteLength > stateArg.descriptor.integrity.byteLength) {
705
+ throw new TypedSocketVirtualStreamError('VirtualStream bytes exceed declared integrity byteLength');
706
+ }
707
+ if (stateArg.pendingAdmissions >= VIRTUAL_STREAM_MAX_QUEUED_CHUNKS_PER_STREAM
708
+ || stateArg.connection.queuedChunks >= VIRTUAL_STREAM_MAX_QUEUED_CHUNKS_PER_CONNECTION
709
+ || stateArg.pendingAdmissionBytes + chunkArg.byteLength > VIRTUAL_STREAM_MAX_QUEUED_BYTES_PER_STREAM
710
+ || stateArg.connection.queuedBytes + chunkArg.byteLength > VIRTUAL_STREAM_MAX_QUEUED_BYTES_PER_CONNECTION) {
711
+ throw new TypedSocketVirtualStreamError('VirtualStream sender admission capacity exhausted');
712
+ }
713
+ this.reserveServerRetainedBytes(stateArg.connection, chunkArg.byteLength);
714
+ let admission;
715
+ try {
716
+ admission = {
717
+ sequence: stateArg.admittedChunkCount,
718
+ payload: copyVirtualStreamBytes(chunkArg),
719
+ accountingOwned: true,
720
+ };
721
+ stateArg.admissions.add(admission);
722
+ stateArg.admittedChunkCount++;
723
+ stateArg.admittedByteLength = nextByteLength;
724
+ stateArg.pendingAdmissions++;
725
+ stateArg.pendingAdmissionBytes += admission.payload.byteLength;
726
+ stateArg.connection.queuedChunks++;
727
+ stateArg.connection.queuedBytes += admission.payload.byteLength;
728
+ return admission;
729
+ }
730
+ catch (errorArg) {
731
+ if (admission)
732
+ stateArg.admissions.delete(admission);
733
+ this.releaseServerRetainedBytes(stateArg.connection, chunkArg.byteLength);
734
+ throw errorArg;
735
+ }
736
+ }
737
+ releaseAdmission(stateArg, admissionArg) {
738
+ if (!admissionArg.accountingOwned)
739
+ return;
740
+ admissionArg.accountingOwned = false;
741
+ stateArg.admissions.delete(admissionArg);
742
+ stateArg.pendingAdmissions--;
743
+ stateArg.pendingAdmissionBytes -= admissionArg.payload.byteLength;
744
+ stateArg.connection.queuedChunks--;
745
+ stateArg.connection.queuedBytes -= admissionArg.payload.byteLength;
746
+ this.releaseServerRetainedBytes(stateArg.connection, admissionArg.payload.byteLength);
747
+ }
748
+ async sendAdmission(stateArg, admissionArg) {
749
+ const acknowledgement = createDeferred();
750
+ stateArg.awaitingChunkAck = { sequence: admissionArg.sequence, deferred: acknowledgement };
751
+ try {
752
+ const payload = admissionArg.payload;
753
+ if (payload.byteLength === 0) {
754
+ await this.enqueueFrame(stateArg.connection, {
755
+ type: VIRTUAL_STREAM_FRAME_TYPES.CHUNK,
756
+ streamId: stateArg.descriptor.streamId,
757
+ sequence: admissionArg.sequence,
758
+ totalLength: 0,
759
+ fragmentOffset: 0,
760
+ payload,
761
+ });
762
+ }
763
+ else {
764
+ let offset = 0;
765
+ while (offset < payload.byteLength) {
766
+ this.assertEndpointOpen(stateArg, 'send');
767
+ const fragmentLength = Math.min(VIRTUAL_STREAM_MAX_FRAGMENT_PAYLOAD_BYTES, payload.byteLength - offset);
768
+ await this.enqueueFrame(stateArg.connection, {
769
+ type: VIRTUAL_STREAM_FRAME_TYPES.CHUNK,
770
+ streamId: stateArg.descriptor.streamId,
771
+ sequence: admissionArg.sequence,
772
+ totalLength: payload.byteLength,
773
+ fragmentOffset: offset,
774
+ payload: payload.subarray(offset, offset + fragmentLength),
775
+ });
776
+ offset += fragmentLength;
777
+ }
778
+ }
779
+ stateArg.hasher?.update(payload);
780
+ stateArg.processedChunkCount++;
781
+ stateArg.processedByteLength += payload.byteLength;
782
+ this.refreshProgressTimer(stateArg);
783
+ await acknowledgement.promise;
784
+ }
785
+ finally {
786
+ if (stateArg.awaitingChunkAck?.deferred === acknowledgement) {
787
+ stateArg.awaitingChunkAck = undefined;
788
+ }
789
+ }
790
+ }
791
+ closeSender(stateArg) {
792
+ if (stateArg.terminalPromise)
793
+ return stateArg.terminalPromise;
794
+ if (stateArg.direction !== 'send' || stateArg.status === 'closed') {
795
+ return Promise.reject(stateArg.closeError ?? new TypedSocketVirtualStreamError('VirtualStream sender is closed'));
796
+ }
797
+ stateArg.terminalRequested = true;
798
+ const closeOperation = stateArg.operationTail.then(async () => {
799
+ await this.ensureOpened(stateArg);
800
+ this.assertEndpointOpen(stateArg, 'send');
801
+ const integrity = stateArg.descriptor.integrity;
802
+ if (integrity) {
803
+ const digest = `sha256:${stateArg.hasher.digest()}`;
804
+ if (stateArg.processedByteLength !== integrity.byteLength
805
+ || digest !== integrity.digest) {
806
+ const error = new TypedSocketVirtualStreamError('VirtualStream sender integrity does not match the declaration');
807
+ await this.failEndpoint(stateArg, error, VIRTUAL_STREAM_RESET_CODES.INTEGRITY_ERROR);
808
+ throw error;
809
+ }
810
+ }
811
+ stateArg.status = 'closing';
812
+ this.refreshProgressTimer(stateArg);
813
+ await this.enqueueFrame(stateArg.connection, {
814
+ type: VIRTUAL_STREAM_FRAME_TYPES.FIN,
815
+ streamId: stateArg.descriptor.streamId,
816
+ chunkCount: stateArg.processedChunkCount,
817
+ byteLength: stateArg.processedByteLength,
818
+ });
819
+ return await stateArg.completionDeferred.promise;
820
+ });
821
+ const result = closeOperation.catch(async (errorArg) => {
822
+ await this.failEndpoint(stateArg, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.ABORTED));
823
+ throw errorArg;
824
+ });
825
+ stateArg.operationTail = result.then(() => undefined, () => undefined);
826
+ stateArg.terminalPromise = result;
827
+ return result;
828
+ }
829
+ async receive(stateArg, modeArg) {
830
+ if (stateArg.direction !== 'receive') {
831
+ throw new TypeError('send VirtualStreams cannot receive');
832
+ }
833
+ if (stateArg.receiveMode && stateArg.receiveMode !== modeArg) {
834
+ throw new TypedSocketVirtualStreamError('VirtualStream direct receive and readable consumption are mutually exclusive');
835
+ }
836
+ stateArg.receiveMode = modeArg;
837
+ if (stateArg.receiveActive) {
838
+ throw new TypedSocketVirtualStreamError('VirtualStream receiver permits one active receive');
839
+ }
840
+ stateArg.receiveActive = true;
841
+ try {
842
+ await this.ensureOpened(stateArg);
843
+ while (stateArg.completedChunks.length === 0) {
844
+ if (stateArg.finReceived)
845
+ return undefined;
846
+ if (stateArg.status === 'closed') {
847
+ throw stateArg.closeError ?? new TypedSocketVirtualStreamError('VirtualStream receiver is closed');
848
+ }
849
+ const waiter = createDeferred();
850
+ stateArg.receiveWaiters.add(waiter);
851
+ try {
852
+ await waiter.promise;
853
+ }
854
+ finally {
855
+ stateArg.receiveWaiters.delete(waiter);
856
+ }
857
+ }
858
+ const completed = stateArg.completedChunks.shift();
859
+ stateArg.connection.queuedChunks--;
860
+ stateArg.connection.queuedBytes -= completed.payload.byteLength;
861
+ stateArg.deliveringChunk = completed;
862
+ await this.enqueueFrame(stateArg.connection, {
863
+ type: VIRTUAL_STREAM_FRAME_TYPES.CHUNK_ACK,
864
+ streamId: stateArg.descriptor.streamId,
865
+ sequence: completed.sequence,
866
+ });
867
+ if (stateArg.deliveringChunk === completed)
868
+ stateArg.deliveringChunk = undefined;
869
+ this.releaseCompletedChunkAccounting(stateArg, completed);
870
+ this.refreshProgressTimer(stateArg);
871
+ return completed.payload;
872
+ }
873
+ catch (errorArg) {
874
+ await this.failEndpoint(stateArg, errorArg, VIRTUAL_STREAM_RESET_CODES.ABORTED);
875
+ throw errorArg;
876
+ }
877
+ finally {
878
+ stateArg.receiveActive = false;
879
+ }
880
+ }
881
+ acceptReceiver(stateArg) {
882
+ if (stateArg.terminalPromise)
883
+ return stateArg.terminalPromise;
884
+ if (stateArg.direction !== 'receive' || stateArg.status === 'closed') {
885
+ return Promise.reject(new TypedSocketVirtualStreamError('VirtualStream receiver is closed'));
886
+ }
887
+ stateArg.terminalRequested = true;
888
+ const result = (async () => {
889
+ try {
890
+ await this.ensureOpened(stateArg);
891
+ if (!stateArg.finReceived
892
+ || stateArg.completedChunks.length !== 0
893
+ || stateArg.reassembly
894
+ || stateArg.status !== 'fin-received') {
895
+ throw new TypedSocketVirtualStreamError('VirtualStream.accept requires FIN and a fully drained receiver');
896
+ }
897
+ await this.revalidate(stateArg, 'accept');
898
+ this.assertEndpointOwned(stateArg);
899
+ stateArg.status = 'accepting';
900
+ const receipt = createReceipt(stateArg);
901
+ await this.enqueueFrame(stateArg.connection, {
902
+ type: VIRTUAL_STREAM_FRAME_TYPES.ACCEPT,
903
+ streamId: stateArg.descriptor.streamId,
904
+ chunkCount: receipt.chunkCount,
905
+ byteLength: receipt.byteLength,
906
+ integrityVerified: receipt.verifiedIntegrity !== null,
907
+ });
908
+ stateArg.completionDeferred.resolve(receipt);
909
+ this.cleanupEndpoint(stateArg, undefined, false);
910
+ return receipt;
911
+ }
912
+ catch (errorArg) {
913
+ await this.failEndpoint(stateArg, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.ABORTED));
914
+ throw errorArg;
915
+ }
916
+ })();
917
+ stateArg.terminalPromise = result;
918
+ return result;
919
+ }
920
+ rejectReceiver(stateArg, reasonArg) {
921
+ if (stateArg.terminalPromise)
922
+ return stateArg.terminalPromise.then(() => undefined);
923
+ stateArg.terminalRequested = true;
924
+ const result = (async () => {
925
+ if (stateArg.creator && stateArg.status === 'registered') {
926
+ this.cleanupEndpoint(stateArg, asError(reasonArg, 'VirtualStream receiver rejected'), true, false);
927
+ return;
928
+ }
929
+ await this.ensureOpened(stateArg);
930
+ try {
931
+ await this.revalidate(stateArg, 'reject');
932
+ }
933
+ catch (errorArg) {
934
+ await this.failEndpoint(stateArg, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.AUTHORITY_REVOKED));
935
+ throw errorArg;
936
+ }
937
+ const error = asError(reasonArg, 'VirtualStream receiver rejected');
938
+ await this.failEndpoint(stateArg, error, VIRTUAL_STREAM_RESET_CODES.REJECTED);
939
+ })();
940
+ stateArg.terminalPromise = result;
941
+ return result;
942
+ }
943
+ async abortEndpoint(stateArg, reasonArg) {
944
+ if (stateArg.status === 'closed')
945
+ return await stateArg.closedDeferred.promise;
946
+ const error = asError(reasonArg, 'VirtualStream aborted');
947
+ if (stateArg.status === 'registered' || stateArg.status === 'staged') {
948
+ this.cleanupEndpoint(stateArg, error, true, false);
949
+ return;
950
+ }
951
+ await this.failEndpoint(stateArg, error, VIRTUAL_STREAM_RESET_CODES.ABORTED);
952
+ }
953
+ createConnection(bindingArg) {
954
+ let transport;
955
+ const connection = {
956
+ binding: bindingArg,
957
+ get transport() {
958
+ return transport;
959
+ },
960
+ registrations: new Map(),
961
+ streams: new Map(),
962
+ tombstones: new Map(),
963
+ rawQueue: [],
964
+ controlQueue: [],
965
+ dataQueue: [],
966
+ revalidationControllers: new Set(),
967
+ arrivalStamps: [],
968
+ closed: false,
969
+ handshakePending: false,
970
+ handshakeReady: false,
971
+ processingRaw: false,
972
+ rawQueueBytes: 0,
973
+ processingRawBytes: 0,
974
+ arrivalStampBytes: 0,
975
+ nextArrivalSequence: 1,
976
+ queuedChunks: 0,
977
+ queuedBytes: 0,
978
+ retainedRevalidations: 0,
979
+ clientTurnScheduled: false,
980
+ };
981
+ transport = new VirtualStreamConnectionTransport(this, connection);
982
+ if (bindingArg.side === 'server') {
983
+ connection.handshakeTimer = this.runtime.setTimer(() => {
984
+ if (!connection.closed && !connection.handshakeReady) {
985
+ this.closeConnection(connection, 1008, 'TypedSocket version handshake timed out');
986
+ }
987
+ }, TYPEDSOCKET_HANDSHAKE_TIMEOUT_MS);
988
+ }
989
+ return connection;
990
+ }
991
+ createEndpointState(connectionArg, descriptorArg, directionArg, creatorArg, revalidateArg, statusArg) {
992
+ const retainedMetadataBytes = virtualStreamTextEncoder.encode(JSON.stringify(descriptorArg)).byteLength;
993
+ this.reserveServerRetainedBytes(connectionArg, retainedMetadataBytes);
994
+ try {
995
+ const state = {
996
+ connection: connectionArg,
997
+ descriptor: descriptorArg,
998
+ creator: creatorArg,
999
+ direction: directionArg,
1000
+ revalidate: revalidateArg,
1001
+ openedDeferred: createDeferred(),
1002
+ completionDeferred: createDeferred(),
1003
+ closedDeferred: createDeferred(),
1004
+ revalidationControllers: new Set(),
1005
+ admissions: new Set(),
1006
+ endpoint: undefined,
1007
+ status: statusArg,
1008
+ hasher: descriptorArg.integrity ? plugins.smarthash.createSha256Hasher() : undefined,
1009
+ operationTail: Promise.resolve(),
1010
+ terminalRequested: false,
1011
+ admittedChunkCount: 0,
1012
+ admittedByteLength: 0,
1013
+ processedChunkCount: 0,
1014
+ processedByteLength: 0,
1015
+ pendingAdmissions: 0,
1016
+ pendingAdmissionBytes: 0,
1017
+ receiveActive: false,
1018
+ completedChunks: [],
1019
+ receiveWaiters: new Set(),
1020
+ finReceived: false,
1021
+ retainedMetadataBytes,
1022
+ metadataAccountingOwned: true,
1023
+ };
1024
+ state.endpoint = directionArg === 'send'
1025
+ ? new VirtualStreamSender(this, state)
1026
+ : new VirtualStreamReceiver(this, state);
1027
+ return state;
1028
+ }
1029
+ catch (errorArg) {
1030
+ this.releaseServerRetainedBytes(connectionArg, retainedMetadataBytes);
1031
+ throw errorArg;
1032
+ }
1033
+ }
1034
+ bindServerPeer(peerArg) {
1035
+ if (this.side !== 'server'
1036
+ || !this.serverAttached
1037
+ || peerArg.transportOwner !== this.webSocketTransportOwner)
1038
+ return;
1039
+ const existing = this.serverConnections.get(peerArg);
1040
+ if (existing && !existing.closed)
1041
+ return;
1042
+ const settlementExisting = this.serverSettlementConnections.get(peerArg);
1043
+ if (settlementExisting?.serverInflight) {
1044
+ try {
1045
+ peerArg.close(1013, 'virtual-stream-v1 peer settlement is still pending');
1046
+ }
1047
+ catch { }
1048
+ return;
1049
+ }
1050
+ if (settlementExisting)
1051
+ this.serverSettlementConnections.delete(peerArg);
1052
+ if (this.serverConnections.size >= VIRTUAL_STREAM_MAX_CONNECTIONS_PER_SERVER) {
1053
+ this.emitDiagnostic({
1054
+ kind: 'peerRejected',
1055
+ side: 'server',
1056
+ closeCode: 1013,
1057
+ reason: 'virtual-stream-v1 server connection capacity exhausted',
1058
+ });
1059
+ try {
1060
+ peerArg.close(1013, 'virtual-stream-v1 server connection capacity exhausted');
1061
+ }
1062
+ catch { }
1063
+ return;
1064
+ }
1065
+ const connection = this.createConnection(Object.freeze({
1066
+ side: 'server',
1067
+ peer: peerArg,
1068
+ }));
1069
+ this.serverConnections.set(peerArg, connection);
1070
+ this.serverSettlementConnections.set(peerArg, connection);
1071
+ }
1072
+ unbindServerPeer(peerArg, reasonArg) {
1073
+ const connection = this.serverConnections.get(peerArg);
1074
+ if (!connection)
1075
+ return;
1076
+ this.failConnection(connection, reasonArg, false);
1077
+ this.serverConnections.delete(peerArg);
1078
+ }
1079
+ settleServerHandshake(peerArg, responseArg, settlementArg) {
1080
+ const connection = this.serverConnections.get(peerArg);
1081
+ if (!connection || connection.closed || !connection.handshakePending)
1082
+ return;
1083
+ const pendingHandshake = connection.pendingHandshake;
1084
+ connection.handshakePending = false;
1085
+ connection.pendingHandshake = undefined;
1086
+ const exactEnvelope = Boolean(pendingHandshake
1087
+ && isExactHandshakeResponse(responseArg, pendingHandshake.correlationId));
1088
+ const sent = settlementArg.status === 'sent' || settlementArg.status === 'accepted';
1089
+ if (!exactEnvelope || !sent) {
1090
+ this.closeConnection(connection, 1008, 'TypedSocket version handshake failed');
1091
+ return;
1092
+ }
1093
+ this.clearConnectionTimer(connection, 'handshakeTimer');
1094
+ try {
1095
+ const callbackResult = this.onServerHandshakeReady?.(peerArg);
1096
+ if (callbackResult !== undefined) {
1097
+ if (((typeof callbackResult === 'object' && callbackResult !== null)
1098
+ || typeof callbackResult === 'function')
1099
+ && !this.observedInvalidReadyPromises.has(callbackResult)) {
1100
+ this.observedInvalidReadyPromises.add(callbackResult);
1101
+ try {
1102
+ void Reflect.apply(nativePromiseThen, callbackResult, [undefined, () => undefined]);
1103
+ }
1104
+ catch { }
1105
+ }
1106
+ throw new TypeError('TypedSocket server ready callback must return undefined');
1107
+ }
1108
+ }
1109
+ catch {
1110
+ this.closeConnection(connection, 1011, 'TypedSocket server ready callback failed');
1111
+ return;
1112
+ }
1113
+ connection.handshakeReady = true;
1114
+ }
1115
+ stampServerTextFrame(peerArg, textArg, _reportedSizeArg) {
1116
+ const connection = this.serverConnections.get(peerArg);
1117
+ if (!connection
1118
+ || connection.closed
1119
+ || connection.binding.side !== 'server'
1120
+ || connection.binding.peer !== peerArg
1121
+ || peerArg.transportOwner !== this.webSocketTransportOwner) {
1122
+ return undefined;
1123
+ }
1124
+ const byteLength = virtualStreamTextEncoder.encode(textArg).byteLength;
1125
+ if (connection.arrivalStamps.length >= VIRTUAL_STREAM_MAX_ARRIVAL_STAMPS_PER_CONNECTION
1126
+ || connection.arrivalStampBytes + byteLength
1127
+ > VIRTUAL_STREAM_MAX_ARRIVAL_STAMP_BYTES_PER_CONNECTION
1128
+ || connection.nextArrivalSequence > Number.MAX_SAFE_INTEGER) {
1129
+ this.closeConnection(connection, 1009, 'TypedSocket text arrival authority capacity exhausted');
1130
+ return undefined;
1131
+ }
1132
+ let envelope;
1133
+ try {
1134
+ envelope = JSON.parse(textArg);
1135
+ }
1136
+ catch {
1137
+ this.closeConnection(connection, 1007, 'TypedSocket text frame is malformed');
1138
+ return undefined;
1139
+ }
1140
+ const identity = parseArrivalIdentity(envelope);
1141
+ if (!identity) {
1142
+ this.closeConnection(connection, 1008, 'TypedSocket text envelope is malformed');
1143
+ return undefined;
1144
+ }
1145
+ if (identity.phase === 'request') {
1146
+ const request = isPlainRecord(envelope)
1147
+ ? getOwnEnumerableData(envelope, 'request')
1148
+ : undefined;
1149
+ if (!request || typeof request !== 'object') {
1150
+ this.closeConnection(connection, 1008, 'TypedSocket text request is malformed');
1151
+ return undefined;
1152
+ }
1153
+ }
1154
+ const readyAtArrival = connection.handshakeReady;
1155
+ const handshake = isExactHandshakeRequest(envelope);
1156
+ if (!readyAtArrival) {
1157
+ if (!handshake
1158
+ || connection.arrivalStamps.length > 0
1159
+ || connection.authorizedHandshake
1160
+ || connection.pendingHandshake
1161
+ || connection.handshakePending) {
1162
+ this.closeConnection(connection, 1008, 'TypedSocket text frame arrived before readiness');
1163
+ return undefined;
1164
+ }
1165
+ }
1166
+ else if (identity.method === TYPEDSOCKET_VERSION_METHOD) {
1167
+ this.closeConnection(connection, 1008, 'TypedSocket version handshake is reserved for startup');
1168
+ return undefined;
1169
+ }
1170
+ try {
1171
+ this.reserveServerRetainedBytes(connection, byteLength);
1172
+ }
1173
+ catch {
1174
+ this.closeConnection(connection, 1013, 'virtual-stream-v1 server retained-byte capacity exhausted');
1175
+ return undefined;
1176
+ }
1177
+ try {
1178
+ const sequence = connection.nextArrivalSequence++;
1179
+ connection.arrivalStamps.push(Object.freeze({
1180
+ sequence,
1181
+ byteLength,
1182
+ readyAtArrival,
1183
+ method: identity.method,
1184
+ correlationId: identity.correlationId,
1185
+ phase: identity.phase,
1186
+ handshake,
1187
+ }));
1188
+ connection.arrivalStampBytes += byteLength;
1189
+ return sequence;
1190
+ }
1191
+ catch (errorArg) {
1192
+ this.releaseServerRetainedBytes(connection, byteLength);
1193
+ throw errorArg;
1194
+ }
1195
+ }
1196
+ enqueueServerRawFrame(peerArg, dataArg) {
1197
+ const connection = this.serverConnections.get(peerArg);
1198
+ if (!connection || peerArg.transportOwner !== this.webSocketTransportOwner)
1199
+ return;
1200
+ if (!connection.handshakeReady) {
1201
+ this.closeConnection(connection, 1008, 'TypedSocket binary frame arrived before readiness');
1202
+ return;
1203
+ }
1204
+ this.enqueueRawFrame(connection, dataArg);
1205
+ }
1206
+ enqueueRawFrame(connectionArg, dataArg) {
1207
+ if (connectionArg.closed)
1208
+ return;
1209
+ if (!connectionArg.handshakeReady) {
1210
+ this.closeConnection(connectionArg, 1008, 'TypedSocket binary frame arrived before readiness');
1211
+ return;
1212
+ }
1213
+ if (connectionArg.rawQueue.length >= VIRTUAL_STREAM_MAX_RAW_QUEUE_FRAMES
1214
+ || connectionArg.rawQueueBytes + dataArg.byteLength > VIRTUAL_STREAM_MAX_RAW_QUEUE_BYTES) {
1215
+ this.closeConnection(connectionArg, 1009, 'virtual-stream-v1 raw queue overflow');
1216
+ return;
1217
+ }
1218
+ try {
1219
+ this.reserveServerRetainedBytes(connectionArg, dataArg.byteLength);
1220
+ }
1221
+ catch {
1222
+ this.closeConnection(connectionArg, 1013, 'virtual-stream-v1 server retained-byte capacity exhausted');
1223
+ return;
1224
+ }
1225
+ try {
1226
+ const bytes = copyVirtualStreamBytes(dataArg);
1227
+ connectionArg.rawQueue.push(bytes);
1228
+ connectionArg.rawQueueBytes += bytes.byteLength;
1229
+ }
1230
+ catch (errorArg) {
1231
+ this.releaseServerRetainedBytes(connectionArg, dataArg.byteLength);
1232
+ this.failConnection(connectionArg, errorArg, true);
1233
+ return;
1234
+ }
1235
+ if (!connectionArg.processingRaw)
1236
+ void this.processRawQueue(connectionArg);
1237
+ }
1238
+ async processRawQueue(connectionArg) {
1239
+ if (connectionArg.processingRaw || connectionArg.closed)
1240
+ return;
1241
+ connectionArg.processingRaw = true;
1242
+ try {
1243
+ while (!connectionArg.closed && connectionArg.rawQueue.length > 0) {
1244
+ const bytes = connectionArg.rawQueue.shift();
1245
+ connectionArg.rawQueueBytes -= bytes.byteLength;
1246
+ connectionArg.processingRawBytes = bytes.byteLength;
1247
+ try {
1248
+ let frame;
1249
+ try {
1250
+ frame = decodeVirtualStreamFrame(bytes);
1251
+ }
1252
+ catch (errorArg) {
1253
+ this.closeConnection(connectionArg, 1002, 'invalid virtual-stream-v1 frame');
1254
+ throw errorArg;
1255
+ }
1256
+ await this.handleFrame(connectionArg, frame);
1257
+ }
1258
+ finally {
1259
+ const processingRawBytes = connectionArg.processingRawBytes;
1260
+ connectionArg.processingRawBytes = 0;
1261
+ this.releaseServerRetainedBytes(connectionArg, processingRawBytes);
1262
+ }
1263
+ }
1264
+ }
1265
+ catch {
1266
+ if (!connectionArg.closed) {
1267
+ this.closeConnection(connectionArg, 1002, 'virtual-stream-v1 dispatch failed');
1268
+ }
1269
+ }
1270
+ finally {
1271
+ connectionArg.processingRaw = false;
1272
+ }
1273
+ }
1274
+ async handleFrame(connectionArg, frameArg) {
1275
+ this.pruneTombstones(connectionArg);
1276
+ if (frameArg.type === VIRTUAL_STREAM_FRAME_TYPES.OPEN) {
1277
+ await this.handleOpen(connectionArg, frameArg);
1278
+ return;
1279
+ }
1280
+ const stream = connectionArg.streams.get(frameArg.streamId);
1281
+ if (!stream) {
1282
+ if (frameArg.type !== VIRTUAL_STREAM_FRAME_TYPES.RESET) {
1283
+ await this.sendReset(connectionArg, frameArg.streamId, VIRTUAL_STREAM_RESET_CODES.CAPABILITY_REJECTED, 'Unknown or expired stream capability');
1284
+ }
1285
+ return;
1286
+ }
1287
+ switch (frameArg.type) {
1288
+ case VIRTUAL_STREAM_FRAME_TYPES.OPEN_ACK:
1289
+ await this.handleOpenAck(stream);
1290
+ return;
1291
+ case VIRTUAL_STREAM_FRAME_TYPES.CHUNK:
1292
+ await this.handleChunk(stream, frameArg);
1293
+ return;
1294
+ case VIRTUAL_STREAM_FRAME_TYPES.CHUNK_ACK:
1295
+ this.handleChunkAck(stream, frameArg.sequence);
1296
+ return;
1297
+ case VIRTUAL_STREAM_FRAME_TYPES.FIN:
1298
+ await this.handleFin(stream, frameArg.chunkCount, frameArg.byteLength);
1299
+ return;
1300
+ case VIRTUAL_STREAM_FRAME_TYPES.ACCEPT:
1301
+ await this.handleAccept(stream, frameArg.chunkCount, frameArg.byteLength, frameArg.integrityVerified);
1302
+ return;
1303
+ case VIRTUAL_STREAM_FRAME_TYPES.RESET:
1304
+ await this.handleReset(stream, frameArg.code, frameArg.reason);
1305
+ return;
1306
+ }
1307
+ }
1308
+ async handleOpen(connectionArg, frameArg) {
1309
+ const registration = connectionArg.registrations.get(frameArg.streamId);
1310
+ if (!connectionArg.handshakeReady
1311
+ || !registration
1312
+ || registration.status !== 'registered'
1313
+ || connectionArg.tombstones.has(frameArg.streamId)) {
1314
+ await this.sendReset(connectionArg, frameArg.streamId, VIRTUAL_STREAM_RESET_CODES.CAPABILITY_REJECTED, 'Unknown, replayed, or expired stream capability');
1315
+ return;
1316
+ }
1317
+ this.clearEndpointTimer(registration);
1318
+ connectionArg.registrations.delete(frameArg.streamId);
1319
+ connectionArg.streams.set(frameArg.streamId, registration);
1320
+ registration.status = 'opening';
1321
+ try {
1322
+ if (frameArg.capability !== registration.descriptor.transport.capability
1323
+ || frameArg.descriptorDigest !== createVirtualStreamDescriptorDigest(registration.descriptor)
1324
+ || registration.descriptor.transport.expiresAt <= this.runtime.now()) {
1325
+ throw new TypedSocketVirtualStreamError('OPEN does not match the registered capability');
1326
+ }
1327
+ await this.revalidate(registration, 'open');
1328
+ this.assertEndpointOwned(registration);
1329
+ registration.status = 'open';
1330
+ await this.enqueueFrame(connectionArg, {
1331
+ type: VIRTUAL_STREAM_FRAME_TYPES.OPEN_ACK,
1332
+ streamId: frameArg.streamId,
1333
+ });
1334
+ registration.openedDeferred.resolve();
1335
+ this.refreshProgressTimer(registration);
1336
+ }
1337
+ catch (errorArg) {
1338
+ await this.failEndpoint(registration, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.CAPABILITY_REJECTED));
1339
+ }
1340
+ }
1341
+ async handleOpenAck(stateArg) {
1342
+ if (stateArg.creator || stateArg.status !== 'opening') {
1343
+ await this.failEndpoint(stateArg, new VirtualStreamProtocolError('unexpected OPEN_ACK'), VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR);
1344
+ return;
1345
+ }
1346
+ this.clearEndpointTimer(stateArg);
1347
+ stateArg.status = 'open';
1348
+ stateArg.openedDeferred.resolve();
1349
+ this.refreshProgressTimer(stateArg);
1350
+ }
1351
+ async handleChunk(stateArg, frameArg) {
1352
+ if (stateArg.direction !== 'receive' || stateArg.status !== 'open') {
1353
+ await this.failEndpoint(stateArg, new VirtualStreamProtocolError('unexpected CHUNK'), VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR);
1354
+ return;
1355
+ }
1356
+ try {
1357
+ let reassembly = stateArg.reassembly;
1358
+ if (!reassembly) {
1359
+ if (stateArg.processedChunkCount >= 0xffffffff
1360
+ ||
1361
+ frameArg.sequence !== stateArg.processedChunkCount
1362
+ || frameArg.fragmentOffset !== 0
1363
+ || stateArg.completedChunks.length >= VIRTUAL_STREAM_MAX_QUEUED_CHUNKS_PER_STREAM
1364
+ || stateArg.connection.queuedChunks >= VIRTUAL_STREAM_MAX_QUEUED_CHUNKS_PER_CONNECTION
1365
+ || stateArg.connection.queuedBytes + frameArg.totalLength > VIRTUAL_STREAM_MAX_QUEUED_BYTES_PER_CONNECTION) {
1366
+ throw new VirtualStreamProtocolError('CHUNK sequence or receiver capacity is invalid');
1367
+ }
1368
+ const retainedForStream = stateArg.completedChunks.reduce((sumArg, chunkArg) => sumArg + chunkArg.payload.byteLength, 0);
1369
+ if (retainedForStream + frameArg.totalLength > VIRTUAL_STREAM_MAX_QUEUED_BYTES_PER_STREAM) {
1370
+ throw new TypedSocketVirtualStreamError('VirtualStream receiver byte capacity exhausted');
1371
+ }
1372
+ this.reserveServerRetainedBytes(stateArg.connection, frameArg.totalLength);
1373
+ try {
1374
+ reassembly = {
1375
+ sequence: frameArg.sequence,
1376
+ payload: new Uint8Array(new ArrayBuffer(frameArg.totalLength)),
1377
+ nextOffset: 0,
1378
+ accountingOwned: true,
1379
+ };
1380
+ stateArg.reassembly = reassembly;
1381
+ stateArg.connection.queuedChunks++;
1382
+ stateArg.connection.queuedBytes += frameArg.totalLength;
1383
+ }
1384
+ catch (errorArg) {
1385
+ this.releaseServerRetainedBytes(stateArg.connection, frameArg.totalLength);
1386
+ throw errorArg;
1387
+ }
1388
+ }
1389
+ if (frameArg.sequence !== reassembly.sequence
1390
+ || frameArg.totalLength !== reassembly.payload.byteLength
1391
+ || frameArg.fragmentOffset !== reassembly.nextOffset) {
1392
+ throw new VirtualStreamProtocolError('CHUNK fragment order is invalid');
1393
+ }
1394
+ reassembly.payload.set(frameArg.payload, frameArg.fragmentOffset);
1395
+ reassembly.nextOffset += frameArg.payload.byteLength;
1396
+ this.refreshProgressTimer(stateArg);
1397
+ if (reassembly.nextOffset !== reassembly.payload.byteLength)
1398
+ return;
1399
+ await this.revalidate(stateArg, 'chunk');
1400
+ this.assertEndpointOwned(stateArg);
1401
+ if (stateArg.reassembly !== reassembly) {
1402
+ throw new TypedSocketVirtualStreamError('VirtualStream changed during chunk revalidation');
1403
+ }
1404
+ const nextByteLength = stateArg.processedByteLength + reassembly.payload.byteLength;
1405
+ if (!Number.isSafeInteger(nextByteLength)
1406
+ || (stateArg.descriptor.integrity && nextByteLength > stateArg.descriptor.integrity.byteLength)) {
1407
+ throw new VirtualStreamProtocolError('CHUNK exceeds declared stream byteLength');
1408
+ }
1409
+ stateArg.completedChunks.push({
1410
+ sequence: reassembly.sequence,
1411
+ payload: reassembly.payload,
1412
+ accountingOwned: true,
1413
+ });
1414
+ stateArg.reassembly = undefined;
1415
+ reassembly.accountingOwned = false;
1416
+ stateArg.hasher?.update(reassembly.payload);
1417
+ stateArg.processedChunkCount++;
1418
+ stateArg.processedByteLength = nextByteLength;
1419
+ this.wakeReceivers(stateArg);
1420
+ }
1421
+ catch (errorArg) {
1422
+ await this.failEndpoint(stateArg, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR));
1423
+ }
1424
+ }
1425
+ handleChunkAck(stateArg, sequenceArg) {
1426
+ if (stateArg.direction !== 'send' || stateArg.status !== 'open') {
1427
+ void this.failEndpoint(stateArg, new VirtualStreamProtocolError('unexpected CHUNK_ACK'), VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR);
1428
+ return;
1429
+ }
1430
+ const awaiting = stateArg.awaitingChunkAck;
1431
+ if (!awaiting || awaiting.sequence !== sequenceArg) {
1432
+ void this.failEndpoint(stateArg, new VirtualStreamProtocolError('CHUNK_ACK does not match the pending logical chunk'), VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR);
1433
+ return;
1434
+ }
1435
+ this.refreshProgressTimer(stateArg);
1436
+ awaiting.deferred.resolve();
1437
+ }
1438
+ async handleFin(stateArg, chunkCountArg, byteLengthArg) {
1439
+ if (stateArg.direction !== 'receive'
1440
+ || stateArg.status !== 'open'
1441
+ || stateArg.reassembly
1442
+ || chunkCountArg !== stateArg.processedChunkCount
1443
+ || byteLengthArg !== stateArg.processedByteLength) {
1444
+ await this.failEndpoint(stateArg, new VirtualStreamProtocolError('FIN does not match the received logical sequence'), VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR);
1445
+ return;
1446
+ }
1447
+ const integrity = stateArg.descriptor.integrity;
1448
+ if (integrity) {
1449
+ const digest = `sha256:${stateArg.hasher.digest()}`;
1450
+ if (byteLengthArg !== integrity.byteLength || digest !== integrity.digest) {
1451
+ await this.failEndpoint(stateArg, new VirtualStreamProtocolError('VirtualStream integrity verification failed'), VIRTUAL_STREAM_RESET_CODES.INTEGRITY_ERROR);
1452
+ return;
1453
+ }
1454
+ }
1455
+ stateArg.finReceived = true;
1456
+ stateArg.status = 'fin-received';
1457
+ this.refreshProgressTimer(stateArg);
1458
+ this.wakeReceivers(stateArg);
1459
+ }
1460
+ async handleAccept(stateArg, chunkCountArg, byteLengthArg, integrityVerifiedArg) {
1461
+ if (stateArg.direction !== 'send'
1462
+ || stateArg.status !== 'closing'
1463
+ || chunkCountArg !== stateArg.processedChunkCount
1464
+ || byteLengthArg !== stateArg.processedByteLength
1465
+ || integrityVerifiedArg !== Boolean(stateArg.descriptor.integrity)) {
1466
+ await this.failEndpoint(stateArg, new VirtualStreamProtocolError('ACCEPT does not match the sent logical sequence'), VIRTUAL_STREAM_RESET_CODES.PROTOCOL_ERROR);
1467
+ return;
1468
+ }
1469
+ try {
1470
+ await this.revalidate(stateArg, 'accept');
1471
+ this.assertEndpointOwned(stateArg);
1472
+ const receipt = createReceipt(stateArg);
1473
+ stateArg.completionDeferred.resolve(receipt);
1474
+ this.cleanupEndpoint(stateArg, undefined, false);
1475
+ }
1476
+ catch (errorArg) {
1477
+ await this.failEndpoint(stateArg, errorArg, this.revalidationResetCode(errorArg, VIRTUAL_STREAM_RESET_CODES.AUTHORITY_REVOKED));
1478
+ }
1479
+ }
1480
+ async handleReset(stateArg, codeArg, reasonArg) {
1481
+ try {
1482
+ await this.revalidate(stateArg, 'reject');
1483
+ }
1484
+ catch { }
1485
+ this.cleanupEndpoint(stateArg, new TypedSocketVirtualStreamError(`virtual-stream-v1 peer reset stream (${codeArg}): ${reasonArg}`), true);
1486
+ }
1487
+ async revalidate(stateArg, operationArg) {
1488
+ if (!stateArg.creator || !stateArg.revalidate)
1489
+ return;
1490
+ this.assertEndpointOwned(stateArg);
1491
+ if (stateArg.connection.retainedRevalidations >= VIRTUAL_STREAM_MAX_REVALIDATIONS_PER_CONNECTION
1492
+ || this.retainedRevalidations >= VIRTUAL_STREAM_MAX_REVALIDATIONS_PER_SERVER) {
1493
+ throw new TypedSocketVirtualStreamError('VirtualStream revalidation capacity exhausted');
1494
+ }
1495
+ const now = this.runtime.now();
1496
+ if (!Number.isSafeInteger(now) || now < 0 || now > Number.MAX_SAFE_INTEGER - VIRTUAL_STREAM_REVALIDATION_TIMEOUT_MS) {
1497
+ throw new VirtualStreamProtocolError('runtime now() cannot create a revalidation deadline');
1498
+ }
1499
+ const controller = new AbortController();
1500
+ stateArg.revalidationControllers.add(controller);
1501
+ stateArg.connection.revalidationControllers.add(controller);
1502
+ stateArg.connection.retainedRevalidations++;
1503
+ this.retainedRevalidations++;
1504
+ let released = false;
1505
+ const release = () => {
1506
+ if (released)
1507
+ return;
1508
+ released = true;
1509
+ stateArg.revalidationControllers.delete(controller);
1510
+ stateArg.connection.revalidationControllers.delete(controller);
1511
+ stateArg.connection.retainedRevalidations--;
1512
+ this.retainedRevalidations--;
1513
+ this.releaseEndpointMetadataAccounting(stateArg);
1514
+ };
1515
+ const outcome = Promise.resolve()
1516
+ .then(() => stateArg.revalidate(Object.freeze({
1517
+ operation: operationArg,
1518
+ descriptor: stateArg.descriptor,
1519
+ connection: stateArg.connection.binding,
1520
+ abortSignal: controller.signal,
1521
+ deadline: now + VIRTUAL_STREAM_REVALIDATION_TIMEOUT_MS,
1522
+ })))
1523
+ .then((allowedArg) => allowedArg === true ? 'allowed' : 'denied', () => 'failed');
1524
+ void outcome.then(release, release);
1525
+ const timeout = this.runtime.setTimer(() => {
1526
+ controller.abort(new TypedSocketVirtualStreamError('VirtualStream revalidation timed out'));
1527
+ }, VIRTUAL_STREAM_REVALIDATION_TIMEOUT_MS);
1528
+ const aborted = new Promise((resolveArg) => {
1529
+ const resolve = () => resolveArg('aborted');
1530
+ controller.signal.addEventListener('abort', resolve, { once: true });
1531
+ if (controller.signal.aborted)
1532
+ resolve();
1533
+ });
1534
+ try {
1535
+ const result = await Promise.race([outcome, aborted]);
1536
+ if (result === 'allowed') {
1537
+ this.assertEndpointOwned(stateArg);
1538
+ return;
1539
+ }
1540
+ if (result === 'aborted') {
1541
+ throw asError(controller.signal.reason, 'VirtualStream revalidation was aborted');
1542
+ }
1543
+ throw new TypedSocketVirtualStreamError(result === 'failed'
1544
+ ? 'VirtualStream revalidation callback failed'
1545
+ : 'VirtualStream authority was revoked');
1546
+ }
1547
+ finally {
1548
+ this.runtime.clearTimer(timeout);
1549
+ }
1550
+ }
1551
+ revalidationResetCode(errorArg, fallbackArg) {
1552
+ if (errorArg instanceof TypedSocketVirtualStreamError) {
1553
+ if (errorArg.message.includes('capacity'))
1554
+ return VIRTUAL_STREAM_RESET_CODES.RESOURCE_LIMIT;
1555
+ if (errorArg.message.includes('timed out'))
1556
+ return VIRTUAL_STREAM_RESET_CODES.TIMEOUT;
1557
+ if (errorArg.message.includes('authority') || errorArg.message.includes('callback')) {
1558
+ return VIRTUAL_STREAM_RESET_CODES.AUTHORITY_REVOKED;
1559
+ }
1560
+ }
1561
+ return fallbackArg;
1562
+ }
1563
+ reserveServerRetainedBytes(connectionArg, additionalBytesArg) {
1564
+ if (connectionArg.binding.side !== 'server' || additionalBytesArg === 0)
1565
+ return;
1566
+ const nextRetainedBytes = this.serverRetainedBytes + additionalBytesArg;
1567
+ if (!Number.isSafeInteger(additionalBytesArg)
1568
+ || additionalBytesArg < 0
1569
+ || !Number.isSafeInteger(nextRetainedBytes)
1570
+ || nextRetainedBytes > VIRTUAL_STREAM_MAX_RETAINED_BYTES_PER_SERVER) {
1571
+ throw new TypedSocketVirtualStreamError('virtual-stream-v1 server retained-byte capacity exhausted');
1572
+ }
1573
+ this.serverRetainedBytes = nextRetainedBytes;
1574
+ }
1575
+ releaseServerRetainedBytes(connectionArg, retainedBytesArg) {
1576
+ if (connectionArg.binding.side !== 'server' || retainedBytesArg === 0)
1577
+ return;
1578
+ if (!Number.isSafeInteger(retainedBytesArg)
1579
+ || retainedBytesArg < 0
1580
+ || this.serverRetainedBytes < retainedBytesArg) {
1581
+ throw new VirtualStreamProtocolError('virtual-stream-v1 server retained-byte accounting underflow');
1582
+ }
1583
+ this.serverRetainedBytes -= retainedBytesArg;
1584
+ }
1585
+ releaseEndpointMetadataAccounting(stateArg) {
1586
+ if (stateArg.status !== 'closed'
1587
+ || stateArg.revalidationControllers.size > 0
1588
+ || !stateArg.metadataAccountingOwned)
1589
+ return;
1590
+ stateArg.metadataAccountingOwned = false;
1591
+ this.releaseServerRetainedBytes(stateArg.connection, stateArg.retainedMetadataBytes);
1592
+ }
1593
+ releaseCompletedChunkAccounting(stateArg, chunkArg) {
1594
+ if (!chunkArg.accountingOwned)
1595
+ return;
1596
+ chunkArg.accountingOwned = false;
1597
+ this.releaseServerRetainedBytes(stateArg.connection, chunkArg.payload.byteLength);
1598
+ }
1599
+ releaseOutboundAccounting(outboundArg) {
1600
+ if (!outboundArg.accountingOwned)
1601
+ return;
1602
+ outboundArg.accountingOwned = false;
1603
+ this.releaseServerRetainedBytes(outboundArg.connection, outboundArg.frame.data.byteLength);
1604
+ }
1605
+ reserveStreamSlot(connectionArg) {
1606
+ if (connectionArg.registrations.size + connectionArg.streams.size
1607
+ >= VIRTUAL_STREAM_MAX_STREAMS_PER_CONNECTION) {
1608
+ throw new TypedSocketVirtualStreamError(`virtual-stream-v1 permits at most ${VIRTUAL_STREAM_MAX_STREAMS_PER_CONNECTION} streams per connection`);
1609
+ }
1610
+ if (this.side === 'server') {
1611
+ let total = 0;
1612
+ for (const connection of this.serverConnections.values()) {
1613
+ total += connection.registrations.size + connection.streams.size;
1614
+ }
1615
+ if (total >= VIRTUAL_STREAM_MAX_STREAMS_PER_SERVER) {
1616
+ throw new TypedSocketVirtualStreamError(`virtual-stream-v1 permits at most ${VIRTUAL_STREAM_MAX_STREAMS_PER_SERVER} server streams`);
1617
+ }
1618
+ }
1619
+ }
1620
+ resolveConnection(targetArg) {
1621
+ const connection = this.resolveConnectionForInspection(targetArg);
1622
+ if (!connection || connection.closed) {
1623
+ throw new TypedSocketVirtualStreamError('No exact virtual-stream-v1 connection is available');
1624
+ }
1625
+ return connection;
1626
+ }
1627
+ resolveConnectionForInspection(targetArg) {
1628
+ if (this.side === 'client') {
1629
+ if (targetArg) {
1630
+ throw new TypedSocketVirtualStreamError('Client VirtualStream APIs do not accept peer targets');
1631
+ }
1632
+ return this.currentClientConnection;
1633
+ }
1634
+ if (!targetArg)
1635
+ return undefined;
1636
+ return this.serverConnections.get(asPeer(targetArg));
1637
+ }
1638
+ requireReadyConnection(connectionArg) {
1639
+ if (!connectionArg.handshakeReady || connectionArg.closed) {
1640
+ throw new TypedSocketVirtualStreamError('virtual-stream-v1 requires a handshake-ready physical peer');
1641
+ }
1642
+ if (connectionArg.binding.side === 'server'
1643
+ && connectionArg.binding.peer.transportOwner !== this.webSocketTransportOwner) {
1644
+ throw new TypedSocketVirtualStreamError('SmartServe peer is not owned by this TypedSocket');
1645
+ }
1646
+ }
1647
+ assertEndpointOwned(stateArg) {
1648
+ const connection = stateArg.connection;
1649
+ if (connection.closed
1650
+ || stateArg.status === 'closed'
1651
+ || (connection.registrations.get(stateArg.descriptor.streamId) !== stateArg
1652
+ && connection.streams.get(stateArg.descriptor.streamId) !== stateArg)
1653
+ || (connection.binding.side === 'client'
1654
+ ? this.currentClientConnection !== connection
1655
+ : this.serverConnections.get(connection.binding.peer) !== connection
1656
+ || connection.binding.peer.transportOwner !== this.webSocketTransportOwner)) {
1657
+ throw new TypedSocketVirtualStreamError('VirtualStream physical peer authority changed');
1658
+ }
1659
+ }
1660
+ assertEndpointOpen(stateArg, directionArg) {
1661
+ this.assertEndpointOwned(stateArg);
1662
+ if (stateArg.status !== 'open' || stateArg.direction !== directionArg) {
1663
+ throw stateArg.closeError ?? new TypedSocketVirtualStreamError('VirtualStream endpoint is not open');
1664
+ }
1665
+ }
1666
+ validateDescriptor(descriptorArg) {
1667
+ if (!descriptorArg
1668
+ || typeof descriptorArg !== 'object'
1669
+ || descriptorArg._isVirtualStream !== true
1670
+ || descriptorArg.protocol !== VIRTUAL_STREAM_PROTOCOL
1671
+ || (descriptorArg.creatorDirection !== 'send' && descriptorArg.creatorDirection !== 'receive')) {
1672
+ throw new VirtualStreamProtocolError('descriptor protocol or direction is invalid');
1673
+ }
1674
+ const streamId = normalizeVirtualStreamId(descriptorArg.streamId);
1675
+ const contentType = normalizeVirtualStreamContentType(descriptorArg.contentType);
1676
+ const integrity = normalizeVirtualStreamIntegrity(descriptorArg.integrity);
1677
+ const transport = descriptorArg.transport;
1678
+ if (!isPlainRecord(transport)
1679
+ || !hasExactEnumerableDataKeys(transport, ['capability', 'expiresAt'])) {
1680
+ throw new VirtualStreamProtocolError('descriptor transport shape is invalid');
1681
+ }
1682
+ const expiresAt = getOwnEnumerableData(transport, 'expiresAt');
1683
+ if (typeof expiresAt !== 'number' || !Number.isSafeInteger(expiresAt) || expiresAt <= 0) {
1684
+ throw new VirtualStreamProtocolError('descriptor expiresAt is invalid');
1685
+ }
1686
+ return Object.freeze({
1687
+ _isVirtualStream: true,
1688
+ protocol: VIRTUAL_STREAM_PROTOCOL,
1689
+ streamId,
1690
+ creatorDirection: descriptorArg.creatorDirection,
1691
+ ...(contentType === undefined ? {} : { contentType }),
1692
+ ...(integrity === undefined ? {} : { integrity }),
1693
+ transport: Object.freeze({
1694
+ capability: normalizeVirtualStreamCapability(getOwnEnumerableData(transport, 'capability')),
1695
+ expiresAt,
1696
+ }),
1697
+ });
1698
+ }
1699
+ refreshProgressTimer(stateArg) {
1700
+ this.clearEndpointTimer(stateArg);
1701
+ if (stateArg.status === 'closed')
1702
+ return;
1703
+ stateArg.timer = this.runtime.setTimer(() => {
1704
+ void this.failEndpoint(stateArg, new TypedSocketVirtualStreamError('VirtualStream progress timed out'), VIRTUAL_STREAM_RESET_CODES.TIMEOUT);
1705
+ }, VIRTUAL_STREAM_PROGRESS_TIMEOUT_MS);
1706
+ }
1707
+ clearEndpointTimer(stateArg) {
1708
+ if (stateArg.timer !== undefined)
1709
+ this.runtime.clearTimer(stateArg.timer);
1710
+ stateArg.timer = undefined;
1711
+ }
1712
+ clearConnectionTimer(connectionArg, keyArg) {
1713
+ const timer = connectionArg[keyArg];
1714
+ if (timer !== undefined)
1715
+ this.runtime.clearTimer(timer);
1716
+ connectionArg[keyArg] = undefined;
1717
+ }
1718
+ wakeReceivers(stateArg, errorArg) {
1719
+ for (const waiter of [...stateArg.receiveWaiters]) {
1720
+ if (errorArg)
1721
+ waiter.reject(errorArg);
1722
+ else
1723
+ waiter.resolve();
1724
+ }
1725
+ stateArg.receiveWaiters.clear();
1726
+ }
1727
+ async failEndpoint(stateArg, reasonArg, resetCodeArg, sendResetArg = true) {
1728
+ if (stateArg.status === 'closed')
1729
+ return await stateArg.closedDeferred.promise;
1730
+ const shouldReset = sendResetArg
1731
+ && stateArg.status !== 'registered'
1732
+ && stateArg.status !== 'staged'
1733
+ && !stateArg.connection.closed;
1734
+ const error = asError(reasonArg, 'VirtualStream closed');
1735
+ this.cleanupEndpoint(stateArg, error, true, true, false);
1736
+ if (shouldReset) {
1737
+ try {
1738
+ await this.sendReset(stateArg.connection, stateArg.descriptor.streamId, resetCodeArg, 'VirtualStream closed');
1739
+ }
1740
+ catch { }
1741
+ }
1742
+ stateArg.closedDeferred.resolve();
1743
+ }
1744
+ cleanupEndpoint(stateArg, reasonArg, rejectArg = true, addTombstoneArg = true, resolveClosedArg = true) {
1745
+ if (stateArg.status === 'closed')
1746
+ return;
1747
+ const wasActivated = stateArg.status !== 'registered' && stateArg.status !== 'staged';
1748
+ stateArg.status = 'closed';
1749
+ this.clearEndpointTimer(stateArg);
1750
+ for (const controller of stateArg.revalidationControllers) {
1751
+ controller.abort(new TypedSocketVirtualStreamError('VirtualStream closed during revalidation'));
1752
+ }
1753
+ this.removeQueuedFramesForStream(stateArg.connection, stateArg.descriptor.streamId, reasonArg);
1754
+ stateArg.connection.registrations.delete(stateArg.descriptor.streamId);
1755
+ stateArg.connection.streams.delete(stateArg.descriptor.streamId);
1756
+ for (const admission of [...stateArg.admissions]) {
1757
+ this.releaseAdmission(stateArg, admission);
1758
+ }
1759
+ for (const completed of stateArg.completedChunks.splice(0)) {
1760
+ stateArg.connection.queuedChunks--;
1761
+ stateArg.connection.queuedBytes -= completed.payload.byteLength;
1762
+ this.releaseCompletedChunkAccounting(stateArg, completed);
1763
+ }
1764
+ if (stateArg.deliveringChunk) {
1765
+ this.releaseCompletedChunkAccounting(stateArg, stateArg.deliveringChunk);
1766
+ stateArg.deliveringChunk = undefined;
1767
+ }
1768
+ if (stateArg.reassembly?.accountingOwned) {
1769
+ stateArg.reassembly.accountingOwned = false;
1770
+ stateArg.connection.queuedChunks--;
1771
+ stateArg.connection.queuedBytes -= stateArg.reassembly.payload.byteLength;
1772
+ this.releaseServerRetainedBytes(stateArg.connection, stateArg.reassembly.payload.byteLength);
1773
+ }
1774
+ stateArg.reassembly = undefined;
1775
+ if (stateArg.connection.queuedChunks < 0)
1776
+ stateArg.connection.queuedChunks = 0;
1777
+ if (stateArg.connection.queuedBytes < 0)
1778
+ stateArg.connection.queuedBytes = 0;
1779
+ const error = asError(reasonArg, 'VirtualStream closed');
1780
+ stateArg.closeError = error;
1781
+ stateArg.awaitingChunkAck?.deferred.reject(error);
1782
+ stateArg.awaitingChunkAck = undefined;
1783
+ this.wakeReceivers(stateArg, rejectArg ? error : undefined);
1784
+ this.releaseEndpointMetadataAccounting(stateArg);
1785
+ if (addTombstoneArg && wasActivated)
1786
+ this.addTombstone(stateArg.connection, stateArg.descriptor.streamId);
1787
+ if (rejectArg) {
1788
+ stateArg.openedDeferred.reject(error);
1789
+ stateArg.completionDeferred.reject(error);
1790
+ }
1791
+ if (resolveClosedArg)
1792
+ stateArg.closedDeferred.resolve();
1793
+ }
1794
+ addTombstone(connectionArg, streamIdArg) {
1795
+ this.pruneTombstones(connectionArg);
1796
+ const now = this.runtime.now();
1797
+ const expiresAt = Number.isSafeInteger(now) && now >= 0
1798
+ ? Math.min(Number.MAX_SAFE_INTEGER, now + VIRTUAL_STREAM_TOMBSTONE_RETENTION_MS)
1799
+ : Number.MAX_SAFE_INTEGER;
1800
+ const existing = connectionArg.tombstones.get(streamIdArg);
1801
+ if (existing) {
1802
+ connectionArg.tombstones.set(streamIdArg, Object.freeze({
1803
+ streamId: streamIdArg,
1804
+ expiresAt,
1805
+ retainedBytes: existing.retainedBytes,
1806
+ }));
1807
+ return;
1808
+ }
1809
+ const retainedBytes = virtualStreamTextEncoder.encode(streamIdArg).byteLength;
1810
+ try {
1811
+ this.reserveServerRetainedBytes(connectionArg, retainedBytes);
1812
+ }
1813
+ catch {
1814
+ this.closeConnection(connectionArg, 1013, 'virtual-stream-v1 replay accounting capacity exhausted');
1815
+ return;
1816
+ }
1817
+ const evicted = [];
1818
+ try {
1819
+ while (connectionArg.tombstones.size >= VIRTUAL_STREAM_MAX_TOMBSTONES_PER_CONNECTION) {
1820
+ const oldest = connectionArg.tombstones.keys().next();
1821
+ if (oldest.done)
1822
+ break;
1823
+ const tombstone = connectionArg.tombstones.get(oldest.value);
1824
+ connectionArg.tombstones.delete(oldest.value);
1825
+ if (tombstone)
1826
+ evicted.push(tombstone);
1827
+ }
1828
+ connectionArg.tombstones.set(streamIdArg, Object.freeze({
1829
+ streamId: streamIdArg,
1830
+ expiresAt,
1831
+ retainedBytes,
1832
+ }));
1833
+ }
1834
+ catch (errorArg) {
1835
+ for (const tombstone of evicted) {
1836
+ connectionArg.tombstones.set(tombstone.streamId, tombstone);
1837
+ }
1838
+ this.releaseServerRetainedBytes(connectionArg, retainedBytes);
1839
+ this.closeConnection(connectionArg, 1011, 'virtual-stream-v1 replay accounting failed');
1840
+ return;
1841
+ }
1842
+ for (const tombstone of evicted) {
1843
+ this.releaseServerRetainedBytes(connectionArg, tombstone.retainedBytes);
1844
+ }
1845
+ }
1846
+ pruneTombstones(connectionArg) {
1847
+ const now = this.runtime.now();
1848
+ for (const [streamId, tombstone] of connectionArg.tombstones) {
1849
+ if (tombstone.expiresAt <= now)
1850
+ this.deleteTombstone(connectionArg, streamId);
1851
+ }
1852
+ }
1853
+ deleteTombstone(connectionArg, streamIdArg) {
1854
+ const tombstone = connectionArg.tombstones.get(streamIdArg);
1855
+ if (!tombstone)
1856
+ return;
1857
+ connectionArg.tombstones.delete(streamIdArg);
1858
+ this.releaseServerRetainedBytes(connectionArg, tombstone.retainedBytes);
1859
+ }
1860
+ sendReset(connectionArg, streamIdArg, codeArg, reasonArg) {
1861
+ if (connectionArg.closed)
1862
+ return Promise.resolve();
1863
+ return this.enqueueFrame(connectionArg, {
1864
+ type: VIRTUAL_STREAM_FRAME_TYPES.RESET,
1865
+ streamId: streamIdArg,
1866
+ code: codeArg,
1867
+ reason: reasonArg,
1868
+ });
1869
+ }
1870
+ enqueueFrame(connectionArg, frameArg) {
1871
+ if (connectionArg.closed) {
1872
+ return Promise.reject(new TypedSocketVirtualStreamError('VirtualStream connection is closed'));
1873
+ }
1874
+ const queued = connectionArg.controlQueue.length
1875
+ + connectionArg.dataQueue.length
1876
+ + (connectionArg.serverInflight ? 1 : 0);
1877
+ if (queued >= VIRTUAL_STREAM_MAX_OUTBOUND_FRAMES_PER_CONNECTION) {
1878
+ return Promise.reject(new TypedSocketVirtualStreamError('VirtualStream outbound frame capacity exhausted'));
1879
+ }
1880
+ let retainedBytes;
1881
+ try {
1882
+ retainedBytes = getVirtualStreamFrameByteLength(frameArg);
1883
+ this.reserveServerRetainedBytes(connectionArg, retainedBytes);
1884
+ }
1885
+ catch (errorArg) {
1886
+ return Promise.reject(errorArg);
1887
+ }
1888
+ let outbound;
1889
+ let queue;
1890
+ try {
1891
+ const encodedFrame = encodeVirtualStreamFrame(frameArg);
1892
+ if (encodedFrame.byteLength !== retainedBytes) {
1893
+ throw new VirtualStreamProtocolError('virtual-stream-v1 frame accounting mismatch');
1894
+ }
1895
+ outbound = {
1896
+ connection: connectionArg,
1897
+ frame: Object.freeze({ type: 'binary', data: encodedFrame }),
1898
+ streamId: frameArg.streamId,
1899
+ settlement: createDeferred(),
1900
+ accountingOwned: true,
1901
+ };
1902
+ outbound.timer = this.runtime.setTimer(() => {
1903
+ this.failConnection(connectionArg, new TypedSocketVirtualStreamError('VirtualStream outbound frame settlement timed out'), true);
1904
+ }, VIRTUAL_STREAM_PROGRESS_TIMEOUT_MS);
1905
+ queue = frameArg.type === VIRTUAL_STREAM_FRAME_TYPES.CHUNK
1906
+ ? connectionArg.dataQueue
1907
+ : connectionArg.controlQueue;
1908
+ queue.push(outbound);
1909
+ this.wakeOutbound(connectionArg);
1910
+ return outbound.settlement.promise;
1911
+ }
1912
+ catch (errorArg) {
1913
+ if (outbound) {
1914
+ const queueIndex = queue?.indexOf(outbound) ?? -1;
1915
+ if (queue && queueIndex >= 0)
1916
+ queue.splice(queueIndex, 1);
1917
+ this.settleOutbound(outbound, errorArg);
1918
+ }
1919
+ else {
1920
+ this.releaseServerRetainedBytes(connectionArg, retainedBytes);
1921
+ }
1922
+ return Promise.reject(errorArg);
1923
+ }
1924
+ }
1925
+ wakeOutbound(connectionArg) {
1926
+ if (connectionArg.closed)
1927
+ return;
1928
+ if (connectionArg.binding.side === 'server') {
1929
+ connectionArg.binding.peer.rawFrameScheduler?.wake();
1930
+ return;
1931
+ }
1932
+ if (connectionArg.clientTurnScheduled)
1933
+ return;
1934
+ connectionArg.clientTurnScheduled = true;
1935
+ this.runtime.scheduleMacrotask(() => this.runClientOutboundTurn(connectionArg));
1936
+ }
1937
+ runClientOutboundTurn(connectionArg) {
1938
+ connectionArg.clientTurnScheduled = false;
1939
+ if (connectionArg.closed || connectionArg.binding.side !== 'client')
1940
+ return;
1941
+ const outbound = connectionArg.controlQueue.shift() ?? connectionArg.dataQueue.shift();
1942
+ if (!outbound)
1943
+ return;
1944
+ try {
1945
+ connectionArg.binding.webSocket.send(outbound.frame.data);
1946
+ this.settleOutbound(outbound, undefined);
1947
+ }
1948
+ catch (errorArg) {
1949
+ this.settleOutbound(outbound, errorArg);
1950
+ this.failConnection(connectionArg, errorArg, true);
1951
+ return;
1952
+ }
1953
+ if (connectionArg.controlQueue.length > 0 || connectionArg.dataQueue.length > 0) {
1954
+ this.wakeOutbound(connectionArg);
1955
+ }
1956
+ }
1957
+ pullServerBinaryFrame(peerArg) {
1958
+ const connection = this.serverConnections.get(peerArg);
1959
+ if (!connection
1960
+ || connection.closed
1961
+ || connection.serverInflight
1962
+ || peerArg.transportOwner !== this.webSocketTransportOwner)
1963
+ return undefined;
1964
+ const outbound = connection.controlQueue.shift() ?? connection.dataQueue.shift();
1965
+ if (!outbound)
1966
+ return undefined;
1967
+ connection.serverInflight = outbound;
1968
+ return outbound.frame;
1969
+ }
1970
+ settleServerOutboundFrame(peerArg, frameArg, settlementArg) {
1971
+ const connection = this.serverSettlementConnections.get(peerArg);
1972
+ const outbound = connection?.serverInflight;
1973
+ if (!connection || !outbound || outbound.frame !== frameArg)
1974
+ return;
1975
+ connection.serverInflight = undefined;
1976
+ if (settlementArg.status === 'sent' || settlementArg.status === 'accepted') {
1977
+ this.settleOutbound(outbound, undefined);
1978
+ if (connection.closed) {
1979
+ if (this.serverSettlementConnections.get(peerArg) === connection) {
1980
+ this.serverSettlementConnections.delete(peerArg);
1981
+ }
1982
+ return;
1983
+ }
1984
+ if (connection.controlQueue.length > 0 || connection.dataQueue.length > 0) {
1985
+ connection.binding.side === 'server' && connection.binding.peer.rawFrameScheduler?.wake();
1986
+ }
1987
+ return;
1988
+ }
1989
+ const error = settlementArg.error ?? new TypedSocketVirtualStreamError('VirtualStream frame send failed');
1990
+ this.settleOutbound(outbound, error);
1991
+ if (connection.closed) {
1992
+ if (this.serverSettlementConnections.get(peerArg) === connection) {
1993
+ this.serverSettlementConnections.delete(peerArg);
1994
+ }
1995
+ return;
1996
+ }
1997
+ this.failConnection(connection, error, true);
1998
+ }
1999
+ settleOutbound(outboundArg, errorArg) {
2000
+ if (outboundArg.timer !== undefined)
2001
+ this.runtime.clearTimer(outboundArg.timer);
2002
+ outboundArg.timer = undefined;
2003
+ this.releaseOutboundAccounting(outboundArg);
2004
+ if (errorArg)
2005
+ outboundArg.settlement.reject(errorArg);
2006
+ else
2007
+ outboundArg.settlement.resolve();
2008
+ }
2009
+ rejectInflightOutbound(outboundArg, errorArg) {
2010
+ outboundArg.settlement.reject(errorArg);
2011
+ }
2012
+ removeQueuedFramesForStream(connectionArg, streamIdArg, reasonArg) {
2013
+ const error = asError(reasonArg, 'VirtualStream closed');
2014
+ for (const queue of [connectionArg.controlQueue, connectionArg.dataQueue]) {
2015
+ for (let index = queue.length - 1; index >= 0; index--) {
2016
+ if (queue[index].streamId !== streamIdArg)
2017
+ continue;
2018
+ const [outbound] = queue.splice(index, 1);
2019
+ this.settleOutbound(outbound, error);
2020
+ }
2021
+ }
2022
+ if (connectionArg.serverInflight?.streamId === streamIdArg) {
2023
+ this.rejectInflightOutbound(connectionArg.serverInflight, error);
2024
+ }
2025
+ }
2026
+ failConnection(connectionArg, reasonArg, closeArg) {
2027
+ if (connectionArg.closed)
2028
+ return;
2029
+ connectionArg.closed = true;
2030
+ connectionArg.handshakePending = false;
2031
+ connectionArg.handshakeReady = false;
2032
+ connectionArg.clientTurnScheduled = false;
2033
+ this.clearConnectionTimer(connectionArg, 'handshakeTimer');
2034
+ const error = asError(reasonArg, 'VirtualStream connection failed');
2035
+ for (const controller of connectionArg.revalidationControllers)
2036
+ controller.abort(error);
2037
+ for (const state of [
2038
+ ...connectionArg.registrations.values(),
2039
+ ...connectionArg.streams.values(),
2040
+ ]) {
2041
+ this.cleanupEndpoint(state, error, true, false);
2042
+ }
2043
+ for (const queue of [connectionArg.controlQueue, connectionArg.dataQueue]) {
2044
+ for (const outbound of queue.splice(0))
2045
+ this.settleOutbound(outbound, error);
2046
+ }
2047
+ if (connectionArg.serverInflight) {
2048
+ this.rejectInflightOutbound(connectionArg.serverInflight, error);
2049
+ }
2050
+ const retainedConnectionBytes = connectionArg.rawQueueBytes
2051
+ + connectionArg.processingRawBytes
2052
+ + connectionArg.arrivalStampBytes;
2053
+ connectionArg.rawQueue.length = 0;
2054
+ connectionArg.rawQueueBytes = 0;
2055
+ connectionArg.processingRawBytes = 0;
2056
+ connectionArg.queuedChunks = 0;
2057
+ connectionArg.queuedBytes = 0;
2058
+ connectionArg.arrivalStamps.length = 0;
2059
+ connectionArg.arrivalStampBytes = 0;
2060
+ this.releaseServerRetainedBytes(connectionArg, retainedConnectionBytes);
2061
+ for (const streamId of [...connectionArg.tombstones.keys()]) {
2062
+ this.deleteTombstone(connectionArg, streamId);
2063
+ }
2064
+ connectionArg.authorizedHandshake = undefined;
2065
+ connectionArg.pendingHandshake = undefined;
2066
+ if (connectionArg.binding.side === 'server') {
2067
+ if (this.serverConnections.get(connectionArg.binding.peer) === connectionArg) {
2068
+ this.serverConnections.delete(connectionArg.binding.peer);
2069
+ }
2070
+ if (!connectionArg.serverInflight
2071
+ && this.serverSettlementConnections.get(connectionArg.binding.peer) === connectionArg) {
2072
+ this.serverSettlementConnections.delete(connectionArg.binding.peer);
2073
+ }
2074
+ }
2075
+ if (closeArg)
2076
+ this.closeConnectionTransport(connectionArg, 1011, 'virtual-stream-v1 connection failure');
2077
+ }
2078
+ closeConnection(connectionArg, codeArg, reasonArg) {
2079
+ this.emitDiagnostic({
2080
+ kind: 'connectionClosed',
2081
+ side: connectionArg.binding.side,
2082
+ scope: 'virtualStream',
2083
+ closeCode: codeArg,
2084
+ reason: reasonArg,
2085
+ });
2086
+ this.closeConnectionTransport(connectionArg, codeArg, reasonArg);
2087
+ this.failConnection(connectionArg, new TypedSocketVirtualStreamError(reasonArg), false);
2088
+ }
2089
+ closeConnectionTransport(connectionArg, codeArg, reasonArg) {
2090
+ try {
2091
+ if (connectionArg.binding.side === 'client') {
2092
+ connectionArg.binding.webSocket.close(toClientWebSocketCloseCode(codeArg), reasonArg);
2093
+ }
2094
+ else {
2095
+ connectionArg.binding.peer.close(codeArg, reasonArg);
2096
+ }
2097
+ }
2098
+ catch { }
2099
+ }
2100
+ emitDiagnostic(eventArg) {
2101
+ try {
2102
+ this.onDiagnostic?.(eventArg);
2103
+ }
2104
+ catch { }
2105
+ }
2106
+ }
2107
+ /** Internal bridge used only by the TypedSocket server authorization facade. */
2108
+ export function createAuthorizedServerVirtualStreamRegistration(managerArg, peerArg, optionsArg) {
2109
+ return managerArg[createAuthorizedServerRegistrationSymbol](peerArg, optionsArg);
2110
+ }
2111
+ /** Internal bridge used only by the TypedSocket server readiness facade. */
2112
+ export function setServerHandshakeReadyCallback(managerArg, callbackArg) {
2113
+ managerArg[setServerHandshakeReadyCallbackSymbol](callbackArg);
2114
+ }
2115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52aXJ0dWFsc3RyZWFtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudmlydHVhbHN0cmVhbW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLGdDQUFnQyxFQUNoQyx5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLG9DQUFvQyxFQUNwQywwQkFBMEIsRUFDMUIscURBQXFELEVBQ3JELGdEQUFnRCxFQUNoRCx5Q0FBeUMsRUFDekMsdUNBQXVDLEVBQ3ZDLHlDQUF5QyxFQUN6QyxzQ0FBc0MsRUFDdEMsaURBQWlELEVBQ2pELDhDQUE4QyxFQUM5QywwQ0FBMEMsRUFDMUMsK0NBQStDLEVBQy9DLDJDQUEyQyxFQUMzQyxrQ0FBa0MsRUFDbEMsbUNBQW1DLEVBQ25DLCtDQUErQyxFQUMvQywyQ0FBMkMsRUFDM0MsNENBQTRDLEVBQzVDLHlDQUF5QyxFQUN6QyxxQ0FBcUMsRUFDckMsNENBQTRDLEVBQzVDLGtDQUFrQyxFQUNsQyx1QkFBdUIsRUFDdkIsc0NBQXNDLEVBQ3RDLDBCQUEwQixFQUMxQixxQ0FBcUMsR0FDdEMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1DQUFtQyxFQUNuQyx3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLCtCQUErQixFQUMvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEVBQ2pDLHdCQUF3QixFQUN4QiwrQkFBK0IsRUFDL0IsMEJBQTBCLEdBQzNCLE1BQU0saUNBQWlDLENBQUM7QUFjekMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPcEUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ25ELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDakQs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