livekit-client 2.11.2 → 2.11.3

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/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 +10 -6
  4. package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
  5. package/dist/livekit-client.esm.mjs +38 -23
  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.map +1 -1
  10. package/dist/src/e2ee/constants.d.ts.map +1 -1
  11. package/dist/src/e2ee/types.d.ts +2 -0
  12. package/dist/src/e2ee/types.d.ts.map +1 -1
  13. package/dist/src/e2ee/utils.d.ts +1 -1
  14. package/dist/src/e2ee/utils.d.ts.map +1 -1
  15. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts +3 -2
  16. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -1
  17. package/dist/src/room/track/create.d.ts.map +1 -1
  18. package/dist/src/utils/cloneDeep.d.ts +1 -1
  19. package/dist/src/utils/cloneDeep.d.ts.map +1 -1
  20. package/dist/ts4.2/src/e2ee/types.d.ts +2 -0
  21. package/dist/ts4.2/src/e2ee/utils.d.ts +1 -1
  22. package/dist/ts4.2/src/e2ee/worker/ParticipantKeyHandler.d.ts +3 -2
  23. package/dist/ts4.2/src/utils/cloneDeep.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/src/api/utils.test.ts +7 -0
  26. package/src/api/utils.ts +2 -2
  27. package/src/e2ee/E2eeManager.ts +11 -2
  28. package/src/e2ee/constants.ts +1 -0
  29. package/src/e2ee/types.ts +2 -0
  30. package/src/e2ee/utils.ts +2 -1
  31. package/src/e2ee/worker/ParticipantKeyHandler.ts +4 -2
  32. package/src/e2ee/worker/e2ee.worker.ts +2 -2
  33. package/src/room/track/create.ts +19 -6
  34. package/src/room/track/utils.ts +2 -2
  35. package/src/utils/cloneDeep.ts +2 -2
@@ -10156,7 +10156,8 @@ const KEY_PROVIDER_DEFAULTS = {
10156
10156
  ratchetSalt: SALT,
10157
10157
  ratchetWindowSize: 8,
10158
10158
  failureTolerance: DECRYPTION_FAILURE_TOLERANCE,
10159
- keyringSize: 16
10159
+ keyringSize: 16,
10160
+ allowKeyExtraction: false
10160
10161
  };
10161
10162
 
10162
10163
  var KeyProviderEvent;
@@ -10200,9 +10201,10 @@ function importKey(keyBytes_1) {
10200
10201
  name: ENCRYPTION_ALGORITHM
10201
10202
  };
10202
10203
  let usage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'encrypt';
10204
+ let extractable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
10203
10205
  return function* () {
10204
10206
  // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
10205
- return crypto.subtle.importKey('raw', keyBytes, algorithm, false, usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt']);
10207
+ return crypto.subtle.importKey('raw', keyBytes, algorithm, extractable, usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt']);
10206
10208
  }();
10207
10209
  });
10208
10210
  }
@@ -11109,7 +11111,7 @@ var TrackEvent;
11109
11111
 
