livekit-client 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. package/dist/livekit-client.e2ee.worker.js +1 -1
  2. package/dist/livekit-client.e2ee.worker.js.map +1 -1
  3. package/dist/livekit-client.e2ee.worker.mjs +52 -17
  4. package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
  5. package/dist/livekit-client.esm.mjs +69 -40
  6. package/dist/livekit-client.esm.mjs.map +1 -1
  7. package/dist/livekit-client.umd.js +1 -1
  8. package/dist/livekit-client.umd.js.map +1 -1
  9. package/dist/src/e2ee/KeyProvider.d.ts +1 -1
  10. package/dist/src/e2ee/KeyProvider.d.ts.map +1 -1
  11. package/dist/src/e2ee/worker/FrameCryptor.d.ts +1 -0
  12. package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
  13. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts +2 -2
  14. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -1
  15. package/dist/src/room/Room.d.ts +1 -0
  16. package/dist/src/room/Room.d.ts.map +1 -1
  17. package/dist/src/room/events.d.ts +5 -1
  18. package/dist/src/room/events.d.ts.map +1 -1
  19. package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
  20. package/dist/src/room/track/LocalTrack.d.ts +1 -0
  21. package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
  22. package/dist/src/room/track/Track.d.ts +2 -0
  23. package/dist/src/room/track/Track.d.ts.map +1 -1
  24. package/dist/ts4.2/src/e2ee/KeyProvider.d.ts +1 -1
  25. package/dist/ts4.2/src/e2ee/worker/FrameCryptor.d.ts +1 -0
  26. package/dist/ts4.2/src/e2ee/worker/ParticipantKeyHandler.d.ts +2 -2
  27. package/dist/ts4.2/src/room/Room.d.ts +1 -0
  28. package/dist/ts4.2/src/room/events.d.ts +5 -1
  29. package/dist/ts4.2/src/room/track/LocalTrack.d.ts +1 -0
  30. package/dist/ts4.2/src/room/track/Track.d.ts +2 -0
  31. package/package.json +1 -1
  32. package/src/e2ee/KeyProvider.ts +6 -1
  33. package/src/e2ee/worker/FrameCryptor.ts +26 -0
  34. package/src/e2ee/worker/ParticipantKeyHandler.ts +9 -5
  35. package/src/e2ee/worker/e2ee.worker.ts +16 -17
  36. package/src/room/Room.ts +18 -4
  37. package/src/room/events.ts +4 -0
  38. package/src/room/track/LocalAudioTrack.ts +1 -0
  39. package/src/room/track/LocalTrack.ts +42 -33
  40. package/src/room/track/Track.ts +2 -0
@@ -9980,6 +9980,9 @@ class BaseKeyProvider extends eventsExports.EventEmitter {
9980
9980
  participantIdentity,
9981
9981
  keyIndex
9982
9982
  };
9983
+ if (!this.options.sharedKey && !participantIdentity) {
9984
+ throw new Error('participant identity needs to be passed for encryption key if sharedKey option is false');
9985
+ }
9983
9986
  this.keyInfoMap.set("".concat(participantIdentity !== null && participantIdentity !== void 0 ? participantIdentity : 'shared', "-").concat(keyIndex !== null && keyIndex !== void 0 ? keyIndex : 0), keyInfo);
9984
9987
  this.emit(KeyProviderEvent.SetKey, keyInfo);
9985
9988
  }
@@ -10595,6 +10598,10 @@ var TrackEvent;
10595
10598
  * Fires on RemoteTrackPublication
10596
10599
  */
10597
10600
  TrackEvent["SubscriptionFailed"] = "subscriptionFailed";
10601
+ /**
10602
+ * @internal
10603
+ */
10604
+ TrackEvent["TrackProcessorUpdate"] = "trackProcessorUpdate";
10598
10605
  })(TrackEvent || (TrackEvent = {}));
10599
10606
 
