livekit-client 1.13.0 → 1.13.2

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 (55) 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 +122 -105
  4. package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
  5. package/dist/livekit-client.esm.mjs +172 -109
  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/E2eeManager.d.ts +4 -3
  10. package/dist/src/e2ee/E2eeManager.d.ts.map +1 -1
  11. package/dist/src/e2ee/KeyProvider.d.ts +7 -6
  12. package/dist/src/e2ee/KeyProvider.d.ts.map +1 -1
  13. package/dist/src/e2ee/events.d.ts +34 -0
  14. package/dist/src/e2ee/events.d.ts.map +1 -0
  15. package/dist/src/e2ee/index.d.ts +1 -0
  16. package/dist/src/e2ee/index.d.ts.map +1 -1
  17. package/dist/src/e2ee/types.d.ts +17 -33
  18. package/dist/src/e2ee/types.d.ts.map +1 -1
  19. package/dist/src/e2ee/worker/FrameCryptor.d.ts +15 -12
  20. package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
  21. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts +6 -8
  22. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -1
  23. package/dist/src/room/PCTransport.d.ts.map +1 -1
  24. package/dist/src/room/RTCEngine.d.ts.map +1 -1
  25. package/dist/src/room/Room.d.ts.map +1 -1
  26. package/dist/src/room/participant/LocalParticipant.d.ts +1 -0
  27. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  28. package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
  29. package/dist/src/room/track/processor/types.d.ts +2 -1
  30. package/dist/src/room/track/processor/types.d.ts.map +1 -1
  31. package/dist/ts4.2/src/e2ee/E2eeManager.d.ts +4 -3
  32. package/dist/ts4.2/src/e2ee/KeyProvider.d.ts +7 -6
  33. package/dist/ts4.2/src/e2ee/events.d.ts +34 -0
  34. package/dist/ts4.2/src/e2ee/index.d.ts +1 -0
  35. package/dist/ts4.2/src/e2ee/types.d.ts +17 -33
  36. package/dist/ts4.2/src/e2ee/worker/FrameCryptor.d.ts +15 -12
  37. package/dist/ts4.2/src/e2ee/worker/ParticipantKeyHandler.d.ts +6 -8
  38. package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +1 -0
  39. package/dist/ts4.2/src/room/track/processor/types.d.ts +2 -1
  40. package/package.json +1 -1
  41. package/src/e2ee/E2eeManager.ts +105 -77
  42. package/src/e2ee/KeyProvider.ts +23 -13
  43. package/src/e2ee/events.ts +48 -0
  44. package/src/e2ee/index.ts +1 -0
  45. package/src/e2ee/types.ts +19 -41
  46. package/src/e2ee/worker/FrameCryptor.ts +51 -43
  47. package/src/e2ee/worker/ParticipantKeyHandler.ts +25 -27
  48. package/src/e2ee/worker/e2ee.worker.ts +61 -68
  49. package/src/room/PCTransport.ts +12 -2
  50. package/src/room/RTCEngine.ts +0 -1
  51. package/src/room/Room.ts +20 -15
  52. package/src/room/participant/LocalParticipant.ts +5 -1
  53. package/src/room/track/LocalTrack.ts +18 -10
  54. package/src/room/track/facingMode.ts +1 -1
  55. package/src/room/track/processor/types.ts +2 -1
package/src/room/Room.ts CHANGED
@@ -209,10 +209,10 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
209
209
  */
210
210
  async setE2EEEnabled(enabled: boolean) {
211
211
  if (this.e2eeManager) {
212
- await Promise.all([
213
- this.localParticipant.setE2EEEnabled(enabled),
214
- this.e2eeManager.setParticipantCryptorEnabled(enabled),
215
- ]);
212
+ await Promise.all([this.localParticipant.setE2EEEnabled(enabled)]);
213
+ if (this.localParticipant.identity !== '') {
214
+ this.e2eeManager.setParticipantCryptorEnabled(enabled, this.localParticipant.identity);
215
+ }
216
216
  } else {
217
217
  throw Error('e2ee not configured, please set e2ee settings within the room options');
218
218
  }
@@ -230,7 +230,7 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
230
230
  this.emit(RoomEvent.ParticipantEncryptionStatusChanged, enabled, participant);
231
231
  },
232
232
  );
233
- this.e2eeManager.on(EncryptionEvent.Error, (error) =>
233
+ this.e2eeManager.on(EncryptionEvent.EncryptionError, (error) =>
234
234
  this.emit(RoomEvent.EncryptionError, error),
235
235
  );
236
236
  this.e2eeManager?.setup(this);
@@ -1025,7 +1025,15 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
1025
1025
  log.warn('tried to create RemoteParticipant for local participant');
1026
1026
  return;
1027
1027
  }
1028
- const participant = this.getOrCreateParticipant(participantId);
1028
+
1029
+ const participant = this.participants.get(participantId) as RemoteParticipant | undefined;
1030
+
1031
+ if (!participant) {
1032
+ log.error(
1033
+ `Tried to add a track for a participant, that's not present. Sid: ${participantId}`,
1034
+ );
1035
+ return;
1036
+ }
1029
1037
 
1030
1038
  let adaptiveStreamSettings: AdaptiveStreamSettings | undefined;
