livekit-client 1.11.2 → 1.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.
@@ -1,7 +1,8 @@
1
1
  import EventEmitter from 'eventemitter3';
2
2
  /** @internal */
3
3
  interface TrackBitrateInfo {
4
- sid: string;
4
+ cid?: string;
5
+ transceiver?: RTCRtpTransceiver;
5
6
  codec: string;
6
7
  maxbr: number;
7
8
  }
@@ -29,9 +30,9 @@ export default class PCTransport extends EventEmitter {
29
30
  };
30
31
  createAndSendOffer(options?: RTCOfferOptions): Promise<void>;
31
32
  createAndSetAnswer(): Promise<RTCSessionDescriptionInit>;
32
- setTrackCodecBitrate(sid: string, codec: string, maxbr: number): void;
33
+ setTrackCodecBitrate(info: TrackBitrateInfo): void;
33
34
  close(): void;
34
- private setMungedLocalDescription;
35
+ private setMungedSDP;
35
36
  }
36
37
  export {};
37
38
  //# sourceMappingURL=PCTransport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PCTransport.d.ts","sourceRoot":"","sources":["../../../src/room/PCTransport.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAQzC,gBAAgB;AAChB,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,QAAQ;;;CAGX,CAAC;AAEX,gBAAgB;AAChB,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,YAAY;IACnD,EAAE,EAAE,iBAAiB,CAAC;IAEtB,iBAAiB,EAAE,mBAAmB,EAAE,CAAM;IAE9C,aAAa,EAAE,OAAO,CAAS;IAE/B,WAAW,EAAE,OAAO,CAAS;IAE7B,aAAa,EAAE,gBAAgB,EAAE,CAAM;IAEvC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAEhC,cAAc,EAAE,MAAM,EAAE,CAAM;IAE9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;gBAEzC,MAAM,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAQrF,IAAI,cAAc,IAAI,OAAO,CAE5B;IAEK,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,oBAAoB,CAAC,EAAE,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxE,SAAS;iDAA2B,KAAK,KAAK,IAAI;;MAW1C;IAEF,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe;IAwF5C,kBAAkB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAY9D,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQ9D,KAAK;YAMS,yBAAyB;CA4BxC"}