10600
10607
  function r(r, e, n) {
@@ -10703,7 +10710,7 @@ function getMatch(exp, ua) {
10703
10710
  return match && match.length >= id && match[id] || '';
10704
10711
  }
10705
10712
 
10706
- var version$1 = "2.0.2";
10713
+ var version$1 = "2.0.3";
10707
10714
 
10708
10715
  const version = version$1;
10709
10716
  const protocolVersion = 12;
@@ -14206,6 +14213,7 @@ class LocalTrack extends Track {
14206
14213
  this.muteLock = new Mutex();
14207
14214
  this.pauseUpstreamLock = new Mutex();
14208
14215
  this.processorLock = new Mutex();
14216
+ this.restartLock = new Mutex();
14209
14217
  this.setMediaStreamTrack(mediaTrack, true);
14210
14218
  // added to satisfy TS compiler, constraints are synced with MediaStreamTrack
14211
14219
  this._constraints = mediaTrack.getConstraints();
@@ -14383,40 +14391,45 @@ class LocalTrack extends Track {
14383
14391
  }
14384
14392
  restart(constraints) {
14385
14393
  return __awaiter(this, void 0, void 0, function* () {
14386
- if (!constraints) {
14387
- constraints = this._constraints;
14388
- }
14389
- this.log.debug('restarting track with constraints', Object.assign(Object.assign({}, this.logContext), {
14390
- constraints
14391
- }));
14392
- const streamConstraints = {
14393
- audio: false,
14394
- video: false
14395
- };
14396
- if (this.kind === Track.Kind.Video) {
14397
- streamConstraints.video = constraints;
14398
- } else {
14399
- streamConstraints.audio = constraints;
14394
+ const unlock = yield this.restartLock.lock();
14395
+ try {
14396
+ if (!constraints) {
14397
+ constraints = this._constraints;
14398
+ }
14399
+ this.log.debug('restarting track with constraints', Object.assign(Object.assign({}, this.logContext), {
14400
+ constraints
14401
+ }));
14402
+ const streamConstraints = {
14403
+ audio: false,
14404
+ video: false
14405
+ };
14406
+ if (this.kind === Track.Kind.Video) {
14407
+ streamConstraints.video = constraints;
14408
+ } else {
14409
+ streamConstraints.audio = constraints;
14410
+ }
14411
+ // these steps are duplicated from setMediaStreamTrack because we must stop
14412
+ // the previous tracks before new tracks can be acquired
14413
+ this.attachedElements.forEach(el => {
14414
+ detachTrack(this.mediaStreamTrack, el);
14415
+ });
14416
+ this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);
14417
+ // on Safari, the old audio track must be stopped before attempting to acquire
14418
+ // the new track, otherwise the new track will stop with
14419
+ // 'A MediaStreamTrack ended due to a capture failure`
14420
+ this._mediaStreamTrack.stop();
14421
+ // create new track and attach
14422
+ const mediaStream = yield navigator.mediaDevices.getUserMedia(streamConstraints);
14423
+ const newTrack = mediaStream.getTracks()[0];
14424
+ newTrack.addEventListener('ended', this.handleEnded);
14425
+ this.log.debug('re-acquired MediaStreamTrack', this.logContext);
14426
+ yield this.setMediaStreamTrack(newTrack);
14427
+ this._constraints = constraints;
14428
+ this.emit(TrackEvent.Restarted, this);
14429
+ return this;
14430
+ } finally {
14431
+ unlock();
14400
14432
  }
14401
- // these steps are duplicated from setMediaStreamTrack because we must stop
14402
- // the previous tracks before new tracks can be acquired
14403
- this.attachedElements.forEach(el => {
14404
- detachTrack(this.mediaStreamTrack, el);
14405
- });
14406
- this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);
14407
- // on Safari, the old audio track must be stopped before attempting to acquire
14408
- // the new track, otherwise the new track will stop with
14409
- // 'A MediaStreamTrack ended due to a capture failure`
14410
- this._mediaStreamTrack.stop();
14411
- // create new track and attach
14412
- const mediaStream = yield navigator.mediaDevices.getUserMedia(streamConstraints);
14413
- const newTrack = mediaStream.getTracks()[0];
14414
- newTrack.addEventListener('ended', this.handleEnded);
14415
- this.log.debug('re-acquired MediaStreamTrack', this.logContext);
14416
- yield this.setMediaStreamTrack(newTrack);
14417
- this._constraints = constraints;
14418
- this.emit(TrackEvent.Restarted, this);
14419
- return this;
14420
14433
  });
14421
14434
  }
14422
14435
  setTrackMuted(muted) {
@@ -14569,6 +14582,7 @@ class LocalTrack extends Track {
14569
14582
  }
14570
14583
  yield (_b = this.sender) === null || _b === void 0 ? void 0 : _b.replaceTrack(this.processor.processedTrack);
14571
14584
  }
14585
+ this.emit(TrackEvent.TrackProcessorUpdate, this.processor);
14572
14586
  } finally {
14573
14587
  unlock();
14574
14588
  }
@@ -14595,6 +14609,7 @@ class LocalTrack extends Track {
14595
14609
  (_b = this.processorElement) === null || _b === void 0 ? void 0 : _b.remove();
14596
14610
  this.processorElement = undefined;
14597
14611
  yield this.restart();
14612
+ this.emit(TrackEvent.TrackProcessorUpdate);
14598
14613
  });
14599
14614
  }
14600
14615
  }