1031
1039
  if (this.options.adaptiveStream) {
@@ -1445,20 +1453,17 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
1445
1453
  return participant;
1446
1454
  }
1447
1455
 
1448
- private getOrCreateParticipant(id: string, info?: ParticipantInfo): RemoteParticipant {
1456
+ private getOrCreateParticipant(id: string, info: ParticipantInfo): RemoteParticipant {
1449
1457
  if (this.participants.has(id)) {
1450
1458
  return this.participants.get(id) as RemoteParticipant;
1451
1459
  }
1452
- // it's possible for the RTC track to arrive before signaling data
1453
- // when this happens, we'll create the participant and make the track work
1454
1460
  const participant = this.createParticipant(id, info);
1455
1461
  this.participants.set(id, participant);
1456
- if (info) {
1457
- this.identityToSid.set(info.identity, info.sid);
1458
- // if we have valid info and the participant wasn't in the map before, we can assume the participant is new
1459
- // firing here to make sure that `ParticipantConnected` fires before the initial track events
1460
- this.emitWhenConnected(RoomEvent.ParticipantConnected, participant);
1461
- }
1462
+
1463
+ this.identityToSid.set(info.identity, info.sid);
1464
+ // if we have valid info and the participant wasn't in the map before, we can assume the participant is new
1465
+ // firing here to make sure that `ParticipantConnected` fires before the initial track events
1466
+ this.emitWhenConnected(RoomEvent.ParticipantConnected, participant);
1462
1467
 
1463
1468
  // also forward events
1464
1469
  // trackPublished is only fired for tracks added after both local participant
@@ -104,6 +104,10 @@ export default class LocalParticipant extends Participant {
104
104
  return this.microphoneError;
105
105
  }
106
106
 
107
+ get isE2EEEnabled(): boolean {
108
+ return this.encryptionType !== Encryption_Type.NONE;
109
+ }
110
+
107
111
  getTrack(source: Track.Source): LocalTrackPublication | undefined {
108
112
  const track = super.getTrack(source);
109
113
  if (track) {
@@ -645,7 +649,7 @@ export default class LocalParticipant extends Participant {
645
649
  disableDtx: !(opts.dtx ?? true),
646
650
  encryption: this.encryptionType,
647
651
  stereo: isStereo,
648
- // disableRed: !(opts.red ?? true),
652
+ disableRed: !(opts.red ?? true),
649
653
  });
650
654
 
651
655
  // compute encodings and layers for video
@@ -128,8 +128,23 @@ export default abstract class LocalTrack extends Track {
128
128
  newTrack.addEventListener('unmute', this.handleTrackUnmuteEvent);
129
129
  this._constraints = newTrack.getConstraints();
130
130
  }
131
+ let processedTrack: MediaStreamTrack | undefined;
132
+ if (this.processor && newTrack && this.processorElement) {
133
+ log.debug('restarting processor');
134
+ if (this.kind === 'unknown') {
135
+ throw TypeError('cannot set processor on track of unknown kind');
136
+ }
137
+
138
+ attachToElement(newTrack, this.processorElement);
139
+ await this.processor.restart({
140
+ track: newTrack,
141
+ kind: this.kind,
142
+ element: this.processorElement,
143
+ });
144
+ processedTrack = this.processor.processedTrack;
145
+ }
131
146
  if (this.sender) {
132
- await this.sender.replaceTrack(newTrack);
147
+ await this.sender.replaceTrack(processedTrack ?? newTrack);
133
148
  }
134
149
  this._mediaStreamTrack = newTrack;
135
150
  if (newTrack) {
@@ -138,7 +153,7 @@ export default abstract class LocalTrack extends Track {
138
153
  // when a valid track is replace, we'd want to start producing
139
154
  await this.resumeUpstream();
140
155
  this.attachedElements.forEach((el) => {
141
- attachToElement(newTrack, el);
156
+ attachToElement(processedTrack ?? newTrack, el);
142
157
  });
143
158
  }
144
159
  }
@@ -236,14 +251,7 @@ export default abstract class LocalTrack extends Track {
236
251
 
237
252
  await this.setMediaStreamTrack(newTrack);
238
253
  this._constraints = constraints;
239
- if (this.processor) {
240
- const processor = this.processor;
241
- await this.setProcessor(processor);
242
- } else {
243
- this.attachedElements.forEach((el) => {
244
- attachToElement(this._mediaStreamTrack, el);
245
- });
246
- }
254
+
247
255
  this.emit(TrackEvent.Restarted, this);
248
256
  return this;
249
257
  }
@@ -1,4 +1,4 @@
1
- import log from 'loglevel';
1
+ import log from '../../logger';
2
2
  import LocalTrack from './LocalTrack';
3
3
  import type { VideoCaptureOptions } from './options';
4
4
 
@@ -29,7 +29,8 @@ export interface TrackProcessor<
29
29
  U extends ProcessorOptions<T> = ProcessorOptions<T>,
30
30
  > {
31
31
  name: string;
32
- init: (opts: U) => void;
32
+ init: (opts: U) => Promise<void>;
33
+ restart: (opts: U) => Promise<void>;
33
34
  destroy: () => Promise<void>;
34
35
  processedTrack?: MediaStreamTrack;
35
36
  }