@voxevolv/client 0.3.11 → 0.3.14

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.
@@ -22339,11 +22339,13 @@ class RTCEngine extends eventsExports.EventEmitter {
22339
22339
  });
22340
22340
  }
22341
22341
  /* @internal */
22342
- sendDataPacket(packet, kind) {
22342
+ sendDataPacket(packet, kind, signal) {
22343
22343
  return __awaiter(this, void 0, void 0, function* () {
22344
22344
  var _a, _b;
22345
+ signal?.throwIfAborted();
22345
22346
  // make sure we do have a data connection
22346
22347
  yield this.ensurePublisherConnected(kind);
22348
+ signal?.throwIfAborted();
22347
22349
  if (this.e2eeManager && this.e2eeManager.isDataChannelEncryptionEnabled) {
22348
22350
  const encryptablePacket = asEncryptablePacket(packet);
22349
22351
  if (encryptablePacket) {
@@ -22361,8 +22363,10 @@ class RTCEngine extends eventsExports.EventEmitter {
22361
22363
  // Allocate sequence numbers only after the final asynchronous wait.
22362
22364
  const reliableChannel = kind === DataChannelKind.RELIABLE ? this.dataChannelForKind(kind) : undefined;
22363
22365
  if (reliableChannel) {
22364
- yield this.waitForBufferStatusLow(kind);
22366
+ yield this.waitForBufferStatusLow(kind, signal);
22365
22367
  }
22368
+ // No awaits between cancellation, sequence allocation, and committing the send.
22369
+ signal?.throwIfAborted();
22366
22370
  if (kind === DataChannelKind.RELIABLE) {
22367
22371
  packet.sequence = this.reliableDataSequence;
22368
22372
  this.reliableDataSequence += 1;
@@ -22446,7 +22450,46 @@ class RTCEngine extends eventsExports.EventEmitter {
22446
22450
  this.updateAndEmitDCBufferStatus(DataChannelKind.RELIABLE);
22447
22451
  });
22448
22452
  }
22449
- waitForBufferStatusLow(kind) {
22453
+ waitForBufferStatusLow(kind, signal) {
22454
+ if (signal) {
22455
+ return new Promise((resolve, reject) => {
22456
+ if (signal.aborted) {
22457
+ reject(signal.reason);
22458
+ return;
22459
+ }
22460
+ if (this.isClosed) {
22461
+ reject(new UnexpectedConnectionState('engine closed'));
22462
+ return;
22463
+ }
22464
+ const dc = this.dataChannelForKind(kind);
22465
+ if (!dc) {
22466
+ reject(new UnexpectedConnectionState('DataChannel not found'));
22467
+ return;
22468
+ }
22469
+ if (this.isBufferStatusLow(kind)) {
22470
+ resolve();
22471
+ return;
22472
+ }
22473
+ const cleanup = () => {
22474
+ dc.removeEventListener('bufferedamountlow', onDrained);
22475
+ signal.removeEventListener('abort', onAborted);
22476
+ };
22477
+ const onDrained = () => {
22478
+ cleanup();
22479
+ resolve();
22480
+ };
22481
+ const onAborted = () => {
22482
+ cleanup();
22483
+ reject(signal.reason);
22484
+ };
22485
+ dc.addEventListener('bufferedamountlow', onDrained, { once: true });
22486
+ signal.addEventListener('abort', onAborted, { once: true });
22487
+ this.bufferStatusLowClosingFuture.promise.catch(error => {
22488
+ cleanup();
22489
+ reject(error);
22490
+ });
22491
+ });
22492
+ }
22450
22493
  return __awaiter(this, void 0, void 0, function* () {
22451
22494
  return new TypedPromise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
22452
22495
  if (this.isClosed) {
@@ -23530,7 +23573,7 @@ class OutgoingDataStreamManager {
23530
23573
  value: header
23531
23574
  }
23532
23575
  });
23533
- yield this.engine.sendDataPacket(packet, DataChannelKind.RELIABLE);
23576
+ yield this.engine.sendDataPacket(packet, DataChannelKind.RELIABLE, options?.signal);
23534
23577
  let chunkId = 0;
23535
23578
  const engine = this.engine;
23536
23579
  const writableStream = new WritableStream({
@@ -23550,7 +23593,7 @@ class OutgoingDataStreamManager {
23550
23593
  value: chunk
23551
23594
  }
23552
23595
  });
23553
- yield engine.sendDataPacket(chunkPacket, DataChannelKind.RELIABLE);
23596
+ yield engine.sendDataPacket(chunkPacket, DataChannelKind.RELIABLE, options?.signal);
23554
23597
  chunkId += 1;
23555
23598
  }
23556
23599
  });
@@ -23567,7 +23610,7 @@ class OutgoingDataStreamManager {
23567
23610
  value: trailer
23568
23611
  }
23569
23612
  });
23570
- yield engine.sendDataPacket(trailerPacket, DataChannelKind.RELIABLE);
23613
+ yield engine.sendDataPacket(trailerPacket, DataChannelKind.RELIABLE, options?.signal);
23571
23614
  });
23572
23615
  },
23573
23616
  abort(err) {
@@ -23576,10 +23619,21 @@ class OutgoingDataStreamManager {
23576
23619
  }
23577
23620
  });