@@ -18441,6 +18456,7 @@ class LocalAudioTrack extends LocalTrack {
18441
18456
  if (this.processor.processedTrack) {
18442
18457
  yield (_a = this.sender) === null || _a === void 0 ? void 0 : _a.replaceTrack(this.processor.processedTrack);
18443
18458
  }
18459
+ this.emit(TrackEvent.TrackProcessorUpdate, this.processor);
18444
18460
  } finally {
18445
18461
  unlock();
18446
18462
  }
@@ -22041,14 +22057,20 @@ class Room extends eventsExports.EventEmitter {
22041
22057
  const pi = joinResponse.participant;
22042
22058
  this.localParticipant.sid = pi.sid;
22043
22059
  this.localParticipant.identity = pi.identity;
22060
+ if (this.options.e2ee && this.e2eeManager) {
22061
+ try {
22062
+ this.e2eeManager.setSifTrailer(joinResponse.sifTrailer);
22063
+ } catch (e) {
22064
+ this.log.error(e instanceof Error ? e.message : 'Could not set SifTrailer', Object.assign(Object.assign({}, this.logContext), {
22065
+ error: e
22066
+ }));
22067
+ }
22068
+ }
22044
22069
  // populate remote participants, these should not trigger new events
22045
22070
  this.handleParticipantUpdates([pi, ...joinResponse.otherParticipants]);
22046
22071
  if (joinResponse.room) {
22047
22072
  this.handleRoomUpdate(joinResponse.room);
22048
22073
  }
22049
- if (this.options.e2ee && this.e2eeManager) {
22050
- this.e2eeManager.setSifTrailer(joinResponse.sifTrailer);
22051
- }
22052
22074
  };
22053
22075
  this.attemptConnection = (url, token, opts, abortController) => __awaiter(this, void 0, void 0, function* () {
22054
22076
  var _h, _j, _k;
@@ -22483,9 +22505,14 @@ class Room extends eventsExports.EventEmitter {
22483
22505
  this.onLocalTrackUnmuted = pub => {
22484
22506
  this.emit(RoomEvent.TrackUnmuted, pub, this.localParticipant);
22485
22507
  };
22508
+ this.onTrackProcessorUpdate = processor => {
22509
+ var _a;
22510
+ (_a = processor === null || processor === void 0 ? void 0 : processor.onPublish) === null || _a === void 0 ? void 0 : _a.call(processor, this);
22511
+ };
22486
22512
  this.onLocalTrackPublished = pub => __awaiter(this, void 0, void 0, function* () {
22487
- var _r, _s, _t, _u;
22488
- (_t = (_s = (_r = pub.track) === null || _r === void 0 ? void 0 : _r.getProcessor()) === null || _s === void 0 ? void 0 : _s.onPublish) === null || _t === void 0 ? void 0 : _t.call(_s, this);
22513
+ var _r, _s, _t, _u, _v;
22514
+ (_r = pub.track) === null || _r === void 0 ? void 0 : _r.on(TrackEvent.TrackProcessorUpdate, this.onTrackProcessorUpdate);
22515
+ (_u = (_t = (_s = pub.track) === null || _s === void 0 ? void 0 : _s.getProcessor()) === null || _t === void 0 ? void 0 : _t.onPublish) === null || _u === void 0 ? void 0 : _u.call(_t, this);
22489
22516
  this.emit(RoomEvent.LocalTrackPublished, pub, this.localParticipant);
22490
22517
  if (pub.track instanceof LocalAudioTrack) {
22491
22518
  const trackIsSilent = yield pub.track.checkForSilence();
@@ -22493,7 +22520,7 @@ class Room extends eventsExports.EventEmitter {
22493
22520
  this.emit(RoomEvent.LocalAudioSilenceDetected, pub);
22494
22521
  }
22495
22522
  }
22496
- const deviceId = yield (_u = pub.track) === null || _u === void 0 ? void 0 : _u.getDeviceId();
22523
+ const deviceId = yield (_v = pub.track) === null || _v === void 0 ? void 0 : _v.getDeviceId();
22497
22524
  const deviceKind = sourceToKind(pub.source);
22498
22525
  if (deviceKind && deviceId && deviceId !== this.localParticipant.activeDeviceMap.get(deviceKind)) {
22499
22526
  this.localParticipant.activeDeviceMap.set(deviceKind, deviceId);
@@ -22501,6 +22528,8 @@ class Room extends eventsExports.EventEmitter {
22501
22528
  }
22502
22529
  });
22503
22530
  this.onLocalTrackUnpublished = pub => {
22531
+ var _a;
22532
+ (_a = pub.track) === null || _a === void 0 ? void 0 : _a.off(TrackEvent.TrackProcessorUpdate, this.onTrackProcessorUpdate);
22504
22533
  this.emit(RoomEvent.LocalTrackUnpublished, pub, this.localParticipant);
22505
22534
  };
22506
22535
  this.onLocalConnectionQualityChanged = quality => {