livekit-client 1.6.5 → 1.6.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.
- package/dist/livekit-client.esm.mjs +54 -47
- 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/events.d.ts +2 -1
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts +1 -0
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/ts4.2/src/room/events.d.ts +2 -1
- package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +1 -0
- package/package.json +1 -1
- package/src/room/events.ts +2 -1
- package/src/room/participant/LocalParticipant.ts +1 -1
- package/src/room/track/LocalVideoTrack.ts +62 -46
@@ -221,7 +221,8 @@ export declare enum RoomEvent {
|
|
221
221
|
*/
|
222
222
|
SignalConnected = "signalConnected",
|
223
223
|
/**
|
224
|
-
* Recording of a room has started/stopped.
|
224
|
+
* Recording of a room has started/stopped. Room.isRecording will be updated too.
|
225
|
+
* args: (isRecording: boolean)
|
225
226
|
*/
|
226
227
|
RecordingStatusChanged = "recordingStatusChanged"
|
227
228
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/room/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,oBAAY,SAAS;IACnB;;OAEG;IACH,SAAS,cAAc;IAEvB;;;OAGG;IACH,YAAY,iBAAiB;IAE7B;;OAEG;IACH,WAAW,gBAAgB;IAE3B;;;OAGG;IACH,YAAY,iBAAiB;IAE7B;;;;OAIG;IACH,sBAAsB,2BAA2B;IAEjD;;OAEG;IACH,YAAY,2BAA2B;IAEvC;;OAEG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;OAMG;IACH,oBAAoB,yBAAyB;IAE7C;;;;;OAKG;IACH,uBAAuB,4BAA4B;IAEnD;;;;;;;;OAQG;IACH,cAAc,mBAAmB;IAEjC;;;;;OAKG;IACH,eAAe,oBAAoB;IAEnC;;;;OAIG;IACH,uBAAuB,4BAA4B;IAEnD;;;;OAIG;IACH,gBAAgB,qBAAqB;IAErC;;;;;OAKG;IACH,iBAAiB,sBAAsB;IAEvC;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,YAAY,iBAAiB;IAE7B;;;;;OAKG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;;;OAQG;IACH,qBAAqB,0BAA0B;IAE/C;;;;;;;OAOG;IACH,qBAAqB,0BAA0B;IAE/C;;;;;;;;OAQG;IACH,0BAA0B,+BAA+B;IAEzD;;;;;;;OAOG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;OAMG;IACH,YAAY,iBAAiB;IAE7B;;;;;;OAMG;IACH,wBAAwB,6BAA6B;IAErD;;;;;;;;;OASG;IACH,uBAAuB,4BAA4B;IAEnD;;;;;;;;;OASG;IACH,kCAAkC,uCAAuC;IAEzE;;;;;;;OAOG;IACH,8BAA8B,mCAAmC;IAEjE;;;;OAIG;IACH,0BAA0B,yBAAyB;IAEnD;;;;;;;;OAQG;IACH,iBAAiB,sBAAsB;IAEvC;;;OAGG;IACH,6BAA6B,kCAAkC;IAE/D;;OAEG;IACH,eAAe,oBAAoB;IAEnC
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/room/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,oBAAY,SAAS;IACnB;;OAEG;IACH,SAAS,cAAc;IAEvB;;;OAGG;IACH,YAAY,iBAAiB;IAE7B;;OAEG;IACH,WAAW,gBAAgB;IAE3B;;;OAGG;IACH,YAAY,iBAAiB;IAE7B;;;;OAIG;IACH,sBAAsB,2BAA2B;IAEjD;;OAEG;IACH,YAAY,2BAA2B;IAEvC;;OAEG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;OAMG;IACH,oBAAoB,yBAAyB;IAE7C;;;;;OAKG;IACH,uBAAuB,4BAA4B;IAEnD;;;;;;;;OAQG;IACH,cAAc,mBAAmB;IAEjC;;;;;OAKG;IACH,eAAe,oBAAoB;IAEnC;;;;OAIG;IACH,uBAAuB,4BAA4B;IAEnD;;;;OAIG;IACH,gBAAgB,qBAAqB;IAErC;;;;;OAKG;IACH,iBAAiB,sBAAsB;IAEvC;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,YAAY,iBAAiB;IAE7B;;;;;OAKG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;;;OAQG;IACH,qBAAqB,0BAA0B;IAE/C;;;;;;;OAOG;IACH,qBAAqB,0BAA0B;IAE/C;;;;;;;;OAQG;IACH,0BAA0B,+BAA+B;IAEzD;;;;;;;OAOG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;OAMG;IACH,YAAY,iBAAiB;IAE7B;;;;;;OAMG;IACH,wBAAwB,6BAA6B;IAErD;;;;;;;;;OASG;IACH,uBAAuB,4BAA4B;IAEnD;;;;;;;;;OASG;IACH,kCAAkC,uCAAuC;IAEzE;;;;;;;OAOG;IACH,8BAA8B,mCAAmC;IAEjE;;;;OAIG;IACH,0BAA0B,yBAAyB;IAEnD;;;;;;;;OAQG;IACH,iBAAiB,sBAAsB;IAEvC;;;OAGG;IACH,6BAA6B,kCAAkC;IAE/D;;OAEG;IACH,eAAe,oBAAoB;IAEnC;;;OAGG;IACH,sBAAsB,2BAA2B;CAClD;AAED,oBAAY,gBAAgB;IAC1B;;;;;;;;OAQG;IACH,cAAc,mBAAmB;IAEjC;;;;;OAKG;IACH,eAAe,oBAAoB;IAEnC;;;;OAIG;IACH,uBAAuB,4BAA4B;IAEnD;;;;OAIG;IACH,gBAAgB,qBAAqB;IAErC;;;;;OAKG;IACH,iBAAiB,sBAAsB;IAEvC;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,YAAY,iBAAiB;IAE7B;;;;;OAKG;IACH,mBAAmB,wBAAwB;IAE3C;;;;;;;;OAQG;IACH,qBAAqB,0BAA0B;IAE/C;;;;;;;;;OASG;IACH,0BAA0B,+BAA+B;IAEzD;;;;;;OAMG;IACH,YAAY,iBAAiB;IAE7B;;;;OAIG;IACH,iBAAiB,sBAAsB;IAEvC;;;;;;OAMG;IACH,wBAAwB,6BAA6B;IAErD;;;;;;;;OAQG;IACH,uBAAuB,4BAA4B;IAEnD;;;;;;;;OAQG;IACH,kCAAkC,uCAAuC;IAEzE;;;OAGG;IACH,8BAA8B,mCAAmC;IAGjE,gBAAgB;IAChB,iBAAiB,sBAAsB;IAEvC;;;OAGG;IACH,6BAA6B,kCAAkC;CAChE;AAED,gBAAgB;AAChB,oBAAY,WAAW;IACrB,iBAAiB,sBAAsB;IACvC,SAAS,cAAc;IACvB,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,aAAa,kBAAkB;IAC/B,OAAO,YAAY;IACnB,eAAe,oBAAoB;IACnC,oBAAoB,yBAAyB;IAC7C,kBAAkB,uBAAuB;CAC1C;AAED,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB;;OAEG;IACH,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,gBAAgB;IAChB,cAAc,mBAAmB;IACjC,gBAAgB;IAChB,kBAAkB,uBAAuB;IACzC,gBAAgB;IAChB,oBAAoB,yBAAyB;IAC7C,gBAAgB;IAChB,mBAAmB,wBAAwB;IAC3C;;;OAGG;IACH,oBAAoB,yBAAyB;IAC7C,gBAAgB;IAChB,iBAAiB,sBAAsB;IACvC,gBAAgB;IAChB,sBAAsB,2BAA2B;IACjD,gBAAgB;IAChB,eAAe,oBAAoB;IACnC,gBAAgB;IAChB,eAAe,oBAAoB;IACnC;;;OAGG;IACH,cAAc,mBAAmB;IACjC;;;OAGG;IACH,eAAe,oBAAoB;IACnC;;;OAGG;IACH,6BAA6B,kCAAkC;IAC/D;;OAEG;IACH,yBAAyB,8BAA8B;CACxD"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LocalVideoTrack.d.ts","sourceRoot":"","sources":["../../../../src/room/track/LocalVideoTrack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAoC,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAIjE,qBAAa,kBAAkB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAElB,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,SAAS,CAAC,EAAE,wBAAwB,EAAE,CAAC;gBAE3B,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB;CAIlE;AAID,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU;IAErD,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,OAAO,CAAC,SAAS,CAAC,CAAgC;IAElD,OAAO,CAAC,SAAS,CAAC,CAA6B;IAG/C,eAAe,EAAE,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAA6C;IAEjG,OAAO,CAAC,gBAAgB,CAAC,CAAoB;
|
1
|
+
{"version":3,"file":"LocalVideoTrack.d.ts","sourceRoot":"","sources":["../../../../src/room/track/LocalVideoTrack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAoC,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAIjE,qBAAa,kBAAkB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAElB,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,SAAS,CAAC,EAAE,wBAAwB,EAAE,CAAC;gBAE3B,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB;CAIlE;AAID,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU;IAErD,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,OAAO,CAAC,SAAS,CAAC,CAAgC;IAElD,OAAO,CAAC,SAAS,CAAC,CAA6B;IAG/C,eAAe,EAAE,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAA6C;IAEjG,OAAO,CAAC,gBAAgB,CAAC,CAAoB;IAM7C,OAAO,CAAC,UAAU,CAAQ;IAE1B;;;;;OAKG;gBAED,UAAU,EAAE,gBAAgB,EAC5B,WAAW,CAAC,EAAE,qBAAqB,EACnC,iBAAiB,UAAO;IAM1B,IAAI,WAAW,IAAI,OAAO,CAKzB;IAGD,YAAY,CAAC,YAAY,EAAE,YAAY;IAoBvC,IAAI;IAQE,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAYhC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAWlC,cAAc,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA2CnD,oBAAoB,CAAC,UAAU,EAAE,YAAY;IAYvC,WAAW,CAAC,QAAQ,EAAE,MAAM;IAY5B,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB;IAWhD,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,wBAAwB,EAAE,GAAG,kBAAkB;IAchG,uBAAuB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY;IAgB/D;;;OAGG;IACG,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyC3E;;;OAGG;IACG,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE;IASxD,SAAS,CAAC,aAAa,sBAyBrB;cAEc,0BAA0B;CAO3C;AAqED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAW5D;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,wBAAwB,EAAE,GACrC,UAAU,EAAE,CA2Bd"}
|
@@ -221,7 +221,8 @@ export declare enum RoomEvent {
|
|
221
221
|
*/
|
222
222
|
SignalConnected = "signalConnected",
|
223
223
|
/**
|
224
|
-
* Recording of a room has started/stopped.
|
224
|
+
* Recording of a room has started/stopped. Room.isRecording will be updated too.
|
225
|
+
* args: (isRecording: boolean)
|
225
226
|
*/
|
226
227
|
RecordingStatusChanged = "recordingStatusChanged"
|
227
228
|
}
|
package/package.json
CHANGED
package/src/room/events.ts
CHANGED
@@ -252,7 +252,8 @@ export enum RoomEvent {
|
|
252
252
|
SignalConnected = 'signalConnected',
|
253
253
|
|
254
254
|
/**
|
255
|
-
* Recording of a room has started/stopped.
|
255
|
+
* Recording of a room has started/stopped. Room.isRecording will be updated too.
|
256
|
+
* args: (isRecording: boolean)
|
256
257
|
*/
|
257
258
|
RecordingStatusChanged = 'recordingStatusChanged',
|
258
259
|
}
|
@@ -957,7 +957,7 @@ export default class LocalParticipant extends Participant {
|
|
957
957
|
}
|
958
958
|
}
|
959
959
|
} else if (update.subscribedQualities.length > 0) {
|
960
|
-
pub.videoTrack?.setPublishingLayers(update.subscribedQualities);
|
960
|
+
await pub.videoTrack?.setPublishingLayers(update.subscribedQualities);
|
961
961
|
}
|
962
962
|
};
|
963
963
|
|
@@ -3,7 +3,7 @@ import log from '../../logger';
|
|
3
3
|
import { VideoLayer, VideoQuality } from '../../proto/livekit_models';
|
4
4
|
import type { SubscribedCodec, SubscribedQuality } from '../../proto/livekit_rtc';
|
5
5
|
import { computeBitrate, monitorFrequency, VideoSenderStats } from '../stats';
|
6
|
-
import { isFireFox, isMobile, isWeb } from '../utils';
|
6
|
+
import { isFireFox, isMobile, isWeb, Mutex } from '../utils';
|
7
7
|
import LocalTrack from './LocalTrack';
|
8
8
|
import type { VideoCaptureOptions, VideoCodec } from './options';
|
9
9
|
import { Track } from './Track';
|
@@ -39,6 +39,12 @@ export default class LocalVideoTrack extends LocalTrack {
|
|
39
39
|
|
40
40
|
private subscribedCodecs?: SubscribedCodec[];
|
41
41
|
|
42
|
+
// prevents concurrent manipulations to track sender
|
43
|
+
// if multiple get/setParameter are called concurrently, certain timing of events
|
44
|
+
// could lead to the browser throwing an exception in `setParameter`, due to
|
45
|
+
// a missing `getParameter` call.
|
46
|
+
private senderLock: Mutex;
|
47
|
+
|
42
48
|
/**
|
43
49
|
*
|
44
50
|
* @param mediaTrack
|
@@ -51,6 +57,7 @@ export default class LocalVideoTrack extends LocalTrack {
|
|
51
57
|
userProvidedTrack = true,
|
52
58
|
) {
|
53
59
|
super(mediaTrack, Track.Kind.Video, constraints, userProvidedTrack);
|
60
|
+
this.senderLock = new Mutex();
|
54
61
|
}
|
55
62
|
|
56
63
|
get isSimulcast(): boolean {
|
@@ -257,6 +264,7 @@ export default class LocalVideoTrack extends LocalTrack {
|
|
257
264
|
simulcastCodecInfo.sender,
|
258
265
|
simulcastCodecInfo.encodings!,
|
259
266
|
codec.qualities,
|
267
|
+
this.senderLock,
|
260
268
|
);
|
261
269
|
}
|
262
270
|
}
|
@@ -274,7 +282,7 @@ export default class LocalVideoTrack extends LocalTrack {
|
|
274
282
|
return;
|
275
283
|
}
|
276
284
|
|
277
|
-
await setPublishingLayersForSender(this.sender, this.encodings, qualities);
|
285
|
+
await setPublishingLayersForSender(this.sender, this.encodings, qualities, this.senderLock);
|
278
286
|
}
|
279
287
|
|
280
288
|
protected monitorSender = async () => {
|
@@ -317,58 +325,66 @@ async function setPublishingLayersForSender(
|
|
317
325
|
sender: RTCRtpSender,
|
318
326
|
senderEncodings: RTCRtpEncodingParameters[],
|
319
327
|
qualities: SubscribedQuality[],
|
328
|
+
senderLock: Mutex,
|
320
329
|
) {
|
330
|
+
const unlock = await senderLock.lock();
|
321
331
|
log.debug('setPublishingLayersForSender', { sender, qualities, senderEncodings });
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
if (encodings.length !== senderEncodings.length) {
|
329
|
-
log.warn('cannot set publishing layers, encodings mismatch');
|
330
|
-
return;
|
331
|
-
}
|
332
|
-
|
333
|
-
let hasChanged = false;
|
334
|
-
encodings.forEach((encoding, idx) => {
|
335
|
-
let rid = encoding.rid ?? '';
|
336
|
-
if (rid === '') {
|
337
|
-
rid = 'q';
|
332
|
+
try {
|
333
|
+
const params = sender.getParameters();
|
334
|
+
const { encodings } = params;
|
335
|
+
if (!encodings) {
|
336
|
+
return;
|
338
337
|
}
|
339
|
-
|
340
|
-
|
341
|
-
|
338
|
+
|
339
|
+
if (encodings.length !== senderEncodings.length) {
|
340
|
+
log.warn('cannot set publishing layers, encodings mismatch');
|
342
341
|
return;
|
343
342
|
}
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
if (
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
343
|
+
|
344
|
+
let hasChanged = false;
|
345
|
+
encodings.forEach((encoding, idx) => {
|
346
|
+
let rid = encoding.rid ?? '';
|
347
|
+
if (rid === '') {
|
348
|
+
rid = 'q';
|
349
|
+
}
|
350
|
+
const quality = videoQualityForRid(rid);
|
351
|
+
const subscribedQuality = qualities.find((q) => q.quality === quality);
|
352
|
+
if (!subscribedQuality) {
|
353
|
+
return;
|
354
|
+
}
|
355
|
+
if (encoding.active !== subscribedQuality.enabled) {
|
356
|
+
hasChanged = true;
|
357
|
+
encoding.active = subscribedQuality.enabled;
|
358
|
+
log.debug(
|
359
|
+
`setting layer ${subscribedQuality.quality} to ${
|
360
|
+
encoding.active ? 'enabled' : 'disabled'
|
361
|
+
}`,
|
362
|
+
);
|
363
|
+
|
364
|
+
// FireFox does not support setting encoding.active to false, so we
|
365
|
+
// have a workaround of lowering its bitrate and resolution to the min.
|
366
|
+
if (isFireFox()) {
|
367
|
+
if (subscribedQuality.enabled) {
|
368
|
+
encoding.scaleResolutionDownBy = senderEncodings[idx].scaleResolutionDownBy;
|
369
|
+
encoding.maxBitrate = senderEncodings[idx].maxBitrate;
|
370
|
+
/* @ts-ignore */
|
371
|
+
encoding.maxFrameRate = senderEncodings[idx].maxFrameRate;
|
372
|
+
} else {
|
373
|
+
encoding.scaleResolutionDownBy = 4;
|
374
|
+
encoding.maxBitrate = 10;
|
375
|
+
/* @ts-ignore */
|
376
|
+
encoding.maxFrameRate = 2;
|
377
|
+
}
|
364
378
|
}
|
365
379
|
}
|
366
|
-
}
|
367
|
-
});
|
380
|
+
});
|
368
381
|
|
369
|
-
|
370
|
-
|
371
|
-
|
382
|
+
if (hasChanged) {
|
383
|
+
params.encodings = encodings;
|
384
|
+
await sender.setParameters(params);
|
385
|
+
}
|
386
|
+
} finally {
|
387
|
+
unlock();
|
372
388
|
}
|
373
389
|
}
|
374
390
|
|