livekit-client 2.5.5 → 2.5.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FrameCryptor.d.ts","sourceRoot":"","sources":["../../../../src/e2ee/worker/FrameCryptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FrameCryptor.d.ts","sourceRoot":"","sources":["../../../../src/e2ee/worker/FrameCryptor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livekit-client",
3
- "version": "2.5.5",
3
+ "version": "2.5.6",
4
4
  "description": "JavaScript/TypeScript client SDK for LiveKit",
5
5
  "main": "./dist/livekit-client.umd.js",
6
6
  "unpkg": "./dist/livekit-client.umd.js",
@@ -115,6 +115,11 @@ export class E2EEManager extends (EventEmitter as new () => TypedEventEmitter<E2
115
115
  break;
116
116
 
117
117
  case 'enable':
118
+ if (data.enabled) {
119
+ this.keyProvider.getKeys().forEach((keyInfo) => {
120
+ this.postKey(keyInfo);
121
+ });
122
+ }
118
123
  if (
119
124
  this.encryptionEnabled !== data.enabled &&
120
125
  data.participantIdentity === this.room?.localParticipant.identity
@@ -134,11 +139,6 @@ export class E2EEManager extends (EventEmitter as new () => TypedEventEmitter<E2
134
139
  }
135
140
  this.emit(EncryptionEvent.ParticipantEncryptionStatusChanged, data.enabled, participant);
136
141
  }
137
- if (this.encryptionEnabled) {
138
- this.keyProvider.getKeys().forEach((keyInfo) => {
139
- this.postKey(keyInfo);
140
- });
141
- }
142
142
  break;
143
143
  case 'ratchetKey':
144
144
  this.keyProvider.emit(KeyProviderEvent.KeyRatcheted, data.material, data.keyIndex);
@@ -196,13 +196,13 @@ export class E2EEManager extends (EventEmitter as new () => TypedEventEmitter<E2
196
196
  if (!this.room) {
197
197
  throw new TypeError(`expected room to be present on signal connect`);
198
198
  }
199
+ keyProvider.getKeys().forEach((keyInfo) => {
200
+ this.postKey(keyInfo);
201
+ });
199
202
  this.setParticipantCryptorEnabled(
200
203
  this.room.localParticipant.isE2EEEnabled,
201
204
  this.room.localParticipant.identity,
202
205
  );
203
- keyProvider.getKeys().forEach((keyInfo) => {
204
- this.postKey(keyInfo);
205
- });
206
206
  });
