livekit-client 1.11.0 → 1.11.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.
- package/dist/livekit-client.esm.mjs +139 -89
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/room/Room.d.ts +5 -4
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +6 -1
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrack.d.ts +2 -2
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts +3 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +1 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/room/Room.d.ts +5 -4
- package/dist/ts4.2/src/room/events.d.ts +6 -1
- package/dist/ts4.2/src/room/track/LocalAudioTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +2 -2
- package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +3 -1
- package/dist/ts4.2/src/room/utils.d.ts +1 -0
- package/package.json +1 -1
- package/src/room/Room.test.ts +29 -0
- package/src/room/Room.ts +55 -10
- package/src/room/events.ts +6 -0
- package/src/room/track/LocalAudioTrack.ts +4 -3
- package/src/room/track/LocalTrack.ts +13 -10
- package/src/room/track/LocalVideoTrack.ts +8 -4
- package/src/room/track/RemoteVideoTrack.ts +3 -8
- package/src/room/utils.ts +23 -0
| @@ -14187,7 +14187,7 @@ function getMatch(exp, ua) { | |
| 14187 14187 | 
             
              return match && match.length >= id && match[id] || '';
         | 
| 14188 14188 | 
             
            }
         | 
| 14189 14189 |  | 
| 14190 | 
            -
            var version$1 = "1.11. | 
| 14190 | 
            +
            var version$1 = "1.11.2";
         | 
| 14191 14191 |  | 
| 14192 14192 | 
             
            const version = version$1;
         | 
| 14193 14193 | 
             
            const protocolVersion = 9;
         | 
| @@ -14636,6 +14636,27 @@ class Mutex { | |
| 14636 14636 | 
             
                return willUnlock;
         | 
| 14637 14637 | 
             
              }
         | 
| 14638 14638 | 
             
            }
         | 
| 14639 | 
            +
            function unwrapConstraint(constraint) {
         | 
| 14640 | 
            +
              if (typeof constraint === 'string') {
         | 
| 14641 | 
            +
                return constraint;
         | 
| 14642 | 
            +
              }
         | 
| 14643 | 
            +
              if (Array.isArray(constraint)) {
         | 
| 14644 | 
            +
                return constraint[0];
         | 
| 14645 | 
            +
              }
         | 
| 14646 | 
            +
              if (constraint.exact) {
         | 
| 14647 | 
            +
                if (Array.isArray(constraint.exact)) {
         | 
| 14648 | 
            +
                  return constraint.exact[0];
         | 
| 14649 | 
            +
                }
         | 
| 14650 | 
            +
                return constraint.exact;
         | 
| 14651 | 
            +
              }
         | 
| 14652 | 
            +
              if (constraint.ideal) {
         | 
| 14653 | 
            +
                if (Array.isArray(constraint.ideal)) {
         | 
| 14654 | 
            +
                  return constraint.ideal[0];
         | 
| 14655 | 
            +
                }
         | 
| 14656 | 
            +
                return constraint.ideal;
         | 
| 14657 | 
            +
              }
         | 
| 14658 | 
            +
              throw Error('could not unwrap constraint');
         | 
| 14659 | 
            +
            }
         | 
| 14639 14660 |  | 
| 14640 14661 | 
             
            var QueueTaskStatus;
         | 
| 14641 14662 | 
             
            (function (QueueTaskStatus) {
         | 
| @@ -16734,6 +16755,11 @@ var RoomEvent; | |
| 16734 16755 | 
             
               * args: (isLow: boolean, kind: [[DataPacket_Kind]])
         | 
| 16735 16756 | 
             
               */
         | 
| 16736 16757 | 
             
              RoomEvent["DCBufferStatusChanged"] = "dcBufferStatusChanged";
         | 
| 16758 | 
            +
              /**
         | 
| 16759 | 
            +
               * Triggered by a call to room.switchActiveDevice
         | 
| 16760 | 
            +
               * args: (kind: MediaDeviceKind, deviceId: string)
         | 
| 16761 | 
            +
               */
         | 
| 16762 | 
            +
              RoomEvent["ActiveDeviceChanged"] = "activeDeviceChanged";
         | 
| 16737 16763 | 
             
            })(RoomEvent || (RoomEvent = {}));
         | 
| 16738 16764 | 
             
            var ParticipantEvent;
         | 
