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