207
207
  room.localParticipant.on(ParticipantEvent.LocalTrackPublished, async (publication) => {
208
208
  this.setupE2EESender(publication.track!, publication.track!.sender!);
@@ -233,11 +233,17 @@ export class FrameCryptor extends BaseFrameCryptor {
233
233
  }
234
234
  const keySet = this.keys.getKeySet();
235
235
  if (!keySet) {
236
- throw new TypeError(
237
- `key set not found for ${
238
- this.participantIdentity
239
- } at index ${this.keys.getCurrentKeyIndex()}`,
236
+ this.emit(
237
+ CryptorEvent.Error,
238
+ new CryptorError(
239
+ `key set not found for ${
240
+ this.participantIdentity
241
+ } at index ${this.keys.getCurrentKeyIndex()}`,
242
+ CryptorErrorReason.MissingKey,
243
+ this.participantIdentity,
244
+ ),
240
245
  );
246
+ return;
241
247
  }
242
248
  const { encryptionKey } = keySet;
243
249
  const keyIndex = this.keys.getCurrentKeyIndex();
@@ -1,5 +1,6 @@
1
1
  import { workerLogger } from '../../logger';
2
2
  import { VideoCodec } from '../../room/track/options';
3
+ import { AsyncQueue } from '../../utils/AsyncQueue';
3
4
  import { KEY_PROVIDER_DEFAULTS } from '../constants';
4
5
  import { CryptorErrorReason } from '../errors';
5
6
  import { CryptorEvent, KeyHandlerEvent } from '../events';
@@ -17,6 +18,7 @@ import { ParticipantKeyHandler } from './ParticipantKeyHandler';
17
18
  const participantCryptors: FrameCryptor[] = [];
18
19
  const participantKeys: Map<string, ParticipantKeyHandler> = new Map();
19
20
  let sharedKeyHandler: ParticipantKeyHandler | undefined;
21
+ let messageQueue = new AsyncQueue();
20
22
 
21
23
  let isEncryptionEnabled: boolean = false;
22
24
 
@@ -31,85 +33,87 @@ let rtpMap: Map<number, VideoCodec> = new Map();
31
33
  workerLogger.setDefaultLevel('info');
32
34
 
33
35
  onmessage = (ev) => {
34
- const { kind, data }: E2EEWorkerMessage = ev.data;
36
+ messageQueue.run(async () => {
37
+ const { kind, data }: E2EEWorkerMessage = ev.data;
35
38
 
36
- switch (kind) {
37
- case 'init':
38
- workerLogger.setLevel(data.loglevel);
39
- workerLogger.info('worker initialized');
40
- keyProviderOptions = data.keyProviderOptions;
41
- useSharedKey = !!data.keyProviderOptions.sharedKey;
42
- // acknowledge init successful
43
- const ackMsg: InitAck = {
44
- kind: 'initAck',
45
- data: { enabled: isEncryptionEnabled },
46
- };
47
- postMessage(ackMsg);
48
- break;
49
- case 'enable':
50
- setEncryptionEnabled(data.enabled, data.participantIdentity);
51
- workerLogger.info(
52
- `updated e2ee enabled status for ${data.participantIdentity} to ${data.enabled}`,
53
- );
54
- // acknowledge enable call successful
55
- postMessage(ev.data);
56
- break;
57
- case 'decode':
58
- let cryptor = getTrackCryptor(data.participantIdentity, data.trackId);
59
- cryptor.setupTransform(
60
- kind,
61
- data.readableStream,
62
- data.writableStream,
63
- data.trackId,
64
- data.codec,
65
- );
66
- break;
67
- case 'encode':
68
- let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);
69
- pubCryptor.setupTransform(
70
- kind,
71
- data.readableStream,
72
- data.writableStream,
73
- data.trackId,
74
- data.codec,
75
- );
76
- break;
77
- case 'setKey':
78
- if (useSharedKey) {
79
- setSharedKey(data.key, data.keyIndex);
80
- } else if (data.participantIdentity) {
39
+ switch (kind) {
40
+ case 'init':
41
+ workerLogger.setLevel(data.loglevel);
42
+ workerLogger.info('worker initialized');
43
+ keyProviderOptions = data.keyProviderOptions;
44
+ useSharedKey = !!data.keyProviderOptions.sharedKey;
45
+ // acknowledge init successful
46
+ const ackMsg: InitAck = {
47
+ kind: 'initAck',
48
+ data: { enabled: isEncryptionEnabled },
49
+ };
50
+ postMessage(ackMsg);
51
+ break;
52
+ case 'enable':
53
+ setEncryptionEnabled(data.enabled, data.participantIdentity);
81
54
  workerLogger.info(
82
- `set participant sender key ${data.participantIdentity} index ${data.keyIndex}`,
55
+ `updated e2ee enabled status for ${data.participantIdentity} to ${data.enabled}`,
83
56
  );
84
- getParticipantKeyHandler(data.participantIdentity).setKey(data.key, data.keyIndex);
85
- } else {
86
- workerLogger.error('no participant Id was provided and shared key usage is disabled');
87
- }
88
- break;
89
- case 'removeTransform':
90
- unsetCryptorParticipant(data.trackId, data.participantIdentity);
91
- break;
92
- case 'updateCodec':
93
- getTrackCryptor(data.participantIdentity, data.trackId).setVideoCodec(data.codec);
94
- break;
95
- case 'setRTPMap':
96
- // this is only used for the local participant
97
- rtpMap = data.map;
98
- participantCryptors.forEach((cr) => {
99
- if (cr.getParticipantIdentity() === data.participantIdentity) {
100
- cr.setRtpMap(data.map);
57
+ // acknowledge enable call successful
58
+ postMessage(ev.data);
59
+ break;
60
+ case 'decode':
61
+ let cryptor = getTrackCryptor(data.participantIdentity, data.trackId);
62
+ cryptor.setupTransform(
63
+ kind,
64
+ data.readableStream,
65
+ data.writableStream,
66
+ data.trackId,
67
+ data.codec,
68
+ );
69
+ break;
70
+ case 'encode':
71
+ let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);
72
+ pubCryptor.setupTransform(
73
+ kind,
74
+ data.readableStream,
75
+ data.writableStream,
76
+ data.trackId,
77
+ data.codec,
78
+ );
79
+ break;
80
+ case 'setKey':
81
+ if (useSharedKey) {
82
+ await setSharedKey(data.key, data.keyIndex);
83
+ } else if (data.participantIdentity) {
84
+ workerLogger.info(
85
+ `set participant sender key ${data.participantIdentity} index ${data.keyIndex}`,
86
+ );
87
+ await getParticipantKeyHandler(data.participantIdentity).setKey(data.key, data.keyIndex);
88
+ } else {
89
+ workerLogger.error('no participant Id was provided and shared key usage is disabled');
101
90
  }
102
- });
103
- break;
104
- case 'ratchetRequest':
105
- handleRatchetRequest(data);
106
- break;
107
- case 'setSifTrailer':
108
- handleSifTrailer(data.trailer);
109
- break;
110
- default:
111
- break;
112
- }
91
+ break;
92
+ case 'removeTransform':
93
+ unsetCryptorParticipant(data.trackId, data.participantIdentity);
94
+ break;
95
+ case 'updateCodec':
96
+ getTrackCryptor(data.participantIdentity, data.trackId).setVideoCodec(data.codec);
97
+ break;
98
+ case 'setRTPMap':
99
+ // this is only used for the local participant
100
+ rtpMap = data.map;
101
+ participantCryptors.forEach((cr) => {
102
+ if (cr.getParticipantIdentity() === data.participantIdentity) {
103
+ cr.setRtpMap(data.map);
104
+ }
105
+ });
106
+ break;
107
+ case 'ratchetRequest':
108
+ handleRatchetRequest(data);
109
+ break;
110
+ case 'setSifTrailer':
111
+ handleSifTrailer(data.trailer);
112
+ break;
113
+ default:
114
+ break;
115
+ }
116
+ });
113
117
  };
114
118
 
115
119
  async function handleRatchetRequest(data: RatchetRequestMessage['data']) {
@@ -210,9 +214,9 @@ function setEncryptionEnabled(enable: boolean, participantIdentity: string) {
210
214
  encryptionEnabledMap.set(participantIdentity, enable);
211
215
  }
212
216
 
213
- function setSharedKey(key: CryptoKey, index?: number) {
217
+ async function setSharedKey(key: CryptoKey, index?: number) {
214
218
  workerLogger.info('set shared key', { index });
215
- getSharedKeyHandler().setKey(key, index);
219
+ await getSharedKeyHandler().setKey(key, index);
216
220
  }
217
221
 
218
222
  function setupCryptorErrorEvents(cryptor: FrameCryptor) {