| 16739 16765 | 
             
            (function (ParticipantEvent) {
         | 
| @@ -18377,8 +18403,56 @@ class LocalTrack extends Track { | |
| 18377 18403 | 
             
                  if (this.isInBackground) {
         | 
| 18378 18404 | 
             
                    this.reacquireTrack = true;
         | 
| 18379 18405 | 
             
                  }
         | 
| 18406 | 
            +
                  this._mediaStreamTrack.removeEventListener('mute', this.pauseUpstream);
         | 
| 18407 | 
            +
                  this._mediaStreamTrack.removeEventListener('unmute', this.resumeUpstream);
         | 
| 18380 18408 | 
             
                  this.emit(TrackEvent.Ended, this);
         | 
| 18381 18409 | 
             
                };
         | 
| 18410 | 
            +
                /**
         | 
| 18411 | 
            +
                 * pauses publishing to the server without disabling the local MediaStreamTrack
         | 
| 18412 | 
            +
                 * this is used to display a user's own video locally while pausing publishing to
         | 
| 18413 | 
            +
                 * the server.
         | 
| 18414 | 
            +
                 * this API is unsupported on Safari < 12 due to a bug
         | 
| 18415 | 
            +
                 **/
         | 
| 18416 | 
            +
                this.pauseUpstream = () => __awaiter(this, void 0, void 0, function* () {
         | 
| 18417 | 
            +
                  const unlock = yield this.pauseUpstreamLock.lock();
         | 
| 18418 | 
            +
                  try {
         | 
| 18419 | 
            +
                    if (this._isUpstreamPaused === true) {
         | 
| 18420 | 
            +
                      return;
         | 
| 18421 | 
            +
                    }
         | 
| 18422 | 
            +
                    if (!this.sender) {
         | 
| 18423 | 
            +
                      livekitLogger.warn('unable to pause upstream for an unpublished track');
         | 
| 18424 | 
            +
                      return;
         | 
| 18425 | 
            +
                    }
         | 
| 18426 | 
            +
                    this._isUpstreamPaused = true;
         | 
| 18427 | 
            +
                    this.emit(TrackEvent.UpstreamPaused, this);
         | 
| 18428 | 
            +
                    const browser = getBrowser();
         | 
| 18429 | 
            +
                    if ((browser === null || browser === void 0 ? void 0 : browser.name) === 'Safari' && compareVersions(browser.version, '12.0') < 0) {
         | 
| 18430 | 
            +
                      // https://bugs.webkit.org/show_bug.cgi?id=184911
         | 
| 18431 | 
            +
                      throw new DeviceUnsupportedError('pauseUpstream is not supported on Safari < 12.');
         | 
| 18432 | 
            +
                    }
         | 
| 18433 | 
            +
                    yield this.sender.replaceTrack(null);
         | 
| 18434 | 
            +
                  } finally {
         | 
| 18435 | 
            +
                    unlock();
         | 
| 18436 | 
            +
                  }
         | 
| 18437 | 
            +
                });
         | 
| 18438 | 
            +
                this.resumeUpstream = () => __awaiter(this, void 0, void 0, function* () {
         | 
| 18439 | 
            +
                  const unlock = yield this.pauseUpstreamLock.lock();
         | 
| 18440 | 
            +
                  try {
         | 
| 18441 | 
            +
                    if (this._isUpstreamPaused === false) {
         | 
| 18442 | 
            +
                      return;
         | 
| 18443 | 
            +
                    }
         | 
| 18444 | 
            +
                    if (!this.sender) {
         | 
| 18445 | 
            +
                      livekitLogger.warn('unable to resume upstream for an unpublished track');
         | 
| 18446 | 
            +
                      return;
         | 
| 18447 | 
            +
                    }
         | 
| 18448 | 
            +
                    this._isUpstreamPaused = false;
         | 
| 18449 | 
            +
                    this.emit(TrackEvent.UpstreamResumed, this);
         | 
| 18450 | 
            +
                    // this operation is noop if mediastreamtrack is already being sent
         | 
| 18451 | 
            +
                    yield this.sender.replaceTrack(this._mediaStreamTrack);
         | 
| 18452 | 
            +
                  } finally {
         | 
| 18453 | 
            +
                    unlock();
         | 
| 18454 | 
            +
                  }
         | 
| 18455 | 
            +
                });
         | 
| 18382 18456 | 
             
                this.reacquireTrack = false;
         | 
| 18383 18457 | 
             
                this.providedByUser = userProvidedTrack;
         | 
| 18384 18458 | 
             
                this.muteLock = new Mutex();
         | 
| @@ -18444,10 +18518,7 @@ class LocalTrack extends Track { | |
| 18444 18518 | 
             
                    // the track is "muted"
         | 
| 18445 18519 | 
             
                    // note this is different from LocalTrack.mute because we do not want to
         | 
| 18446 18520 | 
             
                    // touch MediaStreamTrack.enabled
         | 
| 18447 | 
            -
                    newTrack.addEventListener('mute',  | 
| 18448 | 
            -
                      livekitLogger.info('pausing upstream due to device mute');
         | 
| 18449 | 
            -
                      this.pauseUpstream();
         | 
| 18450 | 
            -
                    });
         | 
| 18521 | 
            +
                    newTrack.addEventListener('mute', this.pauseUpstream);
         | 
| 18451 18522 | 
             
                    newTrack.addEventListener('unmute', this.resumeUpstream);
         | 
| 18452 18523 | 
             
                    this.constraints = newTrack.getConstraints();
         | 
| 18453 18524 | 
             
                  }
         | 
| @@ -18519,7 +18590,7 @@ class LocalTrack extends Track { | |
| 18519 18590 | 
             
                    throw new TrackInvalidError('unable to replace an unpublished track');
         | 
| 18520 18591 | 
             
                  }
         | 
| 18521 18592 | 
             
                  livekitLogger.debug('replace MediaStreamTrack');
         | 
| 18522 | 
            -
                  this.setMediaStreamTrack(track);
         | 
| 18593 | 
            +
                  yield this.setMediaStreamTrack(track);
         | 
| 18523 18594 | 
             
                  // this must be synced *after* setting mediaStreamTrack above, since it relies
         | 
| 18524 18595 | 
             
                  // on the previous state in order to cleanup
         | 
| 18525 18596 | 
             
                  this.providedByUser = userProvidedTrack;
         | 
| @@ -18559,7 +18630,7 @@ class LocalTrack extends Track { | |
| 18559 18630 | 
             
                  const newTrack = mediaStream.getTracks()[0];
         | 
| 18560 18631 | 
             
                  newTrack.addEventListener('ended', this.handleEnded);
         | 
| 18561 18632 | 
             
                  livekitLogger.debug('re-acquired MediaStreamTrack');
         | 
| 18562 | 
            -
                  this.setMediaStreamTrack(newTrack);
         | 
| 18633 | 
            +
                  yield this.setMediaStreamTrack(newTrack);
         | 
| 18563 18634 | 
             
                  this.constraints = constraints;
         | 
| 18564 18635 | 
             
                  if (this.processor) {
         | 
| 18565 18636 | 
             
                    const processor = this.processor;
         | 
| @@ -18605,59 +18676,12 @@ class LocalTrack extends Track { | |
| 18605 18676 | 
             
              stop() {
         | 
| 18606 18677 | 
             
                var _a;
         | 
| 18607 18678 | 
             
                super.stop();
         | 
| 18679 | 
            +
                this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);
         | 
| 18680 | 
            +
                this._mediaStreamTrack.removeEventListener('mute', this.pauseUpstream);
         | 
| 18681 | 
            +
                this._mediaStreamTrack.removeEventListener('unmute', this.resumeUpstream);
         | 
| 18608 18682 | 
             
                (_a = this.processor) === null || _a === void 0 ? void 0 : _a.destroy();
         | 
| 18609 18683 | 
             
                this.processor = undefined;
         | 
| 18610 18684 | 
             
              }
         | 
| 18611 | 
            -
              /**
         | 
| 18612 | 
            -
               * pauses publishing to the server without disabling the local MediaStreamTrack
         | 
| 18613 | 
            -
               * this is used to display a user's own video locally while pausing publishing to
         | 
| 18614 | 
            -
               * the server.
         | 
| 18615 | 
            -
               * this API is unsupported on Safari < 12 due to a bug
         | 
| 18616 | 
            -
               **/
         | 
| 18617 | 
            -
              pauseUpstream() {
         | 
| 18618 | 
            -
                return __awaiter(this, void 0, void 0, function* () {
         | 
| 18619 | 
            -
                  const unlock = yield this.pauseUpstreamLock.lock();
         | 
| 18620 | 
            -
                  try {
         | 
| 18621 | 
            -
                    if (this._isUpstreamPaused === true) {
         | 
| 18622 | 
            -
                      return;
         | 
| 18623 | 
            -
                    }
         | 
| 18624 | 
            -
                    if (!this.sender) {
         | 
| 18625 | 
            -
                      livekitLogger.warn('unable to pause upstream for an unpublished track');
         | 
| 18626 | 
            -
                      return;
         | 
| 18627 | 
            -
                    }
         | 
| 18628 | 
            -
                    this._isUpstreamPaused = true;
         | 
| 18629 | 
            -
                    this.emit(TrackEvent.UpstreamPaused, this);
         | 
| 18630 | 
            -
                    const browser = getBrowser();
         | 
| 18631 | 
            -
                    if ((browser === null || browser === void 0 ? void 0 : browser.name) === 'Safari' && compareVersions(browser.version, '12.0') < 0) {
         | 
| 18632 | 
            -
                      // https://bugs.webkit.org/show_bug.cgi?id=184911
         | 
| 18633 | 
            -
                      throw new DeviceUnsupportedError('pauseUpstream is not supported on Safari < 12.');
         | 
| 18634 | 
            -
                    }
         | 
| 18635 | 
            -
                    yield this.sender.replaceTrack(null);
         | 
| 18636 | 
            -
                  } finally {
         | 
| 18637 | 
            -
                    unlock();
         | 
| 18638 | 
            -
                  }
         | 
| 18639 | 
            -
                });
         | 
| 18640 | 
            -
              }
         | 
| 18641 | 
            -
              resumeUpstream() {
         | 
| 18642 | 
            -
                return __awaiter(this, void 0, void 0, function* () {
         | 
| 18643 | 
            -
                  const unlock = yield this.pauseUpstreamLock.lock();
         | 
| 18644 | 
            -
                  try {
         | 
| 18645 | 
            -
                    if (this._isUpstreamPaused === false) {
         | 
| 18646 | 
            -
                      return;
         | 
| 18647 | 
            -
                    }
         | 
| 18648 | 
            -
                    if (!this.sender) {
         | 
| 18649 | 
            -
                      livekitLogger.warn('unable to resume upstream for an unpublished track');
         | 
| 18650 | 
            -
                      return;
         | 
| 18651 | 
            -
                    }
         | 
| 18652 | 
            -
                    this._isUpstreamPaused = false;
         | 
| 18653 | 
            -
                    this.emit(TrackEvent.UpstreamResumed, this);
         | 
| 18654 | 
            -
                    // this operation is noop if mediastreamtrack is already being sent
         | 
| 18655 | 
            -
                    yield this.sender.replaceTrack(this._mediaStreamTrack);
         | 
| 18656 | 
            -
                  } finally {
         | 
| 18657 | 
            -
                    unlock();
         | 
| 18658 | 
            -
                  }
         | 
| 18659 | 
            -
                });
         | 
| 18660 | 
            -
              }
         | 
| 18661 18685 | 
             
              /**
         | 
| 18662 18686 | 
             
               * Sets a processor on this track.
         | 
| 18663 18687 | 
             
               * See https://github.com/livekit/track-processors-js for example usage
         | 
| @@ -18768,12 +18792,13 @@ class LocalAudioTrack extends LocalTrack { | |
| 18768 18792 | 
             
              setDeviceId(deviceId) {
         | 
| 18769 18793 | 
             
                return __awaiter(this, void 0, void 0, function* () {
         | 
| 18770 18794 | 
             
                  if (this.constraints.deviceId === deviceId) {
         | 
| 18771 | 
            -
                    return;
         | 
| 18795 | 
            +
                    return true;
         | 
| 18772 18796 | 
             
                  }
         | 
| 18773 18797 | 
             
                  this.constraints.deviceId = deviceId;
         | 
| 18774 18798 | 
             
                  if (!this.isMuted) {
         | 
| 18775 18799 | 
             
                    yield this.restartTrack();
         | 
| 18776 18800 | 
             
                  }
         | 
| 18801 | 
            +
                  return unwrapConstraint(deviceId) === this.mediaStreamTrack.getSettings().deviceId;
         | 
| 18777 18802 | 
             
                });
         | 
| 18778 18803 | 
             
              }
         | 
| 18779 18804 | 
             
              mute() {
         | 
| @@ -19361,8 +19386,8 @@ class LocalVideoTrack extends LocalTrack { | |
| 19361 19386 | 
             
              }
         | 
| 19362 19387 | 
             
              setDeviceId(deviceId) {
         | 
| 19363 19388 | 
             
                return __awaiter(this, void 0, void 0, function* () {
         | 
| 19364 | 
            -
                  if (this.constraints.deviceId === deviceId) {
         | 
| 19365 | 
            -
                    return;
         | 
| 19389 | 
            +
                  if (this.constraints.deviceId === deviceId && this._mediaStreamTrack.getSettings().deviceId === unwrapConstraint(deviceId)) {
         | 
| 19390 | 
            +
                    return true;
         | 
| 19366 19391 | 
             
                  }
         | 
| 19367 19392 | 
             
                  this.constraints.deviceId = deviceId;
         | 
| 19368 19393 | 
             
                  // when video is muted, underlying media stream track is stopped and
         | 
| @@ -19370,6 +19395,7 @@ class LocalVideoTrack extends LocalTrack { | |
| 19370 19395 | 
             
                  if (!this.isMuted) {
         | 
| 19371 19396 | 
             
                    yield this.restartTrack();
         | 
| 19372 19397 | 
             
                  }
         | 
| 19398 | 
            +
                  return unwrapConstraint(deviceId) === this._mediaStreamTrack.getSettings().deviceId;
         | 
| 19373 19399 | 
             
                });
         | 
| 19374 19400 | 
             
              }
         | 
| 19375 19401 | 
             
              restartTrack(options) {
         | 
| @@ -19864,7 +19890,6 @@ class RemoteVideoTrack extends RemoteTrack { | |
| 19864 19890 | 
             
              constructor(mediaTrack, sid, receiver, adaptiveStreamSettings) {
         | 
| 19865 19891 | 
             
                super(mediaTrack, sid, Track.Kind.Video, receiver);
         | 
| 19866 19892 | 
             
                this.elementInfos = [];
         | 
| 19867 | 
            -
                this.isObserved = false;
         | 
| 19868 19893 | 
             
                this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () {
         | 
| 19869 19894 | 
             
                  if (!this.receiver) {
         | 
| 19870 19895 | 
             
                    this._currentBitrate = 0;
         | 
| @@ -19884,10 +19909,10 @@ class RemoteVideoTrack extends RemoteTrack { | |
| 19884 19909 | 
             
              get isAdaptiveStream() {
         | 
| 19885 19910 | 
             
                return this.adaptiveStreamSettings !== undefined;
         | 
| 19886 19911 | 
             
              }
         | 
| 19912 | 
            +
              /**
         | 
| 19913 | 
            +
               * Note: When using adaptiveStream, you need to use remoteVideoTrack.attach() to add the track to a HTMLVideoElement, otherwise your video tracks might never start
         | 
| 19914 | 
            +
               */
         | 
| 19887 19915 | 
             
              get mediaStreamTrack() {
         | 
| 19888 | 
            -
                if (this.isAdaptiveStream && !this.isObserved) {
         | 
| 19889 | 
            -
                  livekitLogger.warn('When using adaptiveStream, you need to use remoteVideoTrack.attach() to add the track to a HTMLVideoElement, otherwise your video tracks might never start');
         | 
| 19890 | 
            -
                }
         | 
| 19891 19916 | 
             
                return this._mediaStreamTrack;
         | 
| 19892 19917 | 
             
              }
         | 
| 19893 19918 | 
             
              /** @internal */
         | 
| @@ -19936,7 +19961,6 @@ class RemoteVideoTrack extends RemoteTrack { | |
| 19936 19961 | 
             
                  // the tab comes into focus for the first time.
         | 
| 19937 19962 | 
             
                  this.debouncedHandleResize();
         | 
| 19938 19963 | 
             
                  this.updateVisibility();
         | 
| 19939 | 
            -
                  this.isObserved = true;
         | 
| 19940 19964 | 
             
                } else {
         | 
| 19941 19965 | 
             
                  livekitLogger.warn('visibility resize observer not triggered');
         | 
| 19942 19966 | 
             
                }
         | 
| @@ -22064,6 +22088,7 @@ class Room extends EventEmitter { | |
| 22064 22088 | 
             
               */
         | 
| 22065 22089 | 
             
              constructor(options) {
         | 
| 22066 22090 | 
             
                var _this;
         | 
| 22091 | 
            +
                var _a;
         | 
| 22067 22092 | 
             
                super();
         | 
| 22068 22093 | 
             
                _this = this;
         | 
| 22069 22094 | 
             
                this.state = ConnectionState.Disconnected;
         | 
| @@ -22089,7 +22114,7 @@ class Room extends EventEmitter { | |
| 22089 22114 | 
             
                  this.setAndEmitConnectionState(ConnectionState.Connecting);
         | 
| 22090 22115 | 
             
                  const urlProvider = new RegionUrlProvider(url, token);
         | 
| 22091 22116 | 
             
                  const connectFn = (resolve, reject, regionUrl) => __awaiter(this, void 0, void 0, function* () {
         | 
| 22092 | 
            -
                    var  | 
| 22117 | 
            +
                    var _b;
         | 
| 22093 22118 | 
             
                    if (this.abortController) {
         | 
| 22094 22119 | 
             
                      this.abortController.abort();
         | 
| 22095 22120 | 
             
                    }
         | 
| @@ -22104,7 +22129,7 @@ class Room extends EventEmitter { | |
| 22104 22129 | 
             
                      if (isCloud(new URL(url)) && e instanceof ConnectionError && e.reason !== 3 /* ConnectionErrorReason.Cancelled */) {
         | 
| 22105 22130 | 
             
                        let nextUrl = null;
         | 
| 22106 22131 | 
             
                        try {
         | 
| 22107 | 
            -
                          nextUrl = yield urlProvider.getNextBestRegionUrl(( | 
| 22132 | 
            +
                          nextUrl = yield urlProvider.getNextBestRegionUrl((_b = this.abortController) === null || _b === void 0 ? void 0 : _b.signal);
         | 
| 22108 22133 | 
             
                        } catch (error) {
         | 
| 22109 22134 | 
             
                          if (error instanceof ConnectionError && (error.status === 401 || error.reason === 3 /* ConnectionErrorReason.Cancelled */)) {
         | 
| 22110 22135 | 
             
                            reject(error);
         | 
| @@ -22166,7 +22191,7 @@ class Room extends EventEmitter { | |
| 22166 22191 | 
             
                  }
         | 
| 22167 22192 | 
             
                };
         | 
| 22168 22193 | 
             
                this.attemptConnection = (url, token, opts, abortController) => __awaiter(this, void 0, void 0, function* () {
         | 
| 22169 | 
            -
                  var  | 
| 22194 | 
            +
                  var _c;
         | 
| 22170 22195 | 
             
                  if (this.state === ConnectionState.Reconnecting) {
         | 
| 22171 22196 | 
             
                    livekitLogger.info('Reconnection attempt replaced by new connection attempt');
         | 
| 22172 22197 | 
             
                    // make sure we close and recreate the existing engine in order to get rid of any potentially ongoing reconnection attempts
         | 
| @@ -22225,7 +22250,7 @@ class Room extends EventEmitter { | |
| 22225 22250 | 
             
                  }
         | 
| 22226 22251 | 
             
                  if (isWeb()) {
         | 
| 22227 22252 | 
             
                    document.addEventListener('freeze', this.onPageLeave);
         | 
| 22228 | 
            -
                    ( | 
| 22253 | 
            +
                    (_c = navigator.mediaDevices) === null || _c === void 0 ? void 0 : _c.addEventListener('devicechange', this.handleDeviceChange);
         | 
| 22229 22254 | 
             
                  }
         | 
| 22230 22255 | 
             
                  this.setAndEmitConnectionState(ConnectionState.Connected);
         | 
| 22231 22256 | 
             
                  this.emit(RoomEvent.Connected);
         | 
| @@ -22237,7 +22262,7 @@ class Room extends EventEmitter { | |
| 22237 22262 | 
             
                this.disconnect = function () {
         | 
| 22238 22263 | 
             
                  let stopTracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
         | 
| 22239 22264 | 
             
                  return __awaiter(_this, void 0, void 0, function* () {
         | 
| 22240 | 
            -
                    var  | 
| 22265 | 
            +
                    var _d, _e, _f, _g;
         | 
| 22241 22266 | 
             
                    const unlock = yield this.disconnectLock.lock();
         | 
| 22242 22267 | 
             
                    try {
         | 
| 22243 22268 | 
             
                      if (this.state === ConnectionState.Disconnected) {
         | 
| @@ -22250,13 +22275,13 @@ class Room extends EventEmitter { | |
| 22250 22275 | 
             
                      if (this.state === ConnectionState.Connecting || this.state === ConnectionState.Reconnecting) {
         | 
| 22251 22276 | 
             
                        // try aborting pending connection attempt
         | 
| 22252 22277 | 
             
                        livekitLogger.warn('abort connection attempt');
         | 
| 22253 | 
            -
                        ( | 
| 22278 | 
            +
                        (_d = this.abortController) === null || _d === void 0 ? void 0 : _d.abort();
         | 
| 22254 22279 | 
             
                        // in case the abort controller didn't manage to cancel the connection attempt, reject the connect promise explicitly
         | 
| 22255 | 
            -
                        ( | 
| 22280 | 
            +
                        (_f = (_e = this.connectFuture) === null || _e === void 0 ? void 0 : _e.reject) === null || _f === void 0 ? void 0 : _f.call(_e, new ConnectionError('Client initiated disconnect'));
         | 
| 22256 22281 | 
             
                        this.connectFuture = undefined;
         | 
| 22257 22282 | 
             
                      }
         | 
| 22258 22283 | 
             
                      // send leave
         | 
| 22259 | 
            -
                      if (( | 
| 22284 | 
            +
                      if ((_g = this.engine) === null || _g === void 0 ? void 0 : _g.client.isConnected) {
         | 
| 22260 22285 | 
             
                        yield this.engine.client.sendLeave();
         | 
| 22261 22286 | 
             
                      }
         | 
| 22262 22287 | 
             
                      // close engine (also closes client)
         | 
| @@ -22326,7 +22351,7 @@ class Room extends EventEmitter { | |
| 22326 22351 | 
             
                    livekitLogger.debug("fully reconnected to server", {
         | 
| 22327 22352 | 
             
                      region: joinResponse.serverRegion
         | 
| 22328 22353 | 
             
                    });
         | 
| 22329 | 
            -
                  } catch ( | 
| 22354 | 
            +
                  } catch (_h) {
         | 
| 22330 22355 | 
             
                    // reconnection failed, handleDisconnect is being invoked already, just return here
         | 
| 22331 22356 | 
             
                    return;
         | 
| 22332 22357 | 
             
                  }
         | 
| @@ -22551,6 +22576,16 @@ class Room extends EventEmitter { | |
| 22551 22576 | 
             
                this.options.publishDefaults = Object.assign(Object.assign({}, publishDefaults), options === null || options === void 0 ? void 0 : options.publishDefaults);
         | 
| 22552 22577 | 
             
                this.maybeCreateEngine();
         | 
| 22553 22578 | 
             
                this.disconnectLock = new Mutex();
         | 
| 22579 | 
            +
                this.activeDeviceMap = new Map();
         | 
| 22580 | 
            +
                if (this.options.videoCaptureDefaults.deviceId) {
         | 
| 22581 | 
            +
                  this.activeDeviceMap.set('videoinput', unwrapConstraint(this.options.videoCaptureDefaults.deviceId));
         | 
| 22582 | 
            +
                }
         | 
| 22583 | 
            +
                if (this.options.audioCaptureDefaults.deviceId) {
         | 
| 22584 | 
            +
                  this.activeDeviceMap.set('audioinput', unwrapConstraint(this.options.audioCaptureDefaults.deviceId));
         | 
| 22585 | 
            +
                }
         | 
| 22586 | 
            +
                if ((_a = this.options.audioOutput) === null || _a === void 0 ? void 0 : _a.deviceId) {
         | 
| 22587 | 
            +
                  this.switchActiveDevice('audiooutput', unwrapConstraint(this.options.audioOutput.deviceId));
         | 
| 22588 | 
            +
                }
         | 
| 22554 22589 | 
             
                this.localParticipant = new LocalParticipant('', '', this.engine, this.options);
         | 
| 22555 22590 | 
             
              }
         | 
| 22556 22591 | 
             
              /**
         | 
| @@ -22816,15 +22851,16 @@ class Room extends EventEmitter { | |
| 22816 22851 | 
             
              }
         | 
| 22817 22852 | 
             
              /**
         | 
| 22818 22853 | 
             
               * Returns the active audio output device used in this room.
         | 
| 22819 | 
            -
               *
         | 
| 22820 | 
            -
               * Note: to get the active `audioinput` or `videoinput` use [[LocalTrack.getDeviceId()]]
         | 
| 22821 | 
            -
               *
         | 
| 22822 22854 | 
             
               * @return the previously successfully set audio output device ID or an empty string if the default device is used.
         | 
| 22855 | 
            +
               * @deprecated use `getActiveDevice('audiooutput')` instead
         | 
| 22823 22856 | 
             
               */
         | 
| 22824 22857 | 
             
              getActiveAudioOutputDevice() {
         | 
| 22825 22858 | 
             
                var _a, _b;
         | 
| 22826 22859 | 
             
                return (_b = (_a = this.options.audioOutput) === null || _a === void 0 ? void 0 : _a.deviceId) !== null && _b !== void 0 ? _b : '';
         | 
| 22827 22860 | 
             
              }
         | 
| 22861 | 
            +
              getActiveDevice(kind) {
         | 
| 22862 | 
            +
                return this.activeDeviceMap.get(kind);
         | 
| 22863 | 
            +
              }
         | 
| 22828 22864 | 
             
              /**
         | 
| 22829 22865 | 
             
               * Switches all active devices used in this room to the given device.
         | 
| 22830 22866 | 
             
               *
         | 
| @@ -22837,21 +22873,24 @@ class Room extends EventEmitter { | |
| 22837 22873 | 
             
               */
         | 
| 22838 22874 | 
             
              switchActiveDevice(kind, deviceId) {
         | 
| 22839 22875 | 
             
                let exact = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
         | 
| 22840 | 
            -
                var _a;
         | 
| 22841 | 
            -
                var  | 
| 22876 | 
            +
                var _a, _b;
         | 
| 22877 | 
            +
                var _c;
         | 
| 22842 22878 | 
             
                return __awaiter(this, void 0, void 0, function* () {
         | 
| 22879 | 
            +
                  let deviceHasChanged = false;
         | 
| 22880 | 
            +
                  let success = true;
         | 
| 22843 22881 | 
             
                  const deviceConstraint = exact ? {
         | 
| 22844 22882 | 
             
                    exact: deviceId
         | 
| 22845 22883 | 
             
                  } : deviceId;
         | 
| 22846 22884 | 
             
                  if (kind === 'audioinput') {
         | 
| 22847 22885 | 
             
                    const prevDeviceId = this.options.audioCaptureDefaults.deviceId;
         | 
| 22848 22886 | 
             
                    this.options.audioCaptureDefaults.deviceId = deviceConstraint;
         | 
| 22887 | 
            +
                    deviceHasChanged = prevDeviceId !== deviceConstraint;
         | 
| 22849 22888 | 
             
                    const tracks = Array.from(this.localParticipant.audioTracks.values()).filter(track => track.source === Track.Source.Microphone);
         | 
| 22850 22889 | 
             
                    try {
         | 
| 22851 | 
            -
                      yield Promise.all(tracks.map(t => {
         | 
| 22890 | 
            +
                      success = (yield Promise.all(tracks.map(t => {
         | 
| 22852 22891 | 
             
                        var _a;
         | 
| 22853 22892 | 
             
                        return (_a = t.audioTrack) === null || _a === void 0 ? void 0 : _a.setDeviceId(deviceConstraint);
         | 
| 22854 | 
            -
                      }));
         | 
| 22893 | 
            +
                      }))).every(val => val === true);
         | 
| 22855 22894 | 
             
                    } catch (e) {
         | 
| 22856 22895 | 
             
                      this.options.audioCaptureDefaults.deviceId = prevDeviceId;
         | 
| 22857 22896 | 
             
                      throw e;
         | 
| @@ -22859,33 +22898,44 @@ class Room extends EventEmitter { | |
| 22859 22898 | 
             
                  } else if (kind === 'videoinput') {
         | 
| 22860 22899 | 
             
                    const prevDeviceId = this.options.videoCaptureDefaults.deviceId;
         | 
| 22861 22900 | 
             
                    this.options.videoCaptureDefaults.deviceId = deviceConstraint;
         | 
| 22901 | 
            +
                    deviceHasChanged = prevDeviceId !== deviceConstraint;
         | 
| 22862 22902 | 
             
                    const tracks = Array.from(this.localParticipant.videoTracks.values()).filter(track => track.source === Track.Source.Camera);
         | 
| 22863 22903 | 
             
                    try {
         | 
| 22864 | 
            -
                      yield Promise.all(tracks.map(t => {
         | 
| 22904 | 
            +
                      success = (yield Promise.all(tracks.map(t => {
         | 
| 22865 22905 | 
             
                        var _a;
         | 
| 22866 22906 | 
             
                        return (_a = t.videoTrack) === null || _a === void 0 ? void 0 : _a.setDeviceId(deviceConstraint);
         | 
| 22867 | 
            -
                      }));
         | 
| 22907 | 
            +
                      }))).every(val => val === true);
         | 
| 22868 22908 | 
             
                    } catch (e) {
         | 
| 22869 22909 | 
             
                      this.options.videoCaptureDefaults.deviceId = prevDeviceId;
         | 
| 22870 22910 | 
             
                      throw e;
         | 
| 22871 22911 | 
             
                    }
         | 
| 22872 22912 | 
             
                  } else if (kind === 'audiooutput') {
         | 
| 22873 | 
            -
                     | 
| 22874 | 
            -
                    if (!supportsSetSinkId()) {
         | 
| 22913 | 
            +
                    if (!supportsSetSinkId() && !this.options.expWebAudioMix || this.audioContext && !('setSinkId' in this.audioContext)) {
         | 
| 22875 22914 | 
             
                      throw new Error('cannot switch audio output, setSinkId not supported');
         | 
| 22876 22915 | 
             
                    }
         | 
| 22877 | 
            -
                    (_a = ( | 
| 22916 | 
            +
                    (_a = (_c = this.options).audioOutput) !== null && _a !== void 0 ? _a : _c.audioOutput = {};
         | 
| 22878 22917 | 
             
                    const prevDeviceId = this.options.audioOutput.deviceId;
         | 
| 22879 22918 | 
             
                    this.options.audioOutput.deviceId = deviceId;
         | 
| 22919 | 
            +
                    deviceHasChanged = prevDeviceId !== deviceConstraint;
         | 
| 22880 22920 | 
             
                    try {
         | 
| 22881 | 
            -
                       | 
| 22882 | 
            -
                         | 
| 22883 | 
            -
             | 
| 22921 | 
            +
                      if (this.options.expWebAudioMix) {
         | 
| 22922 | 
            +
                        // @ts-expect-error setSinkId is not yet in the typescript type of AudioContext
         | 
| 22923 | 
            +
                        (_b = this.audioContext) === null || _b === void 0 ? void 0 : _b.setSinkId(deviceId);
         | 
| 22924 | 
            +
                      } else {
         | 
| 22925 | 
            +
                        yield Promise.all(Array.from(this.participants.values()).map(p => p.setAudioOutput({
         | 
| 22926 | 
            +
                          deviceId
         | 
| 22927 | 
            +
                        })));
         | 
| 22928 | 
            +
                      }
         | 
| 22884 22929 | 
             
                    } catch (e) {
         | 
| 22885 22930 | 
             
                      this.options.audioOutput.deviceId = prevDeviceId;
         | 
| 22886 22931 | 
             
                      throw e;
         | 
| 22887 22932 | 
             
                    }
         | 
| 22888 22933 | 
             
                  }
         | 
| 22934 | 
            +
                  if (deviceHasChanged && success) {
         | 
| 22935 | 
            +
                    this.activeDeviceMap.set(kind, deviceId);
         | 
| 22936 | 
            +
                    this.emit(RoomEvent.ActiveDeviceChanged, kind, deviceId);
         | 
| 22937 | 
            +
                  }
         | 
| 22938 | 
            +
                  return success;
         | 
| 22889 22939 | 
             
                });
         | 
| 22890 22940 | 
             
              }
         | 
| 22891 22941 | 
             
              setupLocalParticipantEvents() {
         |