23578
23621
  let onEngineClose = () => __awaiter(this, void 0, void 0, function* () {
23579
- yield writer.close();
23622
+ try {
23623
+ yield writer.close();
23624
+ } catch (error) {
23625
+ if (!options?.signal?.aborted) throw error;
23626
+ }
23580
23627
  });
23628
+ const cleanup = () => {
23629
+ engine.off(EngineEvent.Closing, onEngineClose);
23630
+ options?.signal?.removeEventListener('abort', cleanup);
23631
+ };
23581
23632
  engine.once(EngineEvent.Closing, onEngineClose);
23582
- const writer = new TextStreamWriter(writableStream, info, () => this.engine.off(EngineEvent.Closing, onEngineClose));
23633
+ const writer = new TextStreamWriter(writableStream, info, cleanup);
23634
+ // A cancelled write errors the WritableStream; do not close it again later.
23635
+ options?.signal?.addEventListener('abort', cleanup, { once: true });
23636
+ if (options?.signal?.aborted) cleanup();
23583
23637
  return writer;
23584
23638
  });
23585
23639
  }
@@ -23653,7 +23707,7 @@ class OutgoingDataStreamManager {
23653
23707
  value: header
23654
23708
  }
23655
23709
  });
23656
- yield this.engine.sendDataPacket(packet, DataChannelKind.RELIABLE);
23710
+ yield this.engine.sendDataPacket(packet, DataChannelKind.RELIABLE, options?.signal);
23657
23711
  let chunkId = 0;
23658
23712
  const writeMutex = new _();
23659
23713
  const engine = this.engine;
@@ -23677,7 +23731,7 @@ class OutgoingDataStreamManager {
23677
23731
  })
23678
23732
  }
23679
23733
  });
23680
- yield engine.sendDataPacket(chunkPacket, DataChannelKind.RELIABLE);
23734
+ yield engine.sendDataPacket(chunkPacket, DataChannelKind.RELIABLE, options?.signal);
23681
23735
  chunkId += 1;
23682
23736
  byteOffset += subChunk.byteLength;
23683
23737
  }
@@ -23698,7 +23752,7 @@ class OutgoingDataStreamManager {
23698
23752
  value: trailer
23699
23753
  }
23700
23754
  });
23701
- yield engine.sendDataPacket(trailerPacket, DataChannelKind.RELIABLE);
23755
+ yield engine.sendDataPacket(trailerPacket, DataChannelKind.RELIABLE, options?.signal);
23702
23756
  });
23703
23757
  },
23704
23758
  abort(err) {
@@ -28779,7 +28833,7 @@ class Participant extends eventsExports.EventEmitter {
28779
28833
  value: userPacket
28780
28834
  }
28781
28835
  });
28782
- yield _this4.engine.sendDataPacket(packet, kind);
28836
+ yield _this4.engine.sendDataPacket(packet, kind, options.signal);
28783
28837
  }();
28784
28838
  });
28785
28839
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxevolv/client",
3
- "version": "0.3.11",
3
+ "version": "0.3.14",
4
4
  "description": "Browser SDK for VoxEvolv multimodal realtime sessions",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,7 +42,7 @@
42
42
  "scripts": {
43
43
  "build": "tsc -p tsconfig.json && node scripts/build-browser.mjs",
44
44
  "typecheck": "tsc -p tsconfig.json --noEmit",
45
- "test": "npm run build && node scripts/protocol-smoke.mjs && node --test scripts/context-delivery.test.mjs scripts/diagnostic-delivery.test.mjs scripts/startup-recovery.test.mjs scripts/connection-lifecycle.test.mjs scripts/audio-recovery.test.mjs scripts/reliable-sequence.test.mjs && node scripts/transcript-smoke.mjs",
45
+ "test": "npm run build && node scripts/protocol-smoke.mjs && node --test scripts/context-delivery.test.mjs scripts/context-cancellation.test.mjs scripts/diagnostic-delivery.test.mjs scripts/startup-recovery.test.mjs scripts/connection-lifecycle.test.mjs scripts/audio-recovery.test.mjs scripts/recovery-progress.test.mjs scripts/reliable-sequence.test.mjs && node scripts/transcript-smoke.mjs",
46
46
  "pack:check": "npm run build && npm pack --dry-run"
47
47
  },
48
48
  "dependencies": {