11110
11112
  function cloneDeep(value) {
11111
11113
  if (typeof value === 'undefined') {
11112
- return;
11114
+ return value;
11113
11115
  }
11114
11116
  if (typeof structuredClone === 'function') {
11115
11117
  return structuredClone(value);
@@ -11186,7 +11188,7 @@ function getOSVersion(ua) {
11186
11188
  return ua.includes('mac os') ? getMatch(/\(.+?(\d+_\d+(:?_\d+)?)/, ua, 1).replace(/_/g, '.') : undefined;
11187
11189
  }
11188
11190
 
11189
- var version$1 = "2.11.2";
11191
+ var version$1 = "2.11.3";
11190
11192
 
11191
11193
  const version = version$1;
11192
11194
  const protocolVersion = 15;
@@ -12062,6 +12064,12 @@ function unwrapConstraint(constraint) {
12062
12064
  }
12063
12065
  throw Error('could not unwrap constraint');
12064
12066
  }
12067
+ function toWebsocketUrl(url) {
12068
+ if (url.startsWith('http')) {
12069
+ return url.replace(/^(http)/, 'ws');
12070
+ }
12071
+ return url;
12072
+ }
12065
12073
  function toHttpUrl(url) {
12066
12074
  if (url.startsWith('ws')) {
12067
12075
  return url.replace(/^(ws)/, 'http');
@@ -12187,8 +12195,8 @@ function splitUtf8(s, n) {
12187
12195
  }
12188
12196
 
12189
12197
  function mergeDefaultOptions(options, audioDefaults, videoDefaults) {
12190
- var _a, _b, _c;
12191
- var _d, _e;
12198
+ var _a, _b;
12199
+ var _c, _d;
12192
12200
  const {
12193
12201
  optionsWithoutProcessor,
12194
12202
  audioProcessor,
@@ -12196,13 +12204,13 @@ function mergeDefaultOptions(options, audioDefaults, videoDefaults) {
12196
12204
  } = extractProcessorsFromOptions(options !== null && options !== void 0 ? options : {});
12197
12205
  const defaultAudioProcessor = audioDefaults === null || audioDefaults === void 0 ? void 0 : audioDefaults.processor;
12198
12206
  const defaultVideoProcessor = videoDefaults === null || videoDefaults === void 0 ? void 0 : videoDefaults.processor;
12199
- const clonedOptions = (_a = cloneDeep(optionsWithoutProcessor)) !== null && _a !== void 0 ? _a : {};
12207
+ const clonedOptions = optionsWithoutProcessor !== null && optionsWithoutProcessor !== void 0 ? optionsWithoutProcessor : {};
12200
12208
  if (clonedOptions.audio === true) clonedOptions.audio = {};
12201
12209
  if (clonedOptions.video === true) clonedOptions.video = {};
12202
12210
  // use defaults
12203
12211
  if (clonedOptions.audio) {
12204
12212
  mergeObjectWithoutOverwriting(clonedOptions.audio, audioDefaults);
12205
- (_b = (_d = clonedOptions.audio).deviceId) !== null && _b !== void 0 ? _b : _d.deviceId = {
12213
+ (_a = (_c = clonedOptions.audio).deviceId) !== null && _a !== void 0 ? _a : _c.deviceId = {
12206
12214
  ideal: 'default'
12207
12215
  };
12208
12216
  if (audioProcessor || defaultAudioProcessor) {
@@ -12211,7 +12219,7 @@ function mergeDefaultOptions(options, audioDefaults, videoDefaults) {
12211
12219
  }
12212
12220
  if (clonedOptions.video) {
12213
12221
  mergeObjectWithoutOverwriting(clonedOptions.video, videoDefaults);
12214
- (_c = (_e = clonedOptions.video).deviceId) !== null && _c !== void 0 ? _c : _e.deviceId = {
12222
+ (_b = (_d = clonedOptions.video).deviceId) !== null && _b !== void 0 ? _b : _d.deviceId = {
12215
12223
  ideal: 'default'
12216
12224
  };
12217
12225
  if (videoProcessor || defaultVideoProcessor) {
@@ -12469,7 +12477,7 @@ function extractProcessorsFromOptions(options) {
12469
12477
  return {
12470
12478
  audioProcessor,
12471
12479
  videoProcessor,
12472
- optionsWithoutProcessor: newOptions
12480
+ optionsWithoutProcessor: cloneDeep(newOptions)
12473
12481
  };
12474
12482
  }
12475
12483
  function getTrackSourceFromProto(source) {
@@ -12628,9 +12636,9 @@ class E2EEManager extends eventsExports.EventEmitter {
12628
12636
  room.localParticipant.on(ParticipantEvent.LocalTrackPublished, publication => __awaiter(this, void 0, void 0, function* () {
12629
12637
  this.setupE2EESender(publication.track, publication.track.sender);
12630
12638
  }));
12631
- keyProvider.on(KeyProviderEvent.SetKey, keyInfo => this.postKey(keyInfo)).on(KeyProviderEvent.RatchetRequest, (participantId, keyIndex) => this.postRatchetRequest(participantId, keyIndex));
12639
+ keyProvider.on(KeyProviderEvent.SetKey, keyInfo => this.postKey(keyInfo)).on(KeyProviderEvent.RatchetRequest, (participantId, keyIndex) => this.postRatchetRequest(participantId, keyIndex, keyProvider.getOptions().allowKeyExtraction));
12632
12640
  }
12633
- postRatchetRequest(participantIdentity, keyIndex) {
12641
+ postRatchetRequest(participantIdentity, keyIndex, extractable) {
12634
12642
  if (!this.worker) {
12635
12643
  throw Error('could not ratchet key, worker is missing');
12636
12644
  }
@@ -12638,7 +12646,8 @@ class E2EEManager extends eventsExports.EventEmitter {
12638
12646
  kind: 'ratchetRequest',
12639
12647
  data: {
12640
12648
  participantIdentity: participantIdentity,
12641
- keyIndex
12649
+ keyIndex,
12650
+ extractable
12642
12651
  }
12643
12652
  };
12644
12653
  this.worker.postMessage(msg);
@@ -12966,7 +12975,7 @@ class AsyncQueue {
12966
12975
  }
12967
12976
 
12968
12977
  function createRtcUrl(url, searchParams) {
12969
- const urlObj = new URL(url);
12978
+ const urlObj = new URL(toWebsocketUrl(url));
12970
12979
  searchParams.forEach((value, key) => {
12971
12980
  urlObj.searchParams.set(key, value);
12972
12981
  });
@@ -19442,13 +19451,23 @@ class LocalTrackPublication extends TrackPublication {
19442
19451
  */
19443
19452
  function createLocalTracks(options, loggerOptions) {
19444
19453
  return __awaiter(this, void 0, void 0, function* () {
19445
- // set default options to true
19446
- const internalOptions = Object.assign({}, options !== null && options !== void 0 ? options : {});
19454
+ options !== null && options !== void 0 ? options : options = {};
19447
19455
  let attemptExactMatch = false;
19448
- let retryAudioOptions = options === null || options === void 0 ? void 0 : options.audio;
19449
- let retryVideoOptions = options === null || options === void 0 ? void 0 : options.video;
19456
+ const {
19457
+ audioProcessor,
19458
+ videoProcessor,
19459
+ optionsWithoutProcessor: internalOptions
19460
+ } = extractProcessorsFromOptions(options);
19461
+ let retryAudioOptions = internalOptions.audio;
19462
+ let retryVideoOptions = internalOptions.video;
19463
+ if (audioProcessor && typeof internalOptions.audio === 'object') {
19464
+ internalOptions.audio.processor = audioProcessor;
19465
+ }
19466
+ if (videoProcessor && typeof internalOptions.video === 'object') {
19467
+ internalOptions.video.processor = videoProcessor;
19468
+ }
19450
19469
  // if the user passes a device id as a string, we default to exact match
19451
- if (internalOptions.audio && typeof internalOptions.audio === 'object' && typeof internalOptions.audio.deviceId === 'string') {
19470
+ if (options.audio && typeof internalOptions.audio === 'object' && typeof internalOptions.audio.deviceId === 'string') {
19452
19471
  const deviceId = internalOptions.audio.deviceId;
19453
19472
  internalOptions.audio.deviceId = {
19454
19473
  exact: deviceId
@@ -19483,10 +19502,6 @@ function createLocalTracks(options, loggerOptions) {
19483
19502
  deviceId: 'default'
19484
19503
  };
19485
19504
  }
19486
- const {
19487
- audioProcessor,
19488
- videoProcessor
19489
- } = extractProcessorsFromOptions(internalOptions);
19490
19505
  const opts = mergeDefaultOptions(internalOptions, audioDefaults, videoDefaults);
19491
19506
  const constraints = constraintsForOptions(opts);
19492
19507
  // Keep a reference to the promise on DeviceManager and await it in getLocalDevices()