livekit-client 2.0.3 → 2.0.4
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.e2ee.worker.js +1 -1
- package/dist/livekit-client.e2ee.worker.js.map +1 -1
- package/dist/livekit-client.e2ee.worker.mjs +1 -0
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +90 -26
- 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/api/SignalClient.d.ts.map +1 -1
- package/dist/src/e2ee/E2eeManager.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +2 -0
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/logger.d.ts +2 -0
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/room/DeviceManager.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +1 -0
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +2 -1
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrack.d.ts +3 -1
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +10 -0
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/track/types.d.ts +4 -0
- package/dist/src/room/track/types.d.ts.map +1 -1
- package/dist/ts4.2/src/e2ee/types.d.ts +2 -0
- package/dist/ts4.2/src/index.d.ts +2 -2
- package/dist/ts4.2/src/logger.d.ts +2 -0
- package/dist/ts4.2/src/room/RTCEngine.d.ts +1 -0
- package/dist/ts4.2/src/room/events.d.ts +2 -1
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +3 -1
- package/dist/ts4.2/src/room/track/options.d.ts +10 -0
- package/dist/ts4.2/src/room/track/types.d.ts +4 -0
- package/package.json +1 -1
- package/src/api/SignalClient.ts +1 -0
- package/src/e2ee/E2eeManager.ts +2 -1
- package/src/e2ee/types.ts +2 -0
- package/src/e2ee/worker/e2ee.worker.ts +1 -0
- package/src/index.ts +2 -1
- package/src/logger.ts +2 -0
- package/src/room/DeviceManager.ts +10 -1
- package/src/room/RTCEngine.ts +14 -0
- package/src/room/Room.ts +11 -0
- package/src/room/events.ts +1 -0
- package/src/room/participant/LocalParticipant.ts +4 -4
- package/src/room/track/LocalAudioTrack.ts +10 -0
- package/src/room/track/LocalTrack.ts +20 -3
- package/src/room/track/LocalVideoTrack.ts +10 -0
- package/src/room/track/options.ts +41 -8
- package/src/room/track/types.ts +5 -0
@@ -352,7 +352,7 @@ function setLogExtension(extension) {
|
|
352
352
|
};
|
353
353
|
logger.setLevel(logger.getLevel()); // Be sure to call setLevel method in order to apply plugin
|
354
354
|
}
|
355
|
-
loglevelExports.getLogger('lk-e2ee');
|
355
|
+
const workerLogger = loglevelExports.getLogger('lk-e2ee');
|
356
356
|
|
357
357
|
// Copyright 2021-2023 Buf Technologies, Inc.
|
358
358
|
//
|
@@ -10537,6 +10537,7 @@ var EngineEvent;
|
|
10537
10537
|
EngineEvent["RemoteMute"] = "remoteMute";
|
10538
10538
|
EngineEvent["SubscribedQualityUpdate"] = "subscribedQualityUpdate";
|
10539
10539
|
EngineEvent["LocalTrackUnpublished"] = "localTrackUnpublished";
|
10540
|
+
EngineEvent["Offline"] = "offline";
|
10540
10541
|
})(EngineEvent || (EngineEvent = {}));
|
10541
10542
|
var TrackEvent;
|
10542
10543
|
(function (TrackEvent) {
|
@@ -10710,7 +10711,7 @@ function getMatch(exp, ua) {
|
|
10710
10711
|
return match && match.length >= id && match[id] || '';
|
10711
10712
|
}
|
10712
10713
|
|
10713
|
-
var version$1 = "2.0.
|
10714
|
+
var version$1 = "2.0.4";
|
10714
10715
|
|
10715
10716
|
const version = version$1;
|
10716
10717
|
const protocolVersion = 12;
|
@@ -10737,21 +10738,35 @@ CriticalTimers.clearInterval = function () {
|
|
10737
10738
|
};
|
10738
10739
|
|
10739
10740
|
class VideoPreset {
|
10740
|
-
constructor(
|
10741
|
-
|
10742
|
-
|
10743
|
-
|
10744
|
-
|
10745
|
-
|
10746
|
-
|
10747
|
-
|
10741
|
+
constructor(widthOrOptions, height, maxBitrate, maxFramerate, priority) {
|
10742
|
+
if (typeof widthOrOptions === 'object') {
|
10743
|
+
this.width = widthOrOptions.width;
|
10744
|
+
this.height = widthOrOptions.height;
|
10745
|
+
this.aspectRatio = widthOrOptions.aspectRatio;
|
10746
|
+
this.encoding = {
|
10747
|
+
maxBitrate: widthOrOptions.maxBitrate,
|
10748
|
+
maxFramerate: widthOrOptions.maxFramerate,
|
10749
|
+
priority: widthOrOptions.priority
|
10750
|
+
};
|
10751
|
+
} else if (height !== undefined && maxBitrate !== undefined) {
|
10752
|
+
this.width = widthOrOptions;
|
10753
|
+
this.height = height;
|
10754
|
+
this.aspectRatio = widthOrOptions / height;
|
10755
|
+
this.encoding = {
|
10756
|
+
maxBitrate,
|
10757
|
+
maxFramerate,
|
10758
|
+
priority
|
10759
|
+
};
|
10760
|
+
} else {
|
10761
|
+
throw new TypeError('Unsupported options: provide at least width, height and maxBitrate');
|
10762
|
+
}
|
10748
10763
|
}
|
10749
10764
|
get resolution() {
|
10750
10765
|
return {
|
10751
10766
|
width: this.width,
|
10752
10767
|
height: this.height,
|
10753
10768
|
frameRate: this.encoding.maxFramerate,
|
10754
|
-
aspectRatio: this.
|
10769
|
+
aspectRatio: this.aspectRatio
|
10755
10770
|
};
|
10756
10771
|
}
|
10757
10772
|
}
|
@@ -14164,7 +14179,16 @@ class DeviceManager {
|
|
14164
14179
|
// resolve actual device id if it's 'default': Chrome returns it when no
|
14165
14180
|
// device has been chosen
|
14166
14181
|
const devices = yield this.getDevices(kind);
|
14167
|
-
|
14182
|
+
// `default` devices will have the same groupId as the entry with the actual device id so we store the counts for each group id
|
14183
|
+
const groupIdCounts = new Map(devices.map(d => [d.groupId, 0]));
|
14184
|
+
devices.forEach(d => {
|
14185
|
+
var _a;
|
14186
|
+
return groupIdCounts.set(d.groupId, ((_a = groupIdCounts.get(d.groupId)) !== null && _a !== void 0 ? _a : 0) + 1);
|
14187
|
+
});
|
14188
|
+
const device = devices.find(d => {
|
14189
|
+
var _a;
|
14190
|
+
return (groupId === d.groupId || ((_a = groupIdCounts.get(d.groupId)) !== null && _a !== void 0 ? _a : 0) > 1) && d.deviceId !== defaultId;
|
14191
|
+
});
|
14168
14192
|
return device === null || device === void 0 ? void 0 : device.deviceId;
|
14169
14193
|
});
|
14170
14194
|
}
|
@@ -14372,18 +14396,25 @@ class LocalTrack extends Track {
|
|
14372
14396
|
return this;
|
14373
14397
|
});
|
14374
14398
|
}
|
14375
|
-
replaceTrack(track) {
|
14376
|
-
let userProvidedTrack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
14399
|
+
replaceTrack(track, userProvidedOrOptions) {
|
14377
14400
|
return __awaiter(this, void 0, void 0, function* () {
|
14378
14401
|
if (!this.sender) {
|
14379
14402
|
throw new TrackInvalidError('unable to replace an unpublished track');
|
14380
14403
|
}
|
14404
|
+
let userProvidedTrack;
|
14405
|
+
let stopProcessor;
|
14406
|
+
if (typeof userProvidedOrOptions === 'boolean') {
|
14407
|
+
userProvidedTrack = userProvidedOrOptions;
|
14408
|
+
} else if (userProvidedOrOptions !== undefined) {
|
14409
|
+
userProvidedTrack = userProvidedOrOptions.userProvidedTrack;
|
14410
|
+
stopProcessor = userProvidedOrOptions.stopProcessor;
|
14411
|
+
}
|
14412
|
+
this.providedByUser = userProvidedTrack !== null && userProvidedTrack !== void 0 ? userProvidedTrack : true;
|
14381
14413
|
this.log.debug('replace MediaStreamTrack', this.logContext);
|
14382
14414
|
yield this.setMediaStreamTrack(track);
|
14383
14415
|
// this must be synced *after* setting mediaStreamTrack above, since it relies
|
14384
14416
|
// on the previous state in order to cleanup
|
14385
|
-
this.
|
14386
|
-
if (this.processor) {
|
14417
|
+
if (stopProcessor && this.processor) {
|
14387
14418
|
yield this.stopProcessor();
|
14388
14419
|
}
|
14389
14420
|
return this;
|
@@ -14685,7 +14716,8 @@ class E2EEManager extends eventsExports.EventEmitter {
|
|
14685
14716
|
const msg = {
|
14686
14717
|
kind: 'init',
|
14687
14718
|
data: {
|
14688
|
-
keyProviderOptions: this.keyProvider.getOptions()
|
14719
|
+
keyProviderOptions: this.keyProvider.getOptions(),
|
14720
|
+
loglevel: workerLogger.getLevel()
|
14689
14721
|
}
|
14690
14722
|
};
|
14691
14723
|
if (this.worker) {
|
@@ -15123,6 +15155,7 @@ class SignalClient {
|
|
15123
15155
|
};
|
15124
15156
|
this.ws.onerror = ev => __awaiter(this, void 0, void 0, function* () {
|
15125
15157
|
if (this.state !== SignalConnectionState.CONNECTED) {
|
15158
|
+
this.state = SignalConnectionState.DISCONNECTED;
|
15126
15159
|
clearTimeout(wsTimeout);
|
15127
15160
|
try {
|
15128
15161
|
const resp = yield fetch("http".concat(url.substring(2), "/validate").concat(params));
|
@@ -17532,6 +17565,12 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17532
17565
|
this.handleDisconnect('peerconnection failed', subscriberState === 'failed' ? ReconnectReason.RR_SUBSCRIBER_FAILED : ReconnectReason.RR_PUBLISHER_FAILED);
|
17533
17566
|
}
|
17534
17567
|
}
|
17568
|
+
// detect cases where both signal client and peer connection are severed and assume that user has lost network connection
|
17569
|
+
const isSignalSevered = this.client.isDisconnected || this.client.currentState === SignalConnectionState.RECONNECTING;
|
17570
|
+
const isPCSevered = [PCTransportState.FAILED, PCTransportState.CLOSING, PCTransportState.CLOSED].includes(connectionState);
|
17571
|
+
if (isSignalSevered && isPCSevered && !this._isClosed) {
|
17572
|
+
this.emit(EngineEvent.Offline);
|
17573
|
+
}
|
17535
17574
|
});
|
17536
17575
|
this.pcManager.onTrack = ev => {
|
17537
17576
|
this.emit(EngineEvent.MediaTrackAdded, ev.track, ev.streams[0], ev.receiver);
|
@@ -18362,6 +18401,10 @@ class LocalAudioTrack extends LocalTrack {
|
|
18362
18401
|
return __awaiter(this, void 0, void 0, function* () {
|
18363
18402
|
const unlock = yield this.muteLock.lock();
|
18364
18403
|
try {
|
18404
|
+
if (this.isMuted) {
|
18405
|
+
this.log.debug('Track already muted', this.logContext);
|
18406
|
+
return this;
|
18407
|
+
}
|
18365
18408
|
// disabled special handling as it will cause BT headsets to switch communication modes
|
18366
18409
|
if (this.source === Track.Source.Microphone && this.stopOnMute && !this.isUserProvided) {
|
18367
18410
|
this.log.debug('stopping mic track', this.logContext);
|
@@ -18384,6 +18427,10 @@ class LocalAudioTrack extends LocalTrack {
|
|
18384
18427
|
return __awaiter(this, void 0, void 0, function* () {
|
18385
18428
|
const unlock = yield this.muteLock.lock();
|
18386
18429
|
try {
|
18430
|
+
if (!this.isMuted) {
|
18431
|
+
this.log.debug('Track already unmuted', this.logContext);
|
18432
|
+
return this;
|
18433
|
+
}
|
18387
18434
|
const deviceHasChanged = this._constraints.deviceId && this._mediaStreamTrack.getSettings().deviceId !== unwrapConstraint(this._constraints.deviceId);
|
18388
18435
|
if (this.source === Track.Source.Microphone && (this.stopOnMute || this._mediaStreamTrack.readyState === 'ended' || deviceHasChanged) && !this.isUserProvided) {
|
18389
18436
|
this.log.debug('reacquiring mic track', this.logContext);
|
@@ -18953,6 +19000,10 @@ class LocalVideoTrack extends LocalTrack {
|
|
18953
19000
|
return __awaiter(this, void 0, void 0, function* () {
|
18954
19001
|
const unlock = yield this.muteLock.lock();
|
18955
19002
|
try {
|
19003
|
+
if (this.isMuted) {
|
19004
|
+
this.log.debug('Track already muted', this.logContext);
|
19005
|
+
return this;
|
19006
|
+
}
|
18956
19007
|
if (this.source === Track.Source.Camera && !this.isUserProvided) {
|
18957
19008
|
this.log.debug('stopping camera track', this.logContext);
|
18958
19009
|
// also stop the track, so that camera indicator is turned off
|
@@ -18974,6 +19025,10 @@ class LocalVideoTrack extends LocalTrack {
|
|
18974
19025
|
return __awaiter(this, void 0, void 0, function* () {
|
18975
19026
|
const unlock = yield this.muteLock.lock();
|
18976
19027
|
try {
|
19028
|
+
if (!this.isMuted) {
|
19029
|
+
this.log.debug('Track already unmuted', this.logContext);
|
19030
|
+
return this;
|
19031
|
+
}
|
18977
19032
|
if (this.source === Track.Source.Camera && !this.isUserProvided) {
|
18978
19033
|
this.log.debug('reacquiring camera track', this.logContext);
|
18979
19034
|
yield this.restartTrack();
|
@@ -20829,6 +20884,9 @@ class LocalParticipant extends Participant {
|
|
20829
20884
|
publishTrack(track, options) {
|
20830
20885
|
var _a, _b, _c, _d;
|
20831
20886
|
return __awaiter(this, void 0, void 0, function* () {
|
20887
|
+
if (track instanceof LocalAudioTrack) {
|
20888
|
+
track.setAudioContext(this.audioContext);
|
20889
|
+
}
|
20832
20890
|
yield (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.promise;
|
20833
20891
|
if (track instanceof LocalTrack && this.pendingPublishPromises.has(track)) {
|
20834
20892
|
yield this.pendingPublishPromises.get(track);
|
@@ -20878,9 +20936,6 @@ class LocalParticipant extends Participant {
|
|
20878
20936
|
loggerContextCb: () => this.logContext
|
20879
20937
|
});
|
20880
20938
|
}
|
20881
|
-
if (track instanceof LocalAudioTrack) {
|
20882
|
-
track.setAudioContext(this.audioContext);
|
20883
|
-
}
|
20884
20939
|
// is it already published? if so skip
|
20885
20940
|
let existingPublication;
|
20886
20941
|
this.trackPublications.forEach(publication => {
|
@@ -22180,6 +22235,7 @@ class Room extends eventsExports.EventEmitter {
|
|
22180
22235
|
});
|
22181
22236
|
};
|
22182
22237
|
this.onPageLeave = () => __awaiter(this, void 0, void 0, function* () {
|
22238
|
+
this.log.info('Page leave detected, disconnecting', this.logContext);
|
22183
22239
|
yield this.disconnect();
|
22184
22240
|
});
|
22185
22241
|
/**
|
@@ -22678,7 +22734,11 @@ class Room extends eventsExports.EventEmitter {
|
|
22678
22734
|
if (this.state === ConnectionState.Reconnecting || this.isResuming) {
|
22679
22735
|
this.sendSyncState();
|
22680
22736
|
}
|
22681
|
-
}).on(EngineEvent.Restarting, this.handleRestarting).on(EngineEvent.SignalRestarted, this.handleSignalRestarted).on(EngineEvent.
|
22737
|
+
}).on(EngineEvent.Restarting, this.handleRestarting).on(EngineEvent.SignalRestarted, this.handleSignalRestarted).on(EngineEvent.Offline, () => {
|
22738
|
+
if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) {
|
22739
|
+
this.emit(RoomEvent.Reconnecting);
|
22740
|
+
}
|
22741
|
+
}).on(EngineEvent.DCBufferStatusChanged, (status, kind) => {
|
22682
22742
|
this.emit(RoomEvent.DCBufferStatusChanged, status, kind);
|
22683
22743
|
});
|
22684
22744
|
if (this.localParticipant) {
|
@@ -22895,8 +22955,8 @@ class Room extends eventsExports.EventEmitter {
|
|
22895
22955
|
*/
|
22896
22956
|
switchActiveDevice(kind, deviceId) {
|
22897
22957
|
let exact = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
22898
|
-
var _a, _b;
|
22899
|
-
var
|
22958
|
+
var _a, _b, _c;
|
22959
|
+
var _d;
|
22900
22960
|
return __awaiter(this, void 0, void 0, function* () {
|
22901
22961
|
let deviceHasChanged = false;
|
22902
22962
|
let success = true;
|
@@ -22935,14 +22995,18 @@ class Room extends eventsExports.EventEmitter {
|
|
22935
22995
|
if (!supportsSetSinkId() && !this.options.webAudioMix || this.options.webAudioMix && this.audioContext && !('setSinkId' in this.audioContext)) {
|
22936
22996
|
throw new Error('cannot switch audio output, setSinkId not supported');
|
22937
22997
|
}
|
22938
|
-
|
22998
|
+
if (this.options.webAudioMix) {
|
22999
|
+
// setting `default` for web audio output doesn't work, so we need to normalize the id before
|
23000
|
+
deviceId = (_a = yield DeviceManager.getInstance().normalizeDeviceId('audiooutput', deviceId)) !== null && _a !== void 0 ? _a : '';
|
23001
|
+
}
|
23002
|
+
(_b = (_d = this.options).audioOutput) !== null && _b !== void 0 ? _b : _d.audioOutput = {};
|
22939
23003
|
const prevDeviceId = this.options.audioOutput.deviceId;
|
22940
23004
|
this.options.audioOutput.deviceId = deviceId;
|
22941
23005
|
deviceHasChanged = prevDeviceId !== deviceConstraint;
|
22942
23006
|
try {
|
22943
23007
|
if (this.options.webAudioMix) {
|
22944
23008
|
// @ts-expect-error setSinkId is not yet in the typescript type of AudioContext
|
22945
|
-
(
|
23009
|
+
(_c = this.audioContext) === null || _c === void 0 ? void 0 : _c.setSinkId(deviceId);
|
22946
23010
|
} else {
|
22947
23011
|
yield Promise.all(Array.from(this.remoteParticipants.values()).map(p => p.setAudioOutput({
|
22948
23012
|
deviceId
|
@@ -24065,5 +24129,5 @@ function isFacingModeValue(item) {
|
|
24065
24129
|
return item === undefined || allowedValues.includes(item);
|
24066
24130
|
}
|
24067
24131
|
|
24068
|
-
export { AudioPresets, BaseKeyProvider, ConnectionCheck, ConnectionError, ConnectionQuality, ConnectionState, CriticalTimers, CryptorEvent, DataPacket_Kind, DefaultReconnectPolicy, DeviceUnsupportedError, DisconnectReason, EncryptionEvent, EngineEvent, ExternalE2EEKeyProvider, KeyHandlerEvent, KeyProviderEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalVideoTrack, LogLevel, MediaDeviceFailure, NegotiationError, Participant, ParticipantEvent, PublishDataError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, ScreenSharePresets, Track, TrackEvent, TrackInvalidError, TrackPublication, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, createAudioAnalyser, createE2EEKey, createKeyMaterialFromBuffer, createKeyMaterialFromString, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, deriveKeys, detachTrack, facingModeFromDeviceLabel, facingModeFromLocalTrack, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, getLogger, importKey, isBackupCodec, isBrowserSupported, isE2EESupported, isInsertableStreamSupported, isScriptTransformSupported, isVideoFrame, needsRbspUnescaping, parseRbsp, protocolVersion, ratchet, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, supportsVP9, version, videoCodecs, writeRbsp };
|
24132
|
+
export { AudioPresets, BaseKeyProvider, ConnectionCheck, ConnectionError, ConnectionQuality, ConnectionState, CriticalTimers, CryptorEvent, DataPacket_Kind, DefaultReconnectPolicy, DeviceUnsupportedError, DisconnectReason, EncryptionEvent, EngineEvent, ExternalE2EEKeyProvider, KeyHandlerEvent, KeyProviderEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalVideoTrack, LogLevel, LoggerNames, MediaDeviceFailure, NegotiationError, Participant, ParticipantEvent, PublishDataError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, ScreenSharePresets, Track, TrackEvent, TrackInvalidError, TrackPublication, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, createAudioAnalyser, createE2EEKey, createKeyMaterialFromBuffer, createKeyMaterialFromString, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, deriveKeys, detachTrack, facingModeFromDeviceLabel, facingModeFromLocalTrack, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, getLogger, importKey, isBackupCodec, isBrowserSupported, isE2EESupported, isInsertableStreamSupported, isScriptTransformSupported, isVideoFrame, needsRbspUnescaping, parseRbsp, protocolVersion, ratchet, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, supportsVP9, version, videoCodecs, writeRbsp };
|
24069
24133
|
//# sourceMappingURL=livekit-client.esm.mjs.map
|