livekit-client 1.14.1 → 1.14.2
Sign up to get free protection for your applications and to get access to all the features.
- 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 +25 -44
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +399 -196
- 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/e2ee/E2eeManager.d.ts.map +1 -1
- package/dist/src/e2ee/utils.d.ts +0 -1
- package/dist/src/e2ee/utils.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -1
- package/dist/src/proto/livekit_models_pb.d.ts +87 -11
- package/dist/src/proto/livekit_models_pb.d.ts.map +1 -1
- package/dist/src/proto/livekit_rtc_pb.d.ts +0 -4
- package/dist/src/proto/livekit_rtc_pb.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +20 -1
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +1 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/defaults.d.ts +1 -0
- package/dist/src/room/defaults.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/timers.d.ts +1 -1
- package/dist/src/room/timers.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 +3 -3
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts +2 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +0 -1
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/track/utils.d.ts +2 -1
- package/dist/src/room/track/utils.d.ts.map +1 -1
- package/dist/src/utils/cloneDeep.d.ts +2 -0
- package/dist/src/utils/cloneDeep.d.ts.map +1 -0
- package/dist/ts4.2/src/e2ee/utils.d.ts +0 -1
- package/dist/ts4.2/src/proto/livekit_models_pb.d.ts +87 -11
- package/dist/ts4.2/src/proto/livekit_rtc_pb.d.ts +0 -4
- package/dist/ts4.2/src/room/PCTransport.d.ts +20 -1
- package/dist/ts4.2/src/room/RTCEngine.d.ts +1 -1
- package/dist/ts4.2/src/room/defaults.d.ts +1 -0
- package/dist/ts4.2/src/room/events.d.ts +1 -1
- package/dist/ts4.2/src/room/timers.d.ts +1 -1
- package/dist/ts4.2/src/room/track/LocalAudioTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +3 -3
- package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +2 -1
- package/dist/ts4.2/src/room/track/options.d.ts +0 -1
- package/dist/ts4.2/src/room/track/utils.d.ts +1 -0
- package/dist/ts4.2/src/utils/cloneDeep.d.ts +2 -0
- package/package.json +14 -14
- package/src/connectionHelper/checks/webrtc.ts +1 -1
- package/src/e2ee/E2eeManager.ts +2 -1
- package/src/e2ee/utils.ts +0 -10
- package/src/e2ee/worker/FrameCryptor.ts +13 -14
- package/src/e2ee/worker/ParticipantKeyHandler.ts +4 -5
- package/src/e2ee/worker/e2ee.worker.ts +3 -1
- package/src/proto/livekit_models_pb.ts +140 -15
- package/src/proto/livekit_rtc_pb.ts +1 -7
- package/src/room/PCTransport.ts +116 -1
- package/src/room/RTCEngine.ts +49 -85
- package/src/room/Room.ts +10 -9
- package/src/room/defaults.ts +4 -2
- package/src/room/events.ts +1 -1
- package/src/room/participant/LocalParticipant.ts +44 -56
- package/src/room/track/LocalAudioTrack.ts +1 -1
- package/src/room/track/LocalTrack.ts +8 -5
- package/src/room/track/LocalVideoTrack.ts +2 -1
- package/src/room/track/options.ts +0 -7
- package/src/room/track/utils.ts +17 -8
- package/src/utils/cloneDeep.test.ts +54 -0
- package/src/utils/cloneDeep.ts +11 -0
@@ -3572,6 +3572,28 @@ proto3.util.setEnumType(VideoCodec, "livekit.VideoCodec", [{
|
|
3572
3572
|
no: 4,
|
3573
3573
|
name: "VP8"
|
3574
3574
|
}]);
|
3575
|
+
/**
|
3576
|
+
* @generated from enum livekit.ImageCodec
|
3577
|
+
*/
|
3578
|
+
var ImageCodec;
|
3579
|
+
(function (ImageCodec) {
|
3580
|
+
/**
|
3581
|
+
* @generated from enum value: IC_DEFAULT = 0;
|
3582
|
+
*/
|
3583
|
+
ImageCodec[ImageCodec["IC_DEFAULT"] = 0] = "IC_DEFAULT";
|
3584
|
+
/**
|
3585
|
+
* @generated from enum value: IC_JPEG = 1;
|
3586
|
+
*/
|
3587
|
+
ImageCodec[ImageCodec["IC_JPEG"] = 1] = "IC_JPEG";
|
3588
|
+
})(ImageCodec || (ImageCodec = {}));
|
3589
|
+
// Retrieve enum metadata with: proto3.getEnumType(ImageCodec)
|
3590
|
+
proto3.util.setEnumType(ImageCodec, "livekit.ImageCodec", [{
|
3591
|
+
no: 0,
|
3592
|
+
name: "IC_DEFAULT"
|
3593
|
+
}, {
|
3594
|
+
no: 1,
|
3595
|
+
name: "IC_JPEG"
|
3596
|
+
}]);
|
3575
3597
|
/**
|
3576
3598
|
* @generated from enum livekit.TrackType
|
3577
3599
|
*/
|
@@ -3997,11 +4019,6 @@ Room$1.fields = proto3.util.newFieldList(() => [{
|
|
3997
4019
|
name: "active_recording",
|
3998
4020
|
kind: "scalar",
|
3999
4021
|
T: 8 /* ScalarType.BOOL */
|
4000
|
-
}, {
|
4001
|
-
no: 12,
|
4002
|
-
name: "playout_delay",
|
4003
|
-
kind: "message",
|
4004
|
-
T: PlayoutDelay
|
4005
4022
|
}]);
|
4006
4023
|
/**
|
4007
4024
|
* @generated from message livekit.Codec
|
@@ -4926,6 +4943,10 @@ class UserPacket extends Message {
|
|
4926
4943
|
* @generated from field: string participant_sid = 1;
|
4927
4944
|
*/
|
4928
4945
|
this.participantSid = "";
|
4946
|
+
/**
|
4947
|
+
* @generated from field: string participant_identity = 5;
|
4948
|
+
*/
|
4949
|
+
this.participantIdentity = "";
|
4929
4950
|
/**
|
4930
4951
|
* user defined payload
|
4931
4952
|
*
|
@@ -4933,11 +4954,17 @@ class UserPacket extends Message {
|
|
4933
4954
|
*/
|
4934
4955
|
this.payload = new Uint8Array(0);
|
4935
4956
|
/**
|
4936
|
-
* the ID of the participants who will receive the message (
|
4957
|
+
* the ID of the participants who will receive the message (sent to all by default)
|
4937
4958
|
*
|
4938
4959
|
* @generated from field: repeated string destination_sids = 3;
|
4939
4960
|
*/
|
4940
4961
|
this.destinationSids = [];
|
4962
|
+
/**
|
4963
|
+
* identities of participants who will receive the message (sent to all by default)
|
4964
|
+
*
|
4965
|
+
* @generated from field: repeated string destination_identities = 6;
|
4966
|
+
*/
|
4967
|
+
this.destinationIdentities = [];
|
4941
4968
|
proto3.util.initPartial(data, this);
|
4942
4969
|
}
|
4943
4970
|
static fromBinary(bytes, options) {
|
@@ -4960,6 +4987,11 @@ UserPacket.fields = proto3.util.newFieldList(() => [{
|
|
4960
4987
|
name: "participant_sid",
|
4961
4988
|
kind: "scalar",
|
4962
4989
|
T: 9 /* ScalarType.STRING */
|
4990
|
+
}, {
|
4991
|
+
no: 5,
|
4992
|
+
name: "participant_identity",
|
4993
|
+
kind: "scalar",
|
4994
|
+
T: 9 /* ScalarType.STRING */
|
4963
4995
|
}, {
|
4964
4996
|
no: 2,
|
4965
4997
|
name: "payload",
|
@@ -4971,6 +5003,12 @@ UserPacket.fields = proto3.util.newFieldList(() => [{
|
|
4971
5003
|
kind: "scalar",
|
4972
5004
|
T: 9 /* ScalarType.STRING */,
|
4973
5005
|
repeated: true
|
5006
|
+
}, {
|
5007
|
+
no: 6,
|
5008
|
+
name: "destination_identities",
|
5009
|
+
kind: "scalar",
|
5010
|
+
T: 9 /* ScalarType.STRING */,
|
5011
|
+
repeated: true
|
4974
5012
|
}, {
|
4975
5013
|
no: 4,
|
4976
5014
|
name: "topic",
|
@@ -5286,6 +5324,14 @@ var ClientInfo_SDK;
|
|
5286
5324
|
* @generated from enum value: RUST = 8;
|
5287
5325
|
*/
|
5288
5326
|
ClientInfo_SDK[ClientInfo_SDK["RUST"] = 8] = "RUST";
|
5327
|
+
/**
|
5328
|
+
* @generated from enum value: PYTHON = 9;
|
5329
|
+
*/
|
5330
|
+
ClientInfo_SDK[ClientInfo_SDK["PYTHON"] = 9] = "PYTHON";
|
5331
|
+
/**
|
5332
|
+
* @generated from enum value: CPP = 10;
|
5333
|
+
*/
|
5334
|
+
ClientInfo_SDK[ClientInfo_SDK["CPP"] = 10] = "CPP";
|
5289
5335
|
})(ClientInfo_SDK || (ClientInfo_SDK = {}));
|
5290
5336
|
// Retrieve enum metadata with: proto3.getEnumType(ClientInfo_SDK)
|
5291
5337
|
proto3.util.setEnumType(ClientInfo_SDK, "livekit.ClientInfo.SDK", [{
|
@@ -5315,6 +5361,12 @@ proto3.util.setEnumType(ClientInfo_SDK, "livekit.ClientInfo.SDK", [{
|
|
5315
5361
|
}, {
|
5316
5362
|
no: 8,
|
5317
5363
|
name: "RUST"
|
5364
|
+
}, {
|
5365
|
+
no: 9,
|
5366
|
+
name: "PYTHON"
|
5367
|
+
}, {
|
5368
|
+
no: 10,
|
5369
|
+
name: "CPP"
|
5318
5370
|
}]);
|
5319
5371
|
/**
|
5320
5372
|
* server provided client configuration
|
@@ -5456,6 +5508,103 @@ DisabledCodecs.fields = proto3.util.newFieldList(() => [{
|
|
5456
5508
|
T: Codec,
|
5457
5509
|
repeated: true
|
5458
5510
|
}]);
|
5511
|
+
/**
|
5512
|
+
* @generated from message livekit.RTPDrift
|
5513
|
+
*/
|
5514
|
+
class RTPDrift extends Message {
|
5515
|
+
constructor(data) {
|
5516
|
+
super();
|
5517
|
+
/**
|
5518
|
+
* @generated from field: double duration = 3;
|
5519
|
+
*/
|
5520
|
+
this.duration = 0;
|
5521
|
+
/**
|
5522
|
+
* @generated from field: uint64 start_timestamp = 4;
|
5523
|
+
*/
|
5524
|
+
this.startTimestamp = protoInt64.zero;
|
5525
|
+
/**
|
5526
|
+
* @generated from field: uint64 end_timestamp = 5;
|
5527
|
+
*/
|
5528
|
+
this.endTimestamp = protoInt64.zero;
|
5529
|
+
/**
|
5530
|
+
* @generated from field: uint64 rtp_clock_ticks = 6;
|
5531
|
+
*/
|
5532
|
+
this.rtpClockTicks = protoInt64.zero;
|
5533
|
+
/**
|
5534
|
+
* @generated from field: int64 drift_samples = 7;
|
5535
|
+
*/
|
5536
|
+
this.driftSamples = protoInt64.zero;
|
5537
|
+
/**
|
5538
|
+
* @generated from field: double drift_ms = 8;
|
5539
|
+
*/
|
5540
|
+
this.driftMs = 0;
|
5541
|
+
/**
|
5542
|
+
* @generated from field: double clock_rate = 9;
|
5543
|
+
*/
|
5544
|
+
this.clockRate = 0;
|
5545
|
+
proto3.util.initPartial(data, this);
|
5546
|
+
}
|
5547
|
+
static fromBinary(bytes, options) {
|
5548
|
+
return new RTPDrift().fromBinary(bytes, options);
|
5549
|
+
}
|
5550
|
+
static fromJson(jsonValue, options) {
|
5551
|
+
return new RTPDrift().fromJson(jsonValue, options);
|
5552
|
+
}
|
5553
|
+
static fromJsonString(jsonString, options) {
|
5554
|
+
return new RTPDrift().fromJsonString(jsonString, options);
|
5555
|
+
}
|
5556
|
+
static equals(a, b) {
|
5557
|
+
return proto3.util.equals(RTPDrift, a, b);
|
5558
|
+
}
|
5559
|
+
}
|
5560
|
+
RTPDrift.runtime = proto3;
|
5561
|
+
RTPDrift.typeName = "livekit.RTPDrift";
|
5562
|
+
RTPDrift.fields = proto3.util.newFieldList(() => [{
|
5563
|
+
no: 1,
|
5564
|
+
name: "start_time",
|
5565
|
+
kind: "message",
|
5566
|
+
T: Timestamp
|
5567
|
+
}, {
|
5568
|
+
no: 2,
|
5569
|
+
name: "end_time",
|
5570
|
+
kind: "message",
|
5571
|
+
T: Timestamp
|
5572
|
+
}, {
|
5573
|
+
no: 3,
|
5574
|
+
name: "duration",
|
5575
|
+
kind: "scalar",
|
5576
|
+
T: 1 /* ScalarType.DOUBLE */
|
5577
|
+
}, {
|
5578
|
+
no: 4,
|
5579
|
+
name: "start_timestamp",
|
5580
|
+
kind: "scalar",
|
5581
|
+
T: 4 /* ScalarType.UINT64 */
|
5582
|
+
}, {
|
5583
|
+
no: 5,
|
5584
|
+
name: "end_timestamp",
|
5585
|
+
kind: "scalar",
|
5586
|
+
T: 4 /* ScalarType.UINT64 */
|
5587
|
+
}, {
|
5588
|
+
no: 6,
|
5589
|
+
name: "rtp_clock_ticks",
|
5590
|
+
kind: "scalar",
|
5591
|
+
T: 4 /* ScalarType.UINT64 */
|
5592
|
+
}, {
|
5593
|
+
no: 7,
|
5594
|
+
name: "drift_samples",
|
5595
|
+
kind: "scalar",
|
5596
|
+
T: 3 /* ScalarType.INT64 */
|
5597
|
+
}, {
|
5598
|
+
no: 8,
|
5599
|
+
name: "drift_ms",
|
5600
|
+
kind: "scalar",
|
5601
|
+
T: 1 /* ScalarType.DOUBLE */
|
5602
|
+
}, {
|
5603
|
+
no: 9,
|
5604
|
+
name: "clock_rate",
|
5605
|
+
kind: "scalar",
|
5606
|
+
T: 1 /* ScalarType.DOUBLE */
|
5607
|
+
}]);
|
5459
5608
|
/**
|
5460
5609
|
* @generated from message livekit.RTPStats
|
5461
5610
|
*/
|
@@ -5602,16 +5751,6 @@ class RTPStats extends Message {
|
|
5602
5751
|
* @generated from field: uint32 layer_lock_plis = 35;
|
5603
5752
|
*/
|
5604
5753
|
this.layerLockPlis = 0;
|
5605
|
-
/**
|
5606
|
-
* @generated from field: double sample_rate = 42;
|
5607
|
-
*/
|
5608
|
-
this.sampleRate = 0;
|
5609
|
-
/**
|
5610
|
-
* NEXT_ID: 44
|
5611
|
-
*
|
5612
|
-
* @generated from field: double drift_ms = 43;
|
5613
|
-
*/
|
5614
|
-
this.driftMs = 0;
|
5615
5754
|
proto3.util.initPartial(data, this);
|
5616
5755
|
}
|
5617
5756
|
static fromBinary(bytes, options) {
|
@@ -5839,15 +5978,15 @@ RTPStats.fields = proto3.util.newFieldList(() => [{
|
|
5839
5978
|
kind: "message",
|
5840
5979
|
T: Timestamp
|
5841
5980
|
}, {
|
5842
|
-
no:
|
5843
|
-
name: "
|
5844
|
-
kind: "
|
5845
|
-
T:
|
5981
|
+
no: 44,
|
5982
|
+
name: "packet_drift",
|
5983
|
+
kind: "message",
|
5984
|
+
T: RTPDrift
|
5846
5985
|
}, {
|
5847
|
-
no:
|
5848
|
-
name: "
|
5849
|
-
kind: "
|
5850
|
-
T:
|
5986
|
+
no: 45,
|
5987
|
+
name: "report_drift",
|
5988
|
+
kind: "message",
|
5989
|
+
T: RTPDrift
|
5851
5990
|
}]);
|
5852
5991
|
/**
|
5853
5992
|
* @generated from message livekit.TimedVersion
|
@@ -5920,7 +6059,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
5920
6059
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
5921
6060
|
PERFORMANCE OF THIS SOFTWARE.
|
5922
6061
|
***************************************************************************** */
|
5923
|
-
/* global Reflect, Promise */
|
6062
|
+
/* global Reflect, Promise, SuppressedError, Symbol */
|
5924
6063
|
|
5925
6064
|
|
5926
6065
|
function __awaiter(thisArg, _arguments, P, generator) {
|
@@ -5951,7 +6090,12 @@ function __asyncValues(o) {
|
|
5951
6090
|
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
5952
6091
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
5953
6092
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
5954
|
-
}
|
6093
|
+
}
|
6094
|
+
|
6095
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
6096
|
+
var e = new Error(message);
|
6097
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
6098
|
+
};
|
5955
6099
|
|
5956
6100
|
var events = {exports: {}};
|
5957
6101
|
|
@@ -9825,10 +9969,6 @@ class SimulcastCodec extends Message {
|
|
9825
9969
|
* @generated from field: string cid = 2;
|
9826
9970
|
*/
|
9827
9971
|
this.cid = "";
|
9828
|
-
/**
|
9829
|
-
* @generated from field: bool enable_simulcast_layers = 3;
|
9830
|
-
*/
|
9831
|
-
this.enableSimulcastLayers = false;
|
9832
9972
|
proto3.util.initPartial(data, this);
|
9833
9973
|
}
|
9834
9974
|
static fromBinary(bytes, options) {
|
@@ -9856,11 +9996,6 @@ SimulcastCodec.fields = proto3.util.newFieldList(() => [{
|
|
9856
9996
|
name: "cid",
|
9857
9997
|
kind: "scalar",
|
9858
9998
|
T: 9 /* ScalarType.STRING */
|
9859
|
-
}, {
|
9860
|
-
no: 3,
|
9861
|
-
name: "enable_simulcast_layers",
|
9862
|
-
kind: "scalar",
|
9863
|
-
T: 8 /* ScalarType.BOOL */
|
9864
9999
|
}]);
|
9865
10000
|
/**
|
9866
10001
|
* @generated from message livekit.AddTrackRequest
|
@@ -11863,7 +11998,7 @@ function getMatch(exp, ua) {
|
|
11863
11998
|
return match && match.length >= id && match[id] || '';
|
11864
11999
|
}
|
11865
12000
|
|
11866
|
-
var version$1 = "1.14.
|
12001
|
+
var version$1 = "1.14.2";
|
11867
12002
|
|
11868
12003
|
const version = version$1;
|
11869
12004
|
const protocolVersion = 10;
|
@@ -11892,9 +12027,6 @@ const videoCodecs = ['vp8', 'h264', 'vp9', 'av1'];
|
|
11892
12027
|
function isBackupCodec(codec) {
|
11893
12028
|
return !!backupCodecs.find(backup => backup === codec);
|
11894
12029
|
}
|
11895
|
-
function isCodecEqual(c1, c2) {
|
11896
|
-
return (c1 === null || c1 === void 0 ? void 0 : c1.toLowerCase().replace(/audio\/|video\//y, '')) === (c2 === null || c2 === void 0 ? void 0 : c2.toLowerCase().replace(/audio\/|video\//y, ''));
|
11897
|
-
}
|
11898
12030
|
var AudioPresets;
|
11899
12031
|
(function (AudioPresets) {
|
11900
12032
|
AudioPresets.telephone = {
|
@@ -11953,6 +12085,17 @@ const ScreenSharePresets = {
|
|
11953
12085
|
h1080fps30: new VideoPreset(1920, 1080, 4000000, 30, 'medium')
|
11954
12086
|
};
|
11955
12087
|
|
12088
|
+
function cloneDeep(value) {
|
12089
|
+
if (typeof value === 'undefined') {
|
12090
|
+
return;
|
12091
|
+
}
|
12092
|
+
if (typeof structuredClone === 'function') {
|
12093
|
+
return structuredClone(value);
|
12094
|
+
} else {
|
12095
|
+
return JSON.parse(JSON.stringify(value));
|
12096
|
+
}
|
12097
|
+
}
|
12098
|
+
|
11956
12099
|
/**
|
11957
12100
|
* Events are the primary way LiveKit notifies your application of changes.
|
11958
12101
|
*
|
@@ -12152,7 +12295,7 @@ var RoomEvent;
|
|
12152
12295
|
* be emitted.
|
12153
12296
|
*
|
12154
12297
|
* args: (pub: [[RemoteTrackPublication]],
|
12155
|
-
* status: [[TrackPublication.
|
12298
|
+
* status: [[TrackPublication.PermissionStatus]],
|
12156
12299
|
* participant: [[RemoteParticipant]])
|
12157
12300
|
*/
|
12158
12301
|
RoomEvent["TrackSubscriptionPermissionChanged"] = "trackSubscriptionPermissionChanged";
|
@@ -12772,7 +12915,8 @@ function detachTrack(track, element) {
|
|
12772
12915
|
})(Track || (Track = {}));
|
12773
12916
|
|
12774
12917
|
function mergeDefaultOptions(options, audioDefaults, videoDefaults) {
|
12775
|
-
|
12918
|
+
var _a;
|
12919
|
+
const opts = (_a = cloneDeep(options)) !== null && _a !== void 0 ? _a : {};
|
12776
12920
|
if (opts.audio === true) opts.audio = {};
|
12777
12921
|
if (opts.video === true) opts.video = {};
|
12778
12922
|
// use defaults
|
@@ -12915,6 +13059,13 @@ function screenCaptureToDisplayMediaStreamOptions(options) {
|
|
12915
13059
|
systemAudio: options.systemAudio
|
12916
13060
|
};
|
12917
13061
|
}
|
13062
|
+
function mimeTypeToVideoCodecString(mimeType) {
|
13063
|
+
const codec = mimeType.split('/')[1].toLowerCase();
|
13064
|
+
if (!videoCodecs.includes(codec)) {
|
13065
|
+
throw Error("Video codec not supported: ".concat(codec));
|
13066
|
+
}
|
13067
|
+
return codec;
|
13068
|
+
}
|
12918
13069
|
|
12919
13070
|
const separator = '|';
|
12920
13071
|
const ddExtensionURI = 'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension';
|
@@ -14047,13 +14198,6 @@ function deriveKeys(material, salt) {
|
|
14047
14198
|
function createE2EEKey() {
|
14048
14199
|
return window.crypto.getRandomValues(new Uint8Array(32));
|
14049
14200
|
}
|
14050
|
-
function mimeTypeToVideoCodecString(mimeType) {
|
14051
|
-
const codec = mimeType.split('/')[1].toLowerCase();
|
14052
|
-
if (!videoCodecs.includes(codec)) {
|
14053
|
-
throw Error("Video codec not supported: ".concat(codec));
|
14054
|
-
}
|
14055
|
-
return codec;
|
14056
|
-
}
|
14057
14201
|
/**
|
14058
14202
|
* Ratchets a key. See
|
14059
14203
|
* https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1
|
@@ -14441,10 +14585,16 @@ class LocalTrack extends Track {
|
|
14441
14585
|
}
|
14442
14586
|
waitForDimensions() {
|
14443
14587
|
let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultDimensionsTimeout;
|
14588
|
+
var _a;
|
14444
14589
|
return __awaiter(this, void 0, void 0, function* () {
|
14445
14590
|
if (this.kind === Track.Kind.Audio) {
|
14446
14591
|
throw new Error('cannot get dimensions for audio tracks');
|
14447
14592
|
}
|
14593
|
+
if (((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.os) === 'iOS') {
|
14594
|
+
// browsers report wrong initial resolution on iOS.
|
14595
|
+
// when slightly delaying the call to .getSettings(), the correct resolution is being reported
|
14596
|
+
yield sleep(10);
|
14597
|
+
}
|
14448
14598
|
const started = Date.now();
|
14449
14599
|
while (Date.now() - started < timeout) {
|
14450
14600
|
const dims = this.dimensions;
|
@@ -15773,6 +15923,27 @@ class PCTransport extends eventsExports.EventEmitter {
|
|
15773
15923
|
this._pc = isChromiumBased() ?
|
15774
15924
|
// @ts-expect-error chrome allows additional media constraints to be passed into the RTCPeerConnection constructor
|
15775
15925
|
new RTCPeerConnection(config, mediaConstraints) : new RTCPeerConnection(config);
|
15926
|
+
this._pc.onicecandidate = ev => {
|
15927
|
+
var _a;
|
15928
|
+
if (!ev.candidate) return;
|
15929
|
+
(_a = this.onIceCandidate) === null || _a === void 0 ? void 0 : _a.call(this, ev.candidate);
|
15930
|
+
};
|
15931
|
+
this._pc.onicecandidateerror = ev => {
|
15932
|
+
var _a;
|
15933
|
+
(_a = this.onIceCandidateError) === null || _a === void 0 ? void 0 : _a.call(this, ev);
|
15934
|
+
};
|
15935
|
+
this._pc.onconnectionstatechange = () => {
|
15936
|
+
var _a, _b, _c;
|
15937
|
+
(_a = this.onConnectionStateChange) === null || _a === void 0 ? void 0 : _a.call(this, (_c = (_b = this._pc) === null || _b === void 0 ? void 0 : _b.connectionState) !== null && _c !== void 0 ? _c : 'closed');
|
15938
|
+
};
|
15939
|
+
this._pc.ondatachannel = ev => {
|
15940
|
+
var _a;
|
15941
|
+
(_a = this.onDataChannel) === null || _a === void 0 ? void 0 : _a.call(this, ev);
|
15942
|
+
};
|
15943
|
+
this._pc.ontrack = ev => {
|
15944
|
+
var _a;
|
15945
|
+
(_a = this.onTrack) === null || _a === void 0 ? void 0 : _a.call(this, ev);
|
15946
|
+
};
|
15776
15947
|
}
|
15777
15948
|
get isICEConnected() {
|
15778
15949
|
return this._pc !== null && (this.pc.iceConnectionState === 'connected' || this.pc.iceConnectionState === 'completed');
|
@@ -15955,9 +16126,85 @@ class PCTransport extends eventsExports.EventEmitter {
|
|
15955
16126
|
return answer;
|
15956
16127
|
});
|
15957
16128
|
}
|
16129
|
+
createDataChannel(label, dataChannelDict) {
|
16130
|
+
return this.pc.createDataChannel(label, dataChannelDict);
|
16131
|
+
}
|
16132
|
+
addTransceiver(mediaStreamTrack, transceiverInit) {
|
16133
|
+
return this.pc.addTransceiver(mediaStreamTrack, transceiverInit);
|
16134
|
+
}
|
16135
|
+
addTrack(track) {
|
16136
|
+
return this.pc.addTrack(track);
|
16137
|
+
}
|
15958
16138
|
setTrackCodecBitrate(info) {
|
15959
16139
|
this.trackBitrates.push(info);
|
15960
16140
|
}
|
16141
|
+
setConfiguration(rtcConfig) {
|
16142
|
+
return this.pc.setConfiguration(rtcConfig);
|
16143
|
+
}
|
16144
|
+
canRemoveTrack() {
|
16145
|
+
return !!this.pc.removeTrack;
|
16146
|
+
}
|
16147
|
+
removeTrack(sender) {
|
16148
|
+
return this.pc.removeTrack(sender);
|
16149
|
+
}
|
16150
|
+
getConnectionState() {
|
16151
|
+
return this.pc.connectionState;
|
16152
|
+
}
|
16153
|
+
getICEConnectionState() {
|
16154
|
+
return this.pc.iceConnectionState;
|
16155
|
+
}
|
16156
|
+
getSignallingState() {
|
16157
|
+
return this.pc.signalingState;
|
16158
|
+
}
|
16159
|
+
getTransceivers() {
|
16160
|
+
return this.pc.getTransceivers();
|
16161
|
+
}
|
16162
|
+
getSenders() {
|
16163
|
+
return this.pc.getSenders();
|
16164
|
+
}
|
16165
|
+
getLocalDescription() {
|
16166
|
+
return this.pc.localDescription;
|
16167
|
+
}
|
16168
|
+
getRemoteDescription() {
|
16169
|
+
return this.pc.remoteDescription;
|
16170
|
+
}
|
16171
|
+
getConnectedAddress() {
|
16172
|
+
var _a;
|
16173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
16174
|
+
if (!this._pc) {
|
16175
|
+
return;
|
16176
|
+
}
|
16177
|
+
let selectedCandidatePairId = '';
|
16178
|
+
const candidatePairs = new Map();
|
16179
|
+
// id -> candidate ip
|
16180
|
+
const candidates = new Map();
|
16181
|
+
const stats = yield this._pc.getStats();
|
16182
|
+
stats.forEach(v => {
|
16183
|
+
switch (v.type) {
|
16184
|
+
case 'transport':
|
16185
|
+
selectedCandidatePairId = v.selectedCandidatePairId;
|
16186
|
+
break;
|
16187
|
+
case 'candidate-pair':
|
16188
|
+
if (selectedCandidatePairId === '' && v.selected) {
|
16189
|
+
selectedCandidatePairId = v.id;
|
16190
|
+
}
|
16191
|
+
candidatePairs.set(v.id, v);
|
16192
|
+
break;
|
16193
|
+
case 'remote-candidate':
|
16194
|
+
candidates.set(v.id, "".concat(v.address, ":").concat(v.port));
|
16195
|
+
break;
|
16196
|
+
}
|
16197
|
+
});
|
16198
|
+
if (selectedCandidatePairId === '') {
|
16199
|
+
return undefined;
|
16200
|
+
}
|
16201
|
+
const selectedID = (_a = candidatePairs.get(selectedCandidatePairId)) === null || _a === void 0 ? void 0 : _a.remoteCandidateId;
|
16202
|
+
if (selectedID === undefined) {
|
16203
|
+
return undefined;
|
16204
|
+
}
|
16205
|
+
return candidates.get(selectedID);
|
16206
|
+
});
|
16207
|
+
}
|
15961
16208
|
close() {
|
15962
16209
|
if (!this._pc) {
|
15963
16210
|
return;
|
@@ -16118,6 +16365,7 @@ function extractStereoAndNackAudioFromOffer(offer) {
|
|
16118
16365
|
};
|
16119
16366
|
}
|
16120
16367
|
|
16368
|
+
const defaultVideoCodec = 'vp8';
|
16121
16369
|
const publishDefaults = {
|
16122
16370
|
/**
|
16123
16371
|
* @deprecated
|
@@ -16130,7 +16378,7 @@ const publishDefaults = {
|
|
16130
16378
|
simulcast: true,
|
16131
16379
|
screenShareEncoding: ScreenSharePresets.h1080fps15.encoding,
|
16132
16380
|
stopMicTrackOnMute: false,
|
16133
|
-
videoCodec:
|
16381
|
+
videoCodec: defaultVideoCodec,
|
16134
16382
|
backupCodec: false
|
16135
16383
|
};
|
16136
16384
|
const audioDefaults = {
|
@@ -16403,13 +16651,13 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16403
16651
|
}
|
16404
16652
|
cleanupPeerConnections() {
|
16405
16653
|
return __awaiter(this, void 0, void 0, function* () {
|
16406
|
-
if (this.publisher && this.publisher.
|
16407
|
-
this.publisher.
|
16654
|
+
if (this.publisher && this.publisher.getSignallingState() !== 'closed') {
|
16655
|
+
this.publisher.getSenders().forEach(sender => {
|
16408
16656
|
var _a, _b;
|
16409
16657
|
try {
|
16410
16658
|
// TODO: react-native-webrtc doesn't have removeTrack yet.
|
16411
|
-
if ((_a = this.publisher) === null || _a === void 0 ? void 0 : _a.
|
16412
|
-
(_b = this.publisher) === null || _b === void 0 ? void 0 : _b.
|
16659
|
+
if ((_a = this.publisher) === null || _a === void 0 ? void 0 : _a.canRemoveTrack()) {
|
16660
|
+
(_b = this.publisher) === null || _b === void 0 ? void 0 : _b.removeTrack(sender);
|
16413
16661
|
}
|
16414
16662
|
} catch (e) {
|
16415
16663
|
livekitLogger.warn('could not removeTrack', {
|
@@ -16427,7 +16675,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16427
16675
|
this.subscriber = undefined;
|
16428
16676
|
}
|
16429
16677
|
this.hasPublished = false;
|
16430
|
-
this.
|
16678
|
+
this.primaryTransport = undefined;
|
16431
16679
|
const dcCleanup = dc => {
|
16432
16680
|
if (!dc) return;
|
16433
16681
|
dc.close();
|
@@ -16494,7 +16742,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16494
16742
|
delete this.pendingTrackResolvers[sender.track.id];
|
16495
16743
|
}
|
16496
16744
|
try {
|
16497
|
-
(_a = this.publisher) === null || _a === void 0 ? void 0 : _a.
|
16745
|
+
(_a = this.publisher) === null || _a === void 0 ? void 0 : _a.removeTrack(sender);
|
16498
16746
|
return true;
|
16499
16747
|
} catch (e) {
|
16500
16748
|
livekitLogger.warn('failed to remove track', {
|
@@ -16513,10 +16761,10 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16513
16761
|
}
|
16514
16762
|
getConnectedServerAddress() {
|
16515
16763
|
return __awaiter(this, void 0, void 0, function* () {
|
16516
|
-
if (this.
|
16764
|
+
if (this.primaryTransport === undefined) {
|
16517
16765
|
return undefined;
|
16518
16766
|
}
|
16519
|
-
return getConnectedAddress(
|
16767
|
+
return this.primaryTransport.getConnectedAddress();
|
16520
16768
|
});
|
16521
16769
|
}
|
16522
16770
|
/* @internal */
|
@@ -16545,37 +16793,35 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16545
16793
|
this.publisher = new PCTransport(rtcConfig, googConstraints);
|
16546
16794
|
this.subscriber = new PCTransport(rtcConfig);
|
16547
16795
|
this.emit(EngineEvent.TransportsCreated, this.publisher, this.subscriber);
|
16548
|
-
this.publisher.
|
16549
|
-
|
16550
|
-
|
16551
|
-
this.client.sendIceCandidate(ev.candidate, SignalTarget.PUBLISHER);
|
16796
|
+
this.publisher.onIceCandidate = candidate => {
|
16797
|
+
livekitLogger.trace('adding ICE candidate for peer', candidate);
|
16798
|
+
this.client.sendIceCandidate(candidate, SignalTarget.PUBLISHER);
|
16552
16799
|
};
|
16553
|
-
this.subscriber.
|
16554
|
-
|
16555
|
-
this.client.sendIceCandidate(ev.candidate, SignalTarget.SUBSCRIBER);
|
16800
|
+
this.subscriber.onIceCandidate = candidate => {
|
16801
|
+
this.client.sendIceCandidate(candidate, SignalTarget.SUBSCRIBER);
|
16556
16802
|
};
|
16557
16803
|
this.publisher.onOffer = offer => {
|
16558
16804
|
this.client.sendOffer(offer);
|
16559
16805
|
};
|
16560
|
-
let
|
16561
|
-
let
|
16806
|
+
let primaryTransport = this.publisher;
|
16807
|
+
let secondaryTransport = this.subscriber;
|
16562
16808
|
let subscriberPrimary = joinResponse.subscriberPrimary;
|
16563
16809
|
if (subscriberPrimary) {
|
16564
|
-
|
16565
|
-
|
16810
|
+
primaryTransport = this.subscriber;
|
16811
|
+
secondaryTransport = this.publisher;
|
16566
16812
|
// in subscriber primary mode, server side opens sub data channels.
|
16567
|
-
this.subscriber.
|
16813
|
+
this.subscriber.onDataChannel = this.handleDataChannel;
|
16568
16814
|
}
|
16569
|
-
this.
|
16570
|
-
|
16571
|
-
livekitLogger.debug("primary PC state changed ".concat(
|
16572
|
-
if (
|
16815
|
+
this.primaryTransport = primaryTransport;
|
16816
|
+
primaryTransport.onConnectionStateChange = connectionState => __awaiter(this, void 0, void 0, function* () {
|
16817
|
+
livekitLogger.debug("primary PC state changed ".concat(connectionState));
|
16818
|
+
if (connectionState === 'connected') {
|
16573
16819
|
const shouldEmit = this.pcState === PCState.New;
|
16574
16820
|
this.pcState = PCState.Connected;
|
16575
16821
|
if (shouldEmit) {
|
16576
16822
|
this.emit(EngineEvent.Connected, joinResponse);
|
16577
16823
|
}
|
16578
|
-
} else if (
|
16824
|
+
} else if (connectionState === 'failed') {
|
16579
16825
|
// on Safari, PeerConnection will switch to 'disconnected' during renegotiation
|
16580
16826
|
if (this.pcState === PCState.Connected) {
|
16581
16827
|
this.pcState = PCState.Disconnected;
|
@@ -16583,14 +16829,14 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16583
16829
|
}
|
16584
16830
|
}
|
16585
16831
|
});
|
16586
|
-
|
16587
|
-
livekitLogger.debug("secondary PC state changed ".concat(
|
16832
|
+
secondaryTransport.onConnectionStateChange = connectionState => __awaiter(this, void 0, void 0, function* () {
|
16833
|
+
livekitLogger.debug("secondary PC state changed ".concat(connectionState));
|
16588
16834
|
// also reconnect if secondary peerconnection fails
|
16589
|
-
if (
|
16835
|
+
if (connectionState === 'failed') {
|
16590
16836
|
this.handleDisconnect('secondary peerconnection', subscriberPrimary ? ReconnectReason.RR_PUBLISHER_FAILED : ReconnectReason.RR_SUBSCRIBER_FAILED);
|
16591
16837
|
}
|
16592
16838
|
});
|
16593
|
-
this.subscriber.
|
16839
|
+
this.subscriber.onTrack = ev => {
|
16594
16840
|
this.emit(EngineEvent.MediaTrackAdded, ev.track, ev.streams[0], ev.receiver);
|
16595
16841
|
};
|
16596
16842
|
this.createDataChannels();
|
@@ -16603,7 +16849,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16603
16849
|
}
|
16604
16850
|
livekitLogger.debug('received server answer', {
|
16605
16851
|
RTCSdpType: sd.type,
|
16606
|
-
signalingState: this.publisher.
|
16852
|
+
signalingState: this.publisher.getSignallingState().toString()
|
16607
16853
|
});
|
16608
16854
|
yield this.publisher.setRemoteDescription(sd);
|
16609
16855
|
});
|
@@ -16629,7 +16875,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16629
16875
|
}
|
16630
16876
|
livekitLogger.debug('received server offer', {
|
16631
16877
|
RTCSdpType: sd.type,
|
16632
|
-
signalingState: this.subscriber.
|
16878
|
+
signalingState: this.subscriber.getSignallingState().toString()
|
16633
16879
|
});
|
16634
16880
|
yield this.subscriber.setRemoteDescription(sd);
|
16635
16881
|
// answer the offer
|
@@ -16657,7 +16903,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16657
16903
|
this.client.onLeave = leave => {
|
16658
16904
|
if (leave === null || leave === void 0 ? void 0 : leave.canReconnect) {
|
16659
16905
|
this.fullReconnectOnNext = true;
|
16660
|
-
this.
|
16906
|
+
this.primaryTransport = undefined;
|
16661
16907
|
// reconnect immediately instead of waiting for next attempt
|
16662
16908
|
this.handleDisconnect(leaveReconnect);
|
16663
16909
|
} else {
|
@@ -16709,12 +16955,12 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16709
16955
|
this.reliableDC.onerror = null;
|
16710
16956
|
}
|
16711
16957
|
// create data channels
|
16712
|
-
this.lossyDC = this.publisher.
|
16958
|
+
this.lossyDC = this.publisher.createDataChannel(lossyDataChannel, {
|
16713
16959
|
// will drop older packets that arrive
|
16714
16960
|
ordered: true,
|
16715
16961
|
maxRetransmits: 0
|
16716
16962
|
});
|
16717
|
-
this.reliableDC = this.publisher.
|
16963
|
+
this.reliableDC = this.publisher.createDataChannel(reliableDataChannel, {
|
16718
16964
|
ordered: true
|
16719
16965
|
});
|
16720
16966
|
// also handle messages over the pub channel, for backwards compatibility
|
@@ -16811,7 +17057,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16811
17057
|
transceiverInit.sendEncodings = encodings;
|
16812
17058
|
}
|
16813
17059
|
// addTransceiver for react-native is async. web is synchronous, but await won't effect it.
|
16814
|
-
const transceiver = yield this.publisher.
|
17060
|
+
const transceiver = yield this.publisher.addTransceiver(track.mediaStreamTrack, transceiverInit);
|
16815
17061
|
if (track.kind === Track.Kind.Video && opts.videoCodec) {
|
16816
17062
|
this.setPreferredCodec(transceiver, track.kind, opts.videoCodec);
|
16817
17063
|
track.codec = opts.videoCodec;
|
@@ -16831,7 +17077,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16831
17077
|
transceiverInit.sendEncodings = encodings;
|
16832
17078
|
}
|
16833
17079
|
// addTransceiver for react-native is async. web is synchronous, but await won't effect it.
|
16834
|
-
const transceiver = yield this.publisher.
|
17080
|
+
const transceiver = yield this.publisher.addTransceiver(simulcastTrack.mediaStreamTrack, transceiverInit);
|
16835
17081
|
if (!opts.videoCodec) {
|
16836
17082
|
return;
|
16837
17083
|
}
|
@@ -16845,7 +17091,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16845
17091
|
if (!this.publisher) {
|
16846
17092
|
throw new UnexpectedConnectionState('publisher is closed');
|
16847
17093
|
}
|
16848
|
-
return this.publisher.
|
17094
|
+
return this.publisher.addTrack(track);
|
16849
17095
|
});
|
16850
17096
|
}
|
16851
17097
|
attemptReconnect(reason) {
|
@@ -16861,7 +17107,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16861
17107
|
if (((_a = this.clientConfiguration) === null || _a === void 0 ? void 0 : _a.resumeConnection) === ClientConfigSetting.DISABLED ||
|
16862
17108
|
// signaling state could change to closed due to hardware sleep
|
16863
17109
|
// those connections cannot be resumed
|
16864
|
-
((_c = (_b = this.
|
17110
|
+
((_c = (_b = this.primaryTransport) === null || _b === void 0 ? void 0 : _b.getSignallingState()) !== null && _c !== void 0 ? _c : 'closed') === 'closed') {
|
16865
17111
|
this.fullReconnectOnNext = true;
|
16866
17112
|
}
|
16867
17113
|
try {
|
@@ -16979,8 +17225,8 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
16979
17225
|
const res = yield this.client.reconnect(this.url, this.token, this.participantSid, reason);
|
16980
17226
|
if (res) {
|
16981
17227
|
const rtcConfig = this.makeRTCConfiguration(res);
|
16982
|
-
this.publisher.
|
16983
|
-
this.subscriber.
|
17228
|
+
this.publisher.setConfiguration(rtcConfig);
|
17229
|
+
this.subscriber.setConfiguration(rtcConfig);
|
16984
17230
|
}
|
16985
17231
|
} catch (e) {
|
16986
17232
|
let message = '';
|
@@ -17055,14 +17301,14 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17055
17301
|
this.pcState = PCState.Reconnecting;
|
17056
17302
|
livekitLogger.debug('waiting for peer connection to reconnect');
|
17057
17303
|
while (now - startTime < this.peerConnectionTimeout) {
|
17058
|
-
if (this.
|
17304
|
+
if (this.primaryTransport === undefined) {
|
17059
17305
|
// we can abort early, connection is hosed
|
17060
17306
|
break;
|
17061
17307
|
} else if (
|
17062
17308
|
// on Safari, we don't get a connectionstatechanged event during ICE restart
|
17063
17309
|
// this means we'd have to check its status manually and update address
|
17064
17310
|
// manually
|
17065
|
-
now - startTime > minReconnectWait && ((_a = this.
|
17311
|
+
now - startTime > minReconnectWait && ((_a = this.primaryTransport) === null || _a === void 0 ? void 0 : _a.getConnectionState()) === 'connected' && (!this.hasPublished || ((_b = this.publisher) === null || _b === void 0 ? void 0 : _b.getConnectionState()) === 'connected')) {
|
17066
17312
|
this.pcState = PCState.Connected;
|
17067
17313
|
}
|
17068
17314
|
if (this.pcState === PCState.Connected) {
|
@@ -17100,7 +17346,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17100
17346
|
if (!transport) {
|
17101
17347
|
throw new ConnectionError("".concat(transportName, " connection not set"));
|
17102
17348
|
}
|
17103
|
-
if (!subscriber && !((_a = this.publisher) === null || _a === void 0 ? void 0 : _a.isICEConnected) && ((_b = this.publisher) === null || _b === void 0 ? void 0 : _b.
|
17349
|
+
if (!subscriber && !((_a = this.publisher) === null || _a === void 0 ? void 0 : _a.isICEConnected) && ((_b = this.publisher) === null || _b === void 0 ? void 0 : _b.getICEConnectionState()) !== 'checking') {
|
17104
17350
|
// start negotiation
|
17105
17351
|
this.negotiate();
|
17106
17352
|
}
|
@@ -17116,7 +17362,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17116
17362
|
}
|
17117
17363
|
yield sleep(50);
|
17118
17364
|
}
|
17119
|
-
throw new ConnectionError("could not establish ".concat(transportName, " connection, state: ").concat(transport.
|
17365
|
+
throw new ConnectionError("could not establish ".concat(transportName, " connection, state: ").concat(transport.getICEConnectionState()));
|
17120
17366
|
});
|
17121
17367
|
}
|
17122
17368
|
ensurePublisherConnected(kind) {
|
@@ -17127,10 +17373,10 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17127
17373
|
/* @internal */
|
17128
17374
|
verifyTransport() {
|
17129
17375
|
// primary connection
|
17130
|
-
if (!this.
|
17376
|
+
if (!this.primaryTransport) {
|
17131
17377
|
return false;
|
17132
17378
|
}
|
17133
|
-
if (this.
|
17379
|
+
if (this.primaryTransport.getConnectionState() === 'closed' || this.primaryTransport.getConnectionState() === 'failed') {
|
17134
17380
|
return false;
|
17135
17381
|
}
|
17136
17382
|
// also verify publisher connection if it's needed or different
|
@@ -17138,7 +17384,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17138
17384
|
if (!this.publisher) {
|
17139
17385
|
return false;
|
17140
17386
|
}
|
17141
|
-
if (this.publisher.
|
17387
|
+
if (this.publisher.getConnectionState() === 'closed' || this.publisher.getConnectionState() === 'failed') {
|
17142
17388
|
return false;
|
17143
17389
|
}
|
17144
17390
|
}
|
@@ -17244,40 +17490,6 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17244
17490
|
}
|
17245
17491
|
}
|
17246
17492
|
}
|
17247
|
-
function getConnectedAddress(pc) {
|
17248
|
-
var _a;
|
17249
|
-
return __awaiter(this, void 0, void 0, function* () {
|
17250
|
-
let selectedCandidatePairId = '';
|
17251
|
-
const candidatePairs = new Map();
|
17252
|
-
// id -> candidate ip
|
17253
|
-
const candidates = new Map();
|
17254
|
-
const stats = yield pc.getStats();
|
17255
|
-
stats.forEach(v => {
|
17256
|
-
switch (v.type) {
|
17257
|
-
case 'transport':
|
17258
|
-
selectedCandidatePairId = v.selectedCandidatePairId;
|
17259
|
-
break;
|
17260
|
-
case 'candidate-pair':
|
17261
|
-
if (selectedCandidatePairId === '' && v.selected) {
|
17262
|
-
selectedCandidatePairId = v.id;
|
17263
|
-
}
|
17264
|
-
candidatePairs.set(v.id, v);
|
17265
|
-
break;
|
17266
|
-
case 'remote-candidate':
|
17267
|
-
candidates.set(v.id, "".concat(v.address, ":").concat(v.port));
|
17268
|
-
break;
|
17269
|
-
}
|
17270
|
-
});
|
17271
|
-
if (selectedCandidatePairId === '') {
|
17272
|
-
return undefined;
|
17273
|
-
}
|
17274
|
-
const selectedID = (_a = candidatePairs.get(selectedCandidatePairId)) === null || _a === void 0 ? void 0 : _a.remoteCandidateId;
|
17275
|
-
if (selectedID === undefined) {
|
17276
|
-
return undefined;
|
17277
|
-
}
|
17278
|
-
return candidates.get(selectedID);
|
17279
|
-
});
|
17280
|
-
}
|
17281
17493
|
class SignalReconnectError extends Error {}
|
17282
17494
|
|
17283
17495
|
class RegionUrlProvider {
|
@@ -18211,7 +18423,8 @@ class LocalVideoTrack extends LocalTrack {
|
|
18211
18423
|
}
|
18212
18424
|
/**
|
18213
18425
|
* @internal
|
18214
|
-
* Sets codecs that should be publishing
|
18426
|
+
* Sets codecs that should be publishing, returns new codecs that have not yet
|
18427
|
+
* been published
|
18215
18428
|
*/
|
18216
18429
|
setPublishingCodecs(codecs) {
|
18217
18430
|
var _a, codecs_1, codecs_1_1;
|
@@ -20428,7 +20641,7 @@ class LocalParticipant extends Participant {
|
|
20428
20641
|
});
|
20429
20642
|
}
|
20430
20643
|
publish(track, opts, isStereo) {
|
20431
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o
|
20644
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
20432
20645
|
return __awaiter(this, void 0, void 0, function* () {
|
20433
20646
|
const existingTrackOfSource = Array.from(this.tracks.values()).find(publishedTrack => track instanceof LocalTrack && publishedTrack.source === track.source);
|
20434
20647
|
if (existingTrackOfSource && track.source !== Track.Source.Unknown) {
|
@@ -20460,6 +20673,10 @@ class LocalParticipant extends Participant {
|
|
20460
20673
|
if (opts.videoCodec === 'vp9' && !supportsVP9()) {
|
20461
20674
|
opts.videoCodec = undefined;
|
20462
20675
|
}
|
20676
|
+
if (opts.videoCodec === undefined) {
|
20677
|
+
opts.videoCodec = defaultVideoCodec;
|
20678
|
+
}
|
20679
|
+
const videoCodec = opts.videoCodec;
|
20463
20680
|
// handle track actions
|
20464
20681
|
track.on(TrackEvent.Muted, this.onTrackMuted);
|
20465
20682
|
track.on(TrackEvent.Unmuted, this.onTrackUnmuted);
|
@@ -20482,7 +20699,6 @@ class LocalParticipant extends Participant {
|
|
20482
20699
|
});
|
20483
20700
|
// compute encodings and layers for video
|
20484
20701
|
let encodings;
|
20485
|
-
let simEncodings;
|
20486
20702
|
if (track.kind === Track.Kind.Video) {
|
20487
20703
|
let dims = {
|
20488
20704
|
width: 0,
|
@@ -20506,74 +20722,60 @@ class LocalParticipant extends Participant {
|
|
20506
20722
|
req.height = dims.height;
|
20507
20723
|
// for svc codecs, disable simulcast and use vp8 for backup codec
|
20508
20724
|
if (track instanceof LocalVideoTrack) {
|
20509
|
-
if (isSVCCodec(
|
20725
|
+
if (isSVCCodec(videoCodec)) {
|
20510
20726
|
// vp9 svc with screenshare has problem to encode, always use L1T3 here
|
20511
|
-
if (track.source === Track.Source.ScreenShare &&
|
20727
|
+
if (track.source === Track.Source.ScreenShare && videoCodec === 'vp9') {
|
20512
20728
|
opts.scalabilityMode = 'L1T3';
|
20513
20729
|
}
|
20514
20730
|
// set scalabilityMode to 'L3T3_KEY' by default
|
20515
20731
|
opts.scalabilityMode = (_e = opts.scalabilityMode) !== null && _e !== void 0 ? _e : 'L3T3_KEY';
|
20516
20732
|
}
|
20733
|
+
req.simulcastCodecs = [new SimulcastCodec({
|
20734
|
+
codec: videoCodec,
|
20735
|
+
cid: track.mediaStreamTrack.id
|
20736
|
+
})];
|
20517
20737
|
// set up backup
|
20518
|
-
if (opts.
|
20738
|
+
if (opts.backupCodec && videoCodec !== opts.backupCodec.codec) {
|
20519
20739
|
if (!this.roomOptions.dynacast) {
|
20520
20740
|
this.roomOptions.dynacast = true;
|
20521
20741
|
}
|
20522
|
-
|
20523
|
-
simOpts.simulcast = true;
|
20524
|
-
simEncodings = computeTrackBackupEncodings(track, opts.backupCodec.codec, simOpts);
|
20525
|
-
req.simulcastCodecs = [new SimulcastCodec({
|
20526
|
-
codec: opts.videoCodec,
|
20527
|
-
cid: track.mediaStreamTrack.id,
|
20528
|
-
enableSimulcastLayers: true
|
20529
|
-
}), new SimulcastCodec({
|
20742
|
+
req.simulcastCodecs.push(new SimulcastCodec({
|
20530
20743
|
codec: opts.backupCodec.codec,
|
20531
|
-
cid: ''
|
20532
|
-
|
20533
|
-
})];
|
20534
|
-
} else if (opts.videoCodec) {
|
20535
|
-
// pass codec info to sfu so it can prefer codec for the client which don't support
|
20536
|
-
// setCodecPreferences
|
20537
|
-
req.simulcastCodecs = [new SimulcastCodec({
|
20538
|
-
codec: opts.videoCodec,
|
20539
|
-
cid: track.mediaStreamTrack.id,
|
20540
|
-
enableSimulcastLayers: (_f = opts.simulcast) !== null && _f !== void 0 ? _f : false
|
20541
|
-
})];
|
20744
|
+
cid: ''
|
20745
|
+
}));
|
20542
20746
|
}
|
20543
20747
|
}
|
20544
|
-
encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare,
|
20748
|
+
encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, req.width, req.height, opts);
|
20545
20749
|
req.layers = videoLayersFromEncodings(req.width, req.height, encodings, isSVCCodec(opts.videoCodec));
|
20546
20750
|
} else if (track.kind === Track.Kind.Audio) {
|
20547
20751
|
encodings = [{
|
20548
|
-
maxBitrate: (
|
20549
|
-
priority: (
|
20550
|
-
networkPriority: (
|
20752
|
+
maxBitrate: (_g = (_f = opts.audioPreset) === null || _f === void 0 ? void 0 : _f.maxBitrate) !== null && _g !== void 0 ? _g : opts.audioBitrate,
|
20753
|
+
priority: (_j = (_h = opts.audioPreset) === null || _h === void 0 ? void 0 : _h.priority) !== null && _j !== void 0 ? _j : 'high',
|
20754
|
+
networkPriority: (_l = (_k = opts.audioPreset) === null || _k === void 0 ? void 0 : _k.priority) !== null && _l !== void 0 ? _l : 'high'
|
20551
20755
|
}];
|
20552
20756
|
}
|
20553
20757
|
if (!this.engine || this.engine.isClosed) {
|
20554
20758
|
throw new UnexpectedConnectionState('cannot publish track when not connected');
|
20555
20759
|
}
|
20556
20760
|
const ti = yield this.engine.addTrack(req);
|
20557
|
-
|
20558
|
-
|
20559
|
-
|
20560
|
-
|
20561
|
-
|
20562
|
-
|
20563
|
-
backupCodecSupported = true;
|
20761
|
+
// server might not support the codec the client has requested, in that case, fallback
|
20762
|
+
// to a supported codec
|
20763
|
+
let primaryCodecMime;
|
20764
|
+
ti.codecs.forEach(codec => {
|
20765
|
+
if (primaryCodecMime === undefined) {
|
20766
|
+
primaryCodecMime = codec.mimeType;
|
20564
20767
|
}
|
20565
20768
|
});
|
20566
|
-
if (
|
20567
|
-
|
20568
|
-
|
20569
|
-
|
20570
|
-
|
20571
|
-
|
20572
|
-
|
20573
|
-
|
20574
|
-
|
20575
|
-
|
20576
|
-
encodings = simEncodings;
|
20769
|
+
if (primaryCodecMime && track.kind === Track.Kind.Video) {
|
20770
|
+
const updatedCodec = mimeTypeToVideoCodecString(primaryCodecMime);
|
20771
|
+
if (updatedCodec !== videoCodec) {
|
20772
|
+
livekitLogger.debug('falling back to server selected codec', {
|
20773
|
+
codec: updatedCodec
|
20774
|
+
});
|
20775
|
+
/* @ts-ignore */
|
20776
|
+
opts.videoCodec = updatedCodec;
|
20777
|
+
// recompute encodings since bitrates/etc could have changed
|
20778
|
+
encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, req.width, req.height, opts);
|
20577
20779
|
}
|
20578
20780
|
}
|
20579
20781
|
const publication = new LocalTrackPublication(track.kind, ti, track);
|
@@ -20587,19 +20789,18 @@ class LocalParticipant extends Participant {
|
|
20587
20789
|
encodings,
|
20588
20790
|
trackInfo: ti
|
20589
20791
|
});
|
20590
|
-
// store RTPSender
|
20591
20792
|
track.sender = yield this.engine.createSender(track, opts, encodings);
|
20592
20793
|
if (encodings) {
|
20593
20794
|
if (isFireFox() && track.kind === Track.Kind.Audio) {
|
20594
20795
|
/* Refer to RFC https://datatracker.ietf.org/doc/html/rfc7587#section-6.1,
|
20595
|
-
livekit-server uses maxaveragebitrate=
|
20796
|
+
livekit-server uses maxaveragebitrate=510000 in the answer sdp to permit client to
|
20596
20797
|
publish high quality audio track. But firefox always uses this value as the actual
|
20597
20798
|
bitrates, causing the audio bitrates to rise to 510Kbps in any stereo case unexpectedly.
|
20598
20799
|
So the client need to modify maxaverragebitrates in answer sdp to user provided value to
|
20599
20800
|
fix the issue.
|
20600
20801
|
*/
|
20601
20802
|
let trackTransceiver = undefined;
|
20602
|
-
for (const transceiver of this.engine.publisher.
|
20803
|
+
for (const transceiver of this.engine.publisher.getTransceivers()) {
|
20603
20804
|
if (transceiver.sender === track.sender) {
|
20604
20805
|
trackTransceiver = transceiver;
|
20605
20806
|
break;
|
@@ -20609,10 +20810,10 @@ class LocalParticipant extends Participant {
|
|
20609
20810
|
this.engine.publisher.setTrackCodecBitrate({
|
20610
20811
|
transceiver: trackTransceiver,
|
20611
20812
|
codec: 'opus',
|
20612
|
-
maxbr: ((
|
20813
|
+
maxbr: ((_m = encodings[0]) === null || _m === void 0 ? void 0 : _m.maxBitrate) ? encodings[0].maxBitrate / 1000 : 0
|
20613
20814
|
});
|
20614
20815
|
}
|
20615
|
-
} else if (track.codec && isSVCCodec(track.codec) && ((
|
20816
|
+
} else if (track.codec && isSVCCodec(track.codec) && ((_o = encodings[0]) === null || _o === void 0 ? void 0 : _o.maxBitrate)) {
|
20616
20817
|
this.engine.publisher.setTrackCodecBitrate({
|
20617
20818
|
cid: req.cid,
|
20618
20819
|
codec: track.codec,
|
@@ -20672,8 +20873,7 @@ class LocalParticipant extends Participant {
|
|
20672
20873
|
sid: track.sid,
|
20673
20874
|
simulcastCodecs: [{
|
20674
20875
|
codec: opts.videoCodec,
|
20675
|
-
cid: simulcastTrack.mediaStreamTrack.id
|
20676
|
-
enableSimulcastLayers: opts.simulcast
|
20876
|
+
cid: simulcastTrack.mediaStreamTrack.id
|
20677
20877
|
}]
|
20678
20878
|
});
|
20679
20879
|
req.layers = videoLayersFromEncodings(req.width, req.height, encodings);
|
@@ -20720,9 +20920,9 @@ class LocalParticipant extends Participant {
|
|
20720
20920
|
let negotiationNeeded = false;
|
20721
20921
|
const trackSender = track.sender;
|
20722
20922
|
track.sender = undefined;
|
20723
|
-
if (this.engine.publisher && this.engine.publisher.
|
20923
|
+
if (this.engine.publisher && this.engine.publisher.getConnectionState() !== 'closed' && trackSender) {
|
20724
20924
|
try {
|
20725
|
-
for (const transceiver of this.engine.publisher.
|
20925
|
+
for (const transceiver of this.engine.publisher.getTransceivers()) {
|
20726
20926
|
// if sender is not currently sending (after replaceTrack(null))
|
20727
20927
|
// removeTrack would have no effect.
|
20728
20928
|
// to ensure we end up successfully removing the track, manually set
|
@@ -21033,6 +21233,7 @@ class Room extends eventsExports.EventEmitter {
|
|
21033
21233
|
nextUrl = yield this.regionUrlProvider.getNextBestRegionUrl((_c = this.abortController) === null || _c === void 0 ? void 0 : _c.signal);
|
21034
21234
|
} catch (error) {
|
21035
21235
|
if (error instanceof ConnectionError && (error.status === 401 || error.reason === 3 /* ConnectionErrorReason.Cancelled */)) {
|
21236
|
+
this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);
|
21036
21237
|
reject(error);
|
21037
21238
|
return;
|
21038
21239
|
}
|
@@ -21041,9 +21242,11 @@ class Room extends eventsExports.EventEmitter {
|
|
21041
21242
|
livekitLogger.info("Initial connection failed with ConnectionError: ".concat(e.message, ". Retrying with another region: ").concat(nextUrl));
|
21042
21243
|
yield connectFn(resolve, reject, nextUrl);
|
21043
21244
|
} else {
|
21245
|
+
this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);
|
21044
21246
|
reject(e);
|
21045
21247
|
}
|
21046
21248
|
} else {
|
21249
|
+
this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);
|
21047
21250
|
reject(e);
|
21048
21251
|
}
|
21049
21252
|
}
|
@@ -21128,8 +21331,8 @@ class Room extends eventsExports.EventEmitter {
|
|
21128
21331
|
this.setupLocalParticipantEvents();
|
21129
21332
|
this.emit(RoomEvent.SignalConnected);
|
21130
21333
|
} catch (err) {
|
21334
|
+
yield this.engine.close();
|
21131
21335
|
this.recreateEngine();
|
21132
|
-
this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);
|
21133
21336
|
const resultingError = new ConnectionError("could not establish signal connection");
|
21134
21337
|
if (err instanceof Error) {
|
21135
21338
|
resultingError.message = "".concat(resultingError.message, ": ").concat(err.message);
|
@@ -21144,15 +21347,15 @@ class Room extends eventsExports.EventEmitter {
|
|
21144
21347
|
throw resultingError;
|
21145
21348
|
}
|
21146
21349
|
if (abortController.signal.aborted) {
|
21350
|
+
yield this.engine.close();
|
21147
21351
|
this.recreateEngine();
|
21148
|
-
this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);
|
21149
21352
|
throw new ConnectionError("Connection attempt aborted");
|
21150
21353
|
}
|
21151
21354
|
try {
|
21152
21355
|
yield this.engine.waitForPCInitialConnection(this.connOptions.peerConnectionTimeout, abortController);
|
21153
21356
|
} catch (e) {
|
21357
|
+
yield this.engine.close();
|
21154
21358
|
this.recreateEngine();
|
21155
|
-
this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);
|
21156
21359
|
throw e;
|
21157
21360
|
}
|
21158
21361
|
// also hook unload event
|
@@ -22147,18 +22350,18 @@ class Room extends eventsExports.EventEmitter {
|
|
22147
22350
|
return participant;
|
22148
22351
|
}
|
22149
22352
|
sendSyncState() {
|
22150
|
-
var _a, _b;
|
22151
|
-
|
22353
|
+
var _a, _b, _c, _d;
|
22354
|
+
const previousAnswer = (_a = this.engine.subscriber) === null || _a === void 0 ? void 0 : _a.getLocalDescription();
|
22355
|
+
const previousOffer = (_b = this.engine.subscriber) === null || _b === void 0 ? void 0 : _b.getRemoteDescription();
|
22356
|
+
if (!previousAnswer) {
|
22152
22357
|
return;
|
22153
22358
|
}
|
22154
|
-
const previousAnswer = this.engine.subscriber.pc.localDescription;
|
22155
|
-
const previousOffer = this.engine.subscriber.pc.remoteDescription;
|
22156
22359
|
/* 1. autosubscribe on, so subscribed tracks = all tracks - unsub tracks,
|
22157
22360
|
in this case, we send unsub tracks, so server add all tracks to this
|
22158
22361
|
subscribe pc and unsub special tracks from it.
|
22159
22362
|
2. autosubscribe off, we send subscribed tracks.
|
22160
22363
|
*/
|
22161
|
-
const autoSubscribe = (
|
22364
|
+
const autoSubscribe = (_d = (_c = this.connOptions) === null || _c === void 0 ? void 0 : _c.autoSubscribe) !== null && _d !== void 0 ? _d : true;
|
22162
22365
|
const trackSids = new Array();
|
22163
22366
|
this.participants.forEach(participant => {
|
22164
22367
|
participant.tracks.forEach(track => {
|
@@ -22773,7 +22976,7 @@ class WebRTCCheck extends Checker {
|
|
22773
22976
|
}
|
22774
22977
|
};
|
22775
22978
|
if (this.room.engine.subscriber) {
|
22776
|
-
this.room.engine.subscriber.
|
22979
|
+
this.room.engine.subscriber.onIceCandidateError = ev => {
|
22777
22980
|
if (ev instanceof RTCPeerConnectionIceErrorEvent) {
|
22778
22981
|
this.appendWarning("error with ICE candidate: ".concat(ev.errorCode, " ").concat(ev.errorText, " ").concat(ev.url));
|
22779
22982
|
}
|
@@ -22992,5 +23195,5 @@ function isFacingModeValue(item) {
|
|
22992
23195
|
return item === undefined || allowedValues.includes(item);
|
22993
23196
|
}
|
22994
23197
|
|
22995
|
-
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, RoomState, 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, importKey, isBackupCodec, isBrowserSupported,
|
23198
|
+
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, RoomState, 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, importKey, isBackupCodec, isBrowserSupported, isE2EESupported, isInsertableStreamSupported, isScriptTransformSupported, isVideoFrame, needsRbspUnescaping, parseRbsp, protocolVersion, ratchet, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, supportsVP9, version, videoCodecs, writeRbsp };
|
22996
23199
|
//# sourceMappingURL=livekit-client.esm.mjs.map
|