1
+ {"version":3,"file":"PCTransport.d.ts","sourceRoot":"","sources":["../../../src/room/PCTransport.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAQzC,gBAAgB;AAChB,UAAU,gBAAgB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAUD,eAAO,MAAM,QAAQ;;;CAGX,CAAC;AAEX,gBAAgB;AAChB,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,YAAY;IACnD,EAAE,EAAE,iBAAiB,CAAC;IAEtB,iBAAiB,EAAE,mBAAmB,EAAE,CAAM;IAE9C,aAAa,EAAE,OAAO,CAAS;IAE/B,WAAW,EAAE,OAAO,CAAS;IAE7B,aAAa,EAAE,gBAAgB,EAAE,CAAM;IAEvC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAEhC,cAAc,EAAE,MAAM,EAAE,CAAM;IAE9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;gBAEzC,MAAM,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAQrF,IAAI,cAAc,IAAI,OAAO,CAE5B;IAEK,eAAe,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,oBAAoB,CAAC,EAAE,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4ExE,SAAS;iDAA2B,KAAK,KAAK,IAAI;;MAW1C;IAEF,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe;IAwF5C,kBAAkB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAY9D,oBAAoB,CAAC,IAAI,EAAE,gBAAgB;IAI3C,KAAK;YAMS,YAAY;CAsC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalParticipant.d.ts","sourceRoot":"","sources":["../../../../src/room/participant/LocalParticipant.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LocalParticipant.d.ts","sourceRoot":"","sources":["../../../../src/room/participant/LocalParticipant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAc,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAEL,eAAe,EAGf,sBAAsB,EAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAC;AAI1C,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,qBAAqB,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE/E,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAOpD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAEhD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAEhD,+CAA+C;IAC/C,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAE3C,gBAAgB;IAChB,MAAM,EAAE,SAAS,CAAC;IAElB,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,sBAAsB,CAAyD;IAEvF,OAAO,CAAC,WAAW,CAAoB;IAEvC,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO,CAAC,2BAA2B,CAAyC;IAE5E,OAAO,CAAC,iCAAiC,CAAiB;IAG1D,OAAO,CAAC,WAAW,CAAsB;IAEzC,OAAO,CAAC,eAAe,CAAC,CAAe;IAEvC,gBAAgB;gBACJ,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB;IAU1F,IAAI,eAAe,IAAI,KAAK,GAAG,SAAS,CAEvC;IAED,IAAI,mBAAmB,IAAI,KAAK,GAAG,SAAS,CAE3C;IAED,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAOjE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAO/D;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,SAAS;IA2B7B,OAAO,CAAC,kBAAkB,CAIxB;IAEF,OAAO,CAAC,iBAAiB,CAIvB;IAEF,OAAO,CAAC,kBAAkB,CAMxB;IAEF;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKnC;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B;;;;;OAKG;IACH,gBAAgB,CACd,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,cAAc,CAAC,EAAE,mBAAmB,GACnC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAI7C;;;;;OAKG;IACH,oBAAoB,CAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,cAAc,CAAC,EAAE,mBAAmB,GACnC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAI7C;;;OAGG;IACH,qBAAqB,CACnB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,yBAAyB,EACnC,cAAc,CAAC,EAAE,mBAAmB,GACnC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAI7C;;;;OAIG;YACW,eAAe;IA2F7B;;;OAGG;IACG,yBAAyB;IAwB/B;;;;OAIG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqD7E;;;;OAIG;IACG,kBAAkB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAsDzF;;;;OAIG;IACG,YAAY,CAChB,KAAK,EAAE,UAAU,GAAG,gBAAgB,EACpC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;YAgFnB,OAAO;IA8OrB,IAAa,OAAO,IAAI,OAAO,CAE9B;IAED;;OAEG;IACG,8BAA8B,CAClC,KAAK,EAAE,UAAU,GAAG,gBAAgB,EACpC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,CAAC,EAAE,mBAAmB;IAiEzB,cAAc,CAClB,KAAK,EAAE,UAAU,GAAG,gBAAgB,EACpC,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAwFvC,eAAe,CACnB,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,GACxC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAO7B,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB;IAoBtD;;;;;;;;;;OAUG;IACG,WAAW,CACf,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,eAAe,EACrB,cAAc,CAAC,EAAE,kBAAkB,GAClC,OAAO,CAAC,IAAI,CAAC;IAChB;;;;;;;;;;OAUG;IACG,WAAW,CACf,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,eAAe,EACrB,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,GAC3C,OAAO,CAAC,IAAI,CAAC;IAwChB;;;;;;;;;;;;;;;;OAgBG;IACH,+BAA+B,CAC7B,sBAAsB,EAAE,OAAO,EAC/B,2BAA2B,GAAE,0BAA0B,EAAO;IAShE,gBAAgB;IAChB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO;IA8B1C,OAAO,CAAC,kCAAkC,CASxC;IAEF,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAEpB;IAGF,gBAAgB;IAChB,OAAO,CAAC,YAAY,CAWlB;IAEF,OAAO,CAAC,qBAAqB,CAG3B;IAEF,OAAO,CAAC,sBAAsB,CAG5B;IAEF,OAAO,CAAC,6BAA6B,CA0BnC;IAEF,OAAO,CAAC,2BAA2B,CAUjC;IAEF,OAAO,CAAC,gBAAgB,CA+CtB;IAEF,OAAO,CAAC,sBAAsB;IAwB9B,gBAAgB;IAChB,mBAAmB,IAAI,sBAAsB,EAAE;IAa/C,gBAAgB;IAChB,gBAAgB,IAAI,eAAe,EAAE;CAoBtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"publishUtils.d.ts","sourceRoot":"","sources":["../../../../src/room/participant/publishUtils.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,0BAA0B,CAAC;AACvD,OAAO,eAAe,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAsB,WAAW,EAAgC,MAAM,kBAAkB,CAAC;AACjG,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,aAAa,EACd,MAAM,kBAAkB,CAAC;AAG1B,gBAAgB;AAChB,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,CAAC,EAAE,qBAAqB,GAClC,eAAe,GAAG,eAAe,CASnC;AAGD,eAAO,MAAM,UAAU,eAA8B,CAAC;AAGtD,eAAO,MAAM,SAAS,eAAgC,CAAC;AAGvD,eAAO,MAAM,kBAAkB,eAAoC,CAAC;AAGpE,eAAO,MAAM,0BAA0B,eAAyC,CAAC;AAGjF,eAAO,MAAM,yBAAyB,eAA6C,CAAC;AAGpF,eAAO,MAAM,yCAAyC,eAAgB,WAAW,kBAkBhF,CAAC;AAwBF,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,OAAO,EACtB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,wBAAwB,EAAE,CA4F5B;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,mBAAmB,0CA4B1B;AAGD,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,OAAO,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,UAAU,GACjB,aAAa,CAiCf;AAGD,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,OAAO,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,WAAW,EAAE,CASf;AAGD,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,WAAW,GACpB,WAAW,EAAE,CAUf;AA2DD,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,SAAS,6BAelE;AAED,gBAAgB;AAChB,qBAAa,eAAe;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,YAAY,CAAC;gBAEpC,eAAe,EAAE,MAAM;IAkBnC,QAAQ,IAAI,MAAM;CAGnB"}
1
+ {"version":3,"file":"publishUtils.d.ts","sourceRoot":"","sources":["../../../../src/room/participant/publishUtils.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,0BAA0B,CAAC;AACvD,OAAO,eAAe,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAsB,WAAW,EAAgC,MAAM,kBAAkB,CAAC;AACjG,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,aAAa,EACd,MAAM,kBAAkB,CAAC;AAG1B,gBAAgB;AAChB,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,CAAC,EAAE,qBAAqB,GAClC,eAAe,GAAG,eAAe,CASnC;AAGD,eAAO,MAAM,UAAU,eAA8B,CAAC;AAGtD,eAAO,MAAM,SAAS,eAAgC,CAAC;AAGvD,eAAO,MAAM,kBAAkB,eAAoC,CAAC;AAGpE,eAAO,MAAM,0BAA0B,eAAyC,CAAC;AAGjF,eAAO,MAAM,yBAAyB,eAA6C,CAAC;AAGpF,eAAO,MAAM,yCAAyC,eAAgB,WAAW,kBAkBhF,CAAC;AAwBF,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,OAAO,EACtB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,wBAAwB,EAAE,CA6F5B;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,mBAAmB,0CA4B1B;AAGD,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,OAAO,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,UAAU,GACjB,aAAa,CAiCf;AAGD,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,OAAO,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,WAAW,EAAE,CASf;AAGD,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,WAAW,GACpB,WAAW,EAAE,CAUf;AA4DD,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,SAAS,6BAelE;AAED,gBAAgB;AAChB,qBAAa,eAAe;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,YAAY,CAAC;gBAEpC,eAAe,EAAE,MAAM;IAkBnC,QAAQ,IAAI,MAAM;CAGnB"}
@@ -39,7 +39,7 @@ export interface TrackPublishDefaults {
39
39
  */
40
40
  red?: boolean;
41
41
  /**
42
- * stereo audio track. defaults determined by capture channel count.
42
+ * publish track in stereo mode (or set to false to disable). defaults determined by capture channel count.
43
43
  */
44
44
  forceStereo?: boolean;
45
45
  /**
@@ -1,3 +1,4 @@
1
+ import LocalTrack from './LocalTrack';
1
2
  import type { AudioCaptureOptions, CreateLocalTracksOptions, VideoCaptureOptions } from './options';
2
3
  import type { AudioTrack } from './types';
3
4
  export declare function mergeDefaultOptions(options?: CreateLocalTracksOptions, audioDefaults?: AudioCaptureOptions, videoDefaults?: VideoCaptureOptions): CreateLocalTracksOptions;
@@ -11,4 +12,42 @@ export declare function detectSilence(track: AudioTrack, timeOffset?: number): P
11
12
  * @internal
12
13
  */
13
14
  export declare function getNewAudioContext(): AudioContext | void;
15
+ type FacingMode = NonNullable<VideoCaptureOptions['facingMode']>;
16
+ type FacingModeFromLocalTrackOptions = {
17
+ /**
18
+ * If no facing mode can be determined, this value will be used.
19
+ * @defaultValue 'user'
20
+ */
21
+ defaultFacingMode?: FacingMode;
22
+ };
23
+ type FacingModeFromLocalTrackReturnValue = {
24
+ /**
25
+ * The (probable) facingMode of the track.
26
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}
27
+ */
28
+ facingMode: FacingMode;
29
+ /**
30
+ * The confidence that the returned facingMode is correct.
31
+ */
32
+ confidence: 'high' | 'medium' | 'low';
33
+ };
34
+ /**
35
+ * Try to analyze the local track to determine the facing mode of a track.
36
+ *
37
+ * @remarks
38
+ * There is no property supported by all browsers to detect whether a video track originated from a user- or environment-facing camera device.
39
+ * For this reason, we use the `facingMode` property when available, but will fall back on a string-based analysis of the device label to determine the facing mode.
40
+ * If both methods fail, the default facing mode will be used.
41
+ *
42
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}
43
+ * @experimental
44
+ */
45
+ export declare function facingModeFromLocalTrack(localTrack: LocalTrack | MediaStreamTrack, options?: FacingModeFromLocalTrackOptions): FacingModeFromLocalTrackReturnValue;
46
+ /**
47
+ * Attempt to analyze the device label to determine the facing mode.
48
+ *
49
+ * @experimental
50
+ */
51
+ export declare function facingModeFromDeviceLabel(deviceLabel: string): FacingModeFromLocalTrackReturnValue | undefined;
52
+ export {};
14
53
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/room/track/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,wBAAwB,EAClC,aAAa,CAAC,EAAE,mBAAmB,EACnC,aAAa,CAAC,EAAE,mBAAmB,GAClC,wBAAwB,CAqB1B;AAYD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,sBAAsB,CAqC/F;AACD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAOxD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/room/track/utils.ts"],"names":[],"mappings":"AAEA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,wBAAwB,EAClC,aAAa,CAAC,EAAE,mBAAmB,EACnC,aAAa,CAAC,EAAE,mBAAmB,GAClC,wBAAwB,CAqB1B;AAYD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,sBAAsB,CAqC/F;AACD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAOxD;AAED,KAAK,UAAU,GAAG,WAAW,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;AACjE,KAAK,+BAA+B,GAAG;IACrC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC,CAAC;AACF,KAAK,mCAAmC,GAAG;IACzC;;;OAGG;IACH,UAAU,EAAE,UAAU,CAAC;IACvB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EACzC,OAAO,GAAE,+BAAoC,GAC5C,mCAAmC,CA2BrC;AASD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,GAClB,mCAAmC,GAAG,SAAS,CAgBjD"}
@@ -1,7 +1,8 @@
1
1
  import EventEmitter from 'eventemitter3';
2
2
  /** @internal */
3
3
  interface TrackBitrateInfo {
4
- sid: string;
4
+ cid?: string;
5
+ transceiver?: RTCRtpTransceiver;
5
6
  codec: string;
6
7
  maxbr: number;
7
8
  }
@@ -31,9 +32,9 @@ export default class PCTransport extends EventEmitter {
31
32
  };
32
33
  createAndSendOffer(options?: RTCOfferOptions): Promise<void>;
33
34
  createAndSetAnswer(): Promise<RTCSessionDescriptionInit>;
34
- setTrackCodecBitrate(sid: string, codec: string, maxbr: number): void;
35
+ setTrackCodecBitrate(info: TrackBitrateInfo): void;
35
36
  close(): void;
36
- private setMungedLocalDescription;
37
+ private setMungedSDP;
37
38
  }
38
39
  export {};
39
40
  //# sourceMappingURL=PCTransport.d.ts.map
@@ -39,7 +39,7 @@ export interface TrackPublishDefaults {
39
39
  */
40
40
  red?: boolean;
41
41
  /**
42
- * stereo audio track. defaults determined by capture channel count.
42
+ * publish track in stereo mode (or set to false to disable). defaults determined by capture channel count.
43
43
  */
44
44
  forceStereo?: boolean;
45
45
  /**
@@ -1,3 +1,4 @@
1
+ import LocalTrack from './LocalTrack';
1
2
  import type { AudioCaptureOptions, CreateLocalTracksOptions, VideoCaptureOptions } from './options';
2
3
  import type { AudioTrack } from './types';
3
4
  export declare function mergeDefaultOptions(options?: CreateLocalTracksOptions, audioDefaults?: AudioCaptureOptions, videoDefaults?: VideoCaptureOptions): CreateLocalTracksOptions;
@@ -11,4 +12,42 @@ export declare function detectSilence(track: AudioTrack, timeOffset?: number): P
11
12
  * @internal
12
13
  */
13
14
  export declare function getNewAudioContext(): AudioContext | void;
15
+ type FacingMode = NonNullable<VideoCaptureOptions['facingMode']>;
16
+ type FacingModeFromLocalTrackOptions = {
17
+ /**
18
+ * If no facing mode can be determined, this value will be used.
19
+ * @defaultValue 'user'
20
+ */
21
+ defaultFacingMode?: FacingMode;
22
+ };
23
+ type FacingModeFromLocalTrackReturnValue = {
24
+ /**
25
+ * The (probable) facingMode of the track.
26
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}
27
+ */
28
+ facingMode: FacingMode;
29
+ /**
30
+ * The confidence that the returned facingMode is correct.
31
+ */
32
+ confidence: 'high' | 'medium' | 'low';
33
+ };
34
+ /**
35
+ * Try to analyze the local track to determine the facing mode of a track.
36
+ *
37
+ * @remarks
38
+ * There is no property supported by all browsers to detect whether a video track originated from a user- or environment-facing camera device.
39
+ * For this reason, we use the `facingMode` property when available, but will fall back on a string-based analysis of the device label to determine the facing mode.
40
+ * If both methods fail, the default facing mode will be used.
41
+ *
42
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}
43
+ * @experimental
44
+ */
45
+ export declare function facingModeFromLocalTrack(localTrack: LocalTrack | MediaStreamTrack, options?: FacingModeFromLocalTrackOptions): FacingModeFromLocalTrackReturnValue;
46
+ /**
47
+ * Attempt to analyze the device label to determine the facing mode.
48
+ *
49
+ * @experimental
50
+ */
51
+ export declare function facingModeFromDeviceLabel(deviceLabel: string): FacingModeFromLocalTrackReturnValue | undefined;
52
+ export {};
14
53
  //# sourceMappingURL=utils.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livekit-client",
3
- "version": "1.11.2",
3
+ "version": "1.11.3",
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",
@@ -8,11 +8,20 @@ import { ddExtensionURI, isChromiumBased, isSVCCodec } from './utils';
8
8
 
9
9
  /** @internal */
10
10
  interface TrackBitrateInfo {
11
- sid: string;
11
+ cid?: string;
12
+ transceiver?: RTCRtpTransceiver;
12
13
  codec: string;
13
14
  maxbr: number;
14
15
  }
15
16
 
17
+ /* The svc codec (av1/vp9) would use a very low bitrate at the begining and
18
+ increase slowly by the bandwidth estimator until it reach the target bitrate. The
19
+ process commonly cost more than 10 seconds cause subscriber will get blur video at
20
+ the first few seconds. So we use a 70% of target bitrate here as the start bitrate to
21
+ eliminate this issue.
22
+ */
23
+ const startBitrateForSVC = 0.7;
24
+
16
25
  export const PCEvents = {
17
26
  NegotiationStarted: 'negotiationStarted',
18
27
  NegotiationComplete: 'negotiationComplete',
@@ -56,12 +65,65 @@ export default class PCTransport extends EventEmitter {
56
65
  }
57
66
 
58
67
  async setRemoteDescription(sd: RTCSessionDescriptionInit): Promise<void> {
68
+ let mungedSDP: string | undefined = undefined;
59
69
  if (sd.type === 'offer') {
60
70
  let { stereoMids, nackMids } = extractStereoAndNackAudioFromOffer(sd);
61
71
  this.remoteStereoMids = stereoMids;
62
72
  this.remoteNackMids = nackMids;
73
+ } else if (sd.type === 'answer') {
74
+ const sdpParsed = parse(sd.sdp ?? '');
75
+ sdpParsed.media.forEach((media) => {
76
+ if (media.type === 'audio') {
77
+ // mung sdp for opus bitrate settings
78
+ this.trackBitrates.some((trackbr): boolean => {
79
+ if (!trackbr.transceiver || media.mid != trackbr.transceiver.mid) {
80
+ return false;
81
+ }
82
+
83
+ let codecPayload = 0;
84
+ media.rtp.some((rtp): boolean => {
85
+ if (rtp.codec.toUpperCase() === trackbr.codec.toUpperCase()) {
86
+ codecPayload = rtp.payload;
87
+ return true;
88
+ }
89
+ return false;
90
+ });
91
+
92
+ if (codecPayload === 0) {
93
+ return true;
94
+ }
95
+
96
+ let fmtpFound = false;
97
+ for (const fmtp of media.fmtp) {
98
+ if (fmtp.payload === codecPayload) {
99
+ fmtp.config = fmtp.config
100
+ .split(';')
101
+ .filter((attr) => !attr.includes('maxaveragebitrate'))
102
+ .join(';');
103
+ if (trackbr.maxbr > 0) {
104
+ fmtp.config += `;maxaveragebitrate=${trackbr.maxbr * 1000}`;
105
+ }
106
+ fmtpFound = true;
107
+ break;
108
+ }
109
+ }
110
+
111
+ if (!fmtpFound) {
112
+ if (trackbr.maxbr > 0) {
113
+ media.fmtp.push({
114
+ payload: codecPayload,
115
+ config: `maxaveragebitrate=${trackbr.maxbr * 1000}`,
116
+ });
117
+ }
118
+ }
119
+
120
+ return true;
121
+ });
122
+ }
123
+ });
124
+ mungedSDP = write(sdpParsed);
63
125
  }
64
- await this.pc.setRemoteDescription(sd);
126
+ await this.setMungedSDP(sd, mungedSDP, true);
65
127
 
66
128
  this.pendingCandidates.forEach((candidate) => {
67
129
  this.pc.addIceCandidate(candidate);
@@ -130,7 +192,7 @@ export default class PCTransport extends EventEmitter {
130
192
  ensureVideoDDExtensionForSVC(media);
131
193
  // mung sdp for codec bitrate setting that can't apply by sendEncoding
132
194
  this.trackBitrates.some((trackbr): boolean => {
133
- if (!media.msid || !media.msid.includes(trackbr.sid)) {
195
+ if (!media.msid || !trackbr.cid || !media.msid.includes(trackbr.cid)) {
134
196
  return false;
135
197
  }
136
198
 
@@ -143,39 +205,39 @@ export default class PCTransport extends EventEmitter {
143
205
  return false;
144
206
  });
145
207
 
146
- // add x-google-max-bitrate to fmtp line if not exist
147
- if (codecPayload > 0) {
148
- if (
149
- !media.fmtp.some((fmtp): boolean => {
150
- if (fmtp.payload === codecPayload) {
151
- if (!fmtp.config.includes('x-google-start-bitrate')) {
152
- fmtp.config += `;x-google-start-bitrate=${trackbr.maxbr * 0.7}`;
153
- }
154
- if (!fmtp.config.includes('x-google-max-bitrate')) {
155
- fmtp.config += `;x-google-max-bitrate=${trackbr.maxbr}`;
156
- }
157
- return true;
158
- }
159
- return false;
160
- })
161
- ) {
162
- media.fmtp.push({
163
- payload: codecPayload,
164
- config: `x-google-start-bitrate=${trackbr.maxbr * 0.7};x-google-max-bitrate=${
165
- trackbr.maxbr
166
- }`,
167
- });
208
+ if (codecPayload === 0) {
209
+ return true;
210
+ }
211
+
212
+ let fmtpFound = false;
213
+ for (const fmtp of media.fmtp) {
214
+ if (fmtp.payload === codecPayload) {
215
+ if (!fmtp.config.includes('x-google-start-bitrate')) {
216
+ fmtp.config += `;x-google-start-bitrate=${trackbr.maxbr * startBitrateForSVC}`;
217
+ }
218
+ if (!fmtp.config.includes('x-google-max-bitrate')) {
219
+ fmtp.config += `;x-google-max-bitrate=${trackbr.maxbr}`;
220
+ }
221
+ fmtpFound = true;
222
+ break;
168
223
  }
169
224
  }
170
225
 
226
+ if (!fmtpFound) {
227
+ media.fmtp.push({
228
+ payload: codecPayload,
229
+ config: `x-google-start-bitrate=${
230
+ trackbr.maxbr * startBitrateForSVC
231
+ };x-google-max-bitrate=${trackbr.maxbr}`,
232
+ });
233
+ }
234
+
171
235
  return true;
172
236
  });
173
237
  }
174
238
  });
175
239
 
176
- this.trackBitrates = [];
177
-
178
- await this.setMungedLocalDescription(offer, write(sdpParsed));
240
+ await this.setMungedSDP(offer, write(sdpParsed));
179
241
  this.onOffer(offer);
180
242
  }
181
243
 
@@ -187,16 +249,12 @@ export default class PCTransport extends EventEmitter {
187
249
  ensureAudioNackAndStereo(media, this.remoteStereoMids, this.remoteNackMids);
188
250
  }
189
251
  });
190
- await this.setMungedLocalDescription(answer, write(sdpParsed));
252
+ await this.setMungedSDP(answer, write(sdpParsed));
191
253
  return answer;
192
254
  }
193
255
 
194
- setTrackCodecBitrate(sid: string, codec: string, maxbr: number) {
195
- this.trackBitrates.push({
196
- sid,
197
- codec,
198
- maxbr,
199
- });
256
+ setTrackCodecBitrate(info: TrackBitrateInfo) {
257
+ this.trackBitrates.push(info);
200
258
  }
201
259
 
202
260
  close() {
@@ -205,22 +263,32 @@ export default class PCTransport extends EventEmitter {
205
263
  this.pc.close();
206
264
  }
207
265
 
208
- private async setMungedLocalDescription(sd: RTCSessionDescriptionInit, munged: string) {
209
- const originalSdp = sd.sdp;
210
- sd.sdp = munged;
211
- try {
212
- log.debug('setting munged local description');
213
- await this.pc.setLocalDescription(sd);
214
- return;
215
- } catch (e) {
216
- log.warn(`not able to set ${sd.type}, falling back to unmodified sdp`, {
217
- error: e,
218
- });
219
- sd.sdp = originalSdp;
266
+ private async setMungedSDP(sd: RTCSessionDescriptionInit, munged?: string, remote?: boolean) {
267
+ if (munged) {
268
+ const originalSdp = sd.sdp;
269
+ sd.sdp = munged;
270
+ try {
271
+ log.debug(`setting munged ${remote ? 'remote' : 'local'} description`);
272
+ if (remote) {
273
+ await this.pc.setRemoteDescription(sd);
274
+ } else {
275
+ await this.pc.setLocalDescription(sd);
276
+ }
277
+ return;
278
+ } catch (e) {
279
+ log.warn(`not able to set ${sd.type}, falling back to unmodified sdp`, {
280
+ error: e,
281
+ });
282
+ sd.sdp = originalSdp;
283
+ }
220
284
  }
221
285
 
222
286
  try {
223
- await this.pc.setLocalDescription(sd);
287
+ if (remote) {
288
+ await this.pc.setRemoteDescription(sd);
289
+ } else {
290
+ await this.pc.setLocalDescription(sd);
291
+ }
224
292
  } catch (e) {
225
293
  // this error cannot always be caught.
226
294
  // If the local description has a setCodecPreferences error, this error will be uncaught
@@ -494,12 +494,12 @@ export default class LocalParticipant extends Participant {
494
494
  return existingPublication;
495
495
  }
496
496
 
497
- const isStereo =
498
- options?.forceStereo ||
497
+ const isStereoInput =
499
498
  ('channelCount' in track.mediaStreamTrack.getSettings() &&
500
499
  // @ts-ignore `channelCount` on getSettings() is currently only available for Safari, but is generally the best way to determine a stereo track https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/channelCount
501
500
  track.mediaStreamTrack.getSettings().channelCount === 2) ||
502
501
  track.mediaStreamTrack.getConstraints().channelCount === 2;
502
+ const isStereo = options?.forceStereo ?? isStereoInput;
503
503
 
504
504
  // disable dtx for stereo track if not enabled explicitly
505
505
  if (isStereo) {
@@ -730,12 +730,36 @@ export default class LocalParticipant extends Participant {
730
730
  // store RTPSender
731
731
  track.sender = await this.engine.createSender(track, opts, encodings);
732
732
 
733
- if (track.codec && isSVCCodec(track.codec) && encodings && encodings[0]?.maxBitrate) {
734
- this.engine.publisher.setTrackCodecBitrate(
735
- req.cid,
736
- track.codec,
737
- encodings[0].maxBitrate / 1000,
738
- );
733
+ if (encodings) {
734
+ if (isFireFox() && track.kind === Track.Kind.Audio) {
735
+ /* Refer to RFC https://datatracker.ietf.org/doc/html/rfc7587#section-6.1,
736
+ livekit-server uses maxaveragebitrate=510000in the answer sdp to permit client to
737
+ publish high quality audio track. But firefox always uses this value as the actual
738
+ bitrates, causing the audio bitrates to rise to 510Kbps in any stereo case unexpectedly.
739
+ So the client need to modify maxaverragebitrates in answer sdp to user provided value to
740
+ fix the issue.
741
+ */
742
+ let trackTransceiver: RTCRtpTransceiver | undefined = undefined;
743
+ for (const transceiver of this.engine.publisher.pc.getTransceivers()) {
744
+ if (transceiver.sender === track.sender) {
745
+ trackTransceiver = transceiver;
746
+ break;
747
+ }
748
+ }
749
+ if (trackTransceiver) {
750
+ this.engine.publisher.setTrackCodecBitrate({
751
+ transceiver: trackTransceiver,
752
+ codec: 'opus',
753
+ maxbr: encodings[0]?.maxBitrate ? encodings[0].maxBitrate / 1000 : 0,
754
+ });
755
+ }
756
+ } else if (track.codec && isSVCCodec(track.codec) && encodings[0]?.maxBitrate) {
757
+ this.engine.publisher.setTrackCodecBitrate({
758
+ cid: req.cid,
759
+ codec: track.codec,
760
+ maxbr: encodings[0].maxBitrate / 1000,
761
+ });
762
+ }
739
763
  }
740
764
 
741
765
  this.engine.negotiate();
@@ -10,7 +10,7 @@ import type {
10
10
  VideoCodec,
11
11
  VideoEncoding,
12
12
  } from '../track/options';
13
- import { getReactNativeOs, isReactNative, isSVCCodec } from '../utils';
13
+ import { getReactNativeOs, isFireFox, isReactNative, isSVCCodec } from '../utils';
14
14
 
15
15
  /** @internal */
16
16
  export function mediaTrackToLocalTrack(
@@ -118,6 +118,7 @@ export function computeVideoEncodings(
118
118
  height,
119
119
  videoEncoding.maxBitrate,
120
120
  videoEncoding.maxFramerate,
121
+ videoEncoding.priority,
121
122
  );
122
123
 
123
124
  if (scalabilityMode && isSVCCodec(videoCodec)) {
@@ -311,7 +312,8 @@ function encodingsFromPresets(
311
312
  if (preset.encoding.maxFramerate) {
312
313
  encoding.maxFramerate = preset.encoding.maxFramerate;
313
314
  }
314
- if (preset.encoding.priority) {
315
+ const canSetPriority = isFireFox() || idx === 0;
316
+ if (preset.encoding.priority && canSetPriority) {
315
317
  encoding.priority = preset.encoding.priority;
316
318
  encoding.networkPriority = preset.encoding.priority;
317
319
  }
@@ -45,7 +45,7 @@ export interface TrackPublishDefaults {
45
45
  red?: boolean;
46
46
 
47
47
  /**
48
- * stereo audio track. defaults determined by capture channel count.
48
+ * publish track in stereo mode (or set to false to disable). defaults determined by capture channel count.
49
49
  */
50
50
  forceStereo?: boolean;
51
51
 
@@ -1,5 +1,5 @@
1
1
  import { AudioCaptureOptions, VideoCaptureOptions, VideoPresets } from './options';
2
- import { constraintsForOptions, mergeDefaultOptions } from './utils';
2
+ import { constraintsForOptions, facingModeFromDeviceLabel, mergeDefaultOptions } from './utils';
3
3
 
4
4
  describe('mergeDefaultOptions', () => {
5
5
  const audioDefaults: AudioCaptureOptions = {
@@ -108,3 +108,32 @@ describe('constraintsForOptions', () => {
108
108
  expect(videoOpts.aspectRatio).toEqual(VideoPresets.h720.resolution.aspectRatio);
109
109
  });
110
110
  });
111
+
112
+ describe('Test facingMode detection', () => {
113
+ test('OBS virtual camera should be detected.', () => {
114
+ const result = facingModeFromDeviceLabel('OBS Virtual Camera');
115
+ expect(result?.facingMode).toEqual('environment');
116
+ expect(result?.confidence).toEqual('medium');
117
+ });
118
+
119
+ test.each([
120
+ ['Peter’s iPhone Camera', { facingMode: 'environment', confidence: 'medium' }],
121
+ ['iPhone de Théo Camera', { facingMode: 'environment', confidence: 'medium' }],
122
+ ])(
123
+ 'Device labels that contain "iphone" should return facingMode "environment".',
124
+ (label, expected) => {
125
+ const result = facingModeFromDeviceLabel(label);
126
+ expect(result?.facingMode).toEqual(expected.facingMode);
127
+ expect(result?.confidence).toEqual(expected.confidence);
128
+ },
129
+ );
130
+
131
+ test.each([
132
+ ['Peter’s iPad Camera', { facingMode: 'environment', confidence: 'medium' }],
133
+ ['iPad de Théo Camera', { facingMode: 'environment', confidence: 'medium' }],
134
+ ])('Device label that contain "ipad" should detect.', (label, expected) => {
135
+ const result = facingModeFromDeviceLabel(label);
136
+ expect(result?.facingMode).toEqual(expected.facingMode);
137
+ expect(result?.confidence).toEqual(expected.confidence);
138
+ });
139
+ });