livekit-client 1.6.3 → 1.6.5
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 +418 -70
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/api/SignalClient.d.ts +13 -2
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts +2 -2
- package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -1
- package/dist/src/proto/livekit_models.d.ts +20 -3
- package/dist/src/proto/livekit_models.d.ts.map +1 -1
- package/dist/src/proto/livekit_rtc.d.ts +2565 -464
- package/dist/src/proto/livekit_rtc.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +1 -1
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/errors.d.ts +3 -0
- package/dist/src/room/errors.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +1 -3
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/Participant.d.ts +1 -1
- package/dist/src/room/participant/Participant.d.ts.map +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/create.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +2 -2
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/test/mocks.d.ts +1 -1
- package/dist/ts4.2/src/api/SignalClient.d.ts +13 -2
- package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +2 -2
- package/dist/ts4.2/src/proto/livekit_models.d.ts +24 -3
- package/dist/ts4.2/src/proto/livekit_rtc.d.ts +2775 -540
- package/dist/ts4.2/src/room/Room.d.ts +1 -1
- package/dist/ts4.2/src/room/errors.d.ts +3 -0
- package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +1 -3
- package/dist/ts4.2/src/room/participant/Participant.d.ts +1 -1
- package/dist/ts4.2/src/room/track/options.d.ts +2 -2
- package/dist/ts4.2/src/test/mocks.d.ts +1 -1
- package/package.json +17 -17
- package/src/api/SignalClient.ts +46 -3
- package/src/connectionHelper/ConnectionCheck.ts +1 -1
- package/src/proto/google/protobuf/timestamp.ts +2 -2
- package/src/proto/livekit_models.ts +93 -9
- package/src/proto/livekit_rtc.ts +308 -6
- package/src/room/RTCEngine.ts +37 -16
- package/src/room/Room.ts +12 -11
- package/src/room/errors.ts +6 -0
- package/src/room/participant/LocalParticipant.ts +19 -20
- package/src/room/participant/Participant.ts +10 -2
- package/src/room/track/LocalAudioTrack.ts +5 -1
- package/src/room/track/create.ts +6 -1
- package/src/room/track/options.ts +2 -2
package/src/proto/livekit_rtc.ts
CHANGED
@@ -151,7 +151,9 @@ export interface SignalRequest {
|
|
151
151
|
| { $case: "subscriptionPermission"; subscriptionPermission: SubscriptionPermission }
|
152
152
|
| { $case: "syncState"; syncState: SyncState }
|
153
153
|
| { $case: "simulate"; simulate: SimulateScenario }
|
154
|
-
| { $case: "ping"; ping: number }
|
154
|
+
| { $case: "ping"; ping: number }
|
155
|
+
| { $case: "updateMetadata"; updateMetadata: UpdateParticipantMetadata }
|
156
|
+
| { $case: "pingReq"; pingReq: Ping };
|
155
157
|
}
|
156
158
|
|
157
159
|
export interface SignalResponse {
|
@@ -173,7 +175,8 @@ export interface SignalResponse {
|
|
173
175
|
| { $case: "refreshToken"; refreshToken: string }
|
174
176
|
| { $case: "trackUnpublished"; trackUnpublished: TrackUnpublishedResponse }
|
175
177
|
| { $case: "pong"; pong: number }
|
176
|
-
| { $case: "reconnect"; reconnect: ReconnectResponse }
|
178
|
+
| { $case: "reconnect"; reconnect: ReconnectResponse }
|
179
|
+
| { $case: "pongResp"; pongResp: Pong };
|
177
180
|
}
|
178
181
|
|
179
182
|
export interface SimulcastCodec {
|
@@ -240,6 +243,9 @@ export interface JoinResponse {
|
|
240
243
|
export interface ReconnectResponse {
|
241
244
|
iceServers: ICEServer[];
|
242
245
|
clientConfiguration?: ClientConfiguration;
|
246
|
+
room?: Room;
|
247
|
+
participant?: ParticipantInfo;
|
248
|
+
otherParticipants: ParticipantInfo[];
|
243
249
|
}
|
244
250
|
|
245
251
|
export interface TrackPublishedResponse {
|
@@ -278,6 +284,16 @@ export interface UpdateTrackSettings {
|
|
278
284
|
/** for video, height to receive */
|
279
285
|
height: number;
|
280
286
|
fps: number;
|
287
|
+
/**
|
288
|
+
* subscription priority. 1 being the highest (0 is unset)
|
289
|
+
* when unset, server sill assign priority based on the order of subscription
|
290
|
+
* server will use priority in the following ways:
|
291
|
+
* 1. when subscribed tracks exceed per-participant subscription limit, server will
|
292
|
+
* pause the lowest priority tracks
|
293
|
+
* 2. when the network is congested, server will assign available bandwidth to
|
294
|
+
* higher priority tracks first. lowest priority tracks can be paused
|
295
|
+
*/
|
296
|
+
priority: number;
|
281
297
|
}
|
282
298
|
|
283
299
|
export interface LeaveRequest {
|
@@ -295,6 +311,10 @@ export interface UpdateVideoLayers {
|
|
295
311
|
layers: VideoLayer[];
|
296
312
|
}
|
297
313
|
|
314
|
+
export interface UpdateParticipantMetadata {
|
315
|
+
metadata: string;
|
316
|
+
}
|
317
|
+
|
298
318
|
export interface ICEServer {
|
299
319
|
urls: string[];
|
300
320
|
username: string;
|
@@ -389,6 +409,18 @@ export interface SimulateScenario {
|
|
389
409
|
| { $case: "switchCandidateProtocol"; switchCandidateProtocol: CandidateProtocol };
|
390
410
|
}
|
391
411
|
|
412
|
+
export interface Ping {
|
413
|
+
timestamp: number;
|
414
|
+
/** rtt in milliseconds calculated by client */
|
415
|
+
rtt: number;
|
416
|
+
}
|
417
|
+
|
418
|
+
export interface Pong {
|
419
|
+
/** timestamp field of last received ping request */
|
420
|
+
lastPingTimestamp: number;
|
421
|
+
timestamp: number;
|
422
|
+
}
|
423
|
+
|
392
424
|
function createBaseSignalRequest(): SignalRequest {
|
393
425
|
return { message: undefined };
|
394
426
|
}
|
@@ -434,6 +466,12 @@ export const SignalRequest = {
|
|
434
466
|
if (message.message?.$case === "ping") {
|
435
467
|
writer.uint32(112).int64(message.message.ping);
|
436
468
|
}
|
469
|
+
if (message.message?.$case === "updateMetadata") {
|
470
|
+
UpdateParticipantMetadata.encode(message.message.updateMetadata, writer.uint32(122).fork()).ldelim();
|
471
|
+
}
|
472
|
+
if (message.message?.$case === "pingReq") {
|
473
|
+
Ping.encode(message.message.pingReq, writer.uint32(130).fork()).ldelim();
|
474
|
+
}
|
437
475
|
return writer;
|
438
476
|
},
|
439
477
|
|
@@ -489,6 +527,15 @@ export const SignalRequest = {
|
|
489
527
|
case 14:
|
490
528
|
message.message = { $case: "ping", ping: longToNumber(reader.int64() as Long) };
|
491
529
|
break;
|
530
|
+
case 15:
|
531
|
+
message.message = {
|
532
|
+
$case: "updateMetadata",
|
533
|
+
updateMetadata: UpdateParticipantMetadata.decode(reader, reader.uint32()),
|
534
|
+
};
|
535
|
+
break;
|
536
|
+
case 16:
|
537
|
+
message.message = { $case: "pingReq", pingReq: Ping.decode(reader, reader.uint32()) };
|
538
|
+
break;
|
492
539
|
default:
|
493
540
|
reader.skipType(tag & 7);
|
494
541
|
break;
|
@@ -528,6 +575,10 @@ export const SignalRequest = {
|
|
528
575
|
? { $case: "simulate", simulate: SimulateScenario.fromJSON(object.simulate) }
|
529
576
|
: isSet(object.ping)
|
530
577
|
? { $case: "ping", ping: Number(object.ping) }
|
578
|
+
: isSet(object.updateMetadata)
|
579
|
+
? { $case: "updateMetadata", updateMetadata: UpdateParticipantMetadata.fromJSON(object.updateMetadata) }
|
580
|
+
: isSet(object.pingReq)
|
581
|
+
? { $case: "pingReq", pingReq: Ping.fromJSON(object.pingReq) }
|
531
582
|
: undefined,
|
532
583
|
};
|
533
584
|
},
|
@@ -564,6 +615,11 @@ export const SignalRequest = {
|
|
564
615
|
message.message?.$case === "simulate" &&
|
565
616
|
(obj.simulate = message.message?.simulate ? SimulateScenario.toJSON(message.message?.simulate) : undefined);
|
566
617
|
message.message?.$case === "ping" && (obj.ping = Math.round(message.message?.ping));
|
618
|
+
message.message?.$case === "updateMetadata" && (obj.updateMetadata = message.message?.updateMetadata
|
619
|
+
? UpdateParticipantMetadata.toJSON(message.message?.updateMetadata)
|
620
|
+
: undefined);
|
621
|
+
message.message?.$case === "pingReq" &&
|
622
|
+
(obj.pingReq = message.message?.pingReq ? Ping.toJSON(message.message?.pingReq) : undefined);
|
567
623
|
return obj;
|
568
624
|
},
|
569
625
|
|
@@ -650,6 +706,21 @@ export const SignalRequest = {
|
|
650
706
|
if (object.message?.$case === "ping" && object.message?.ping !== undefined && object.message?.ping !== null) {
|
651
707
|
message.message = { $case: "ping", ping: object.message.ping };
|
652
708
|
}
|
709
|
+
if (
|
710
|
+
object.message?.$case === "updateMetadata" &&
|
711
|
+
object.message?.updateMetadata !== undefined &&
|
712
|
+
object.message?.updateMetadata !== null
|
713
|
+
) {
|
714
|
+
message.message = {
|
715
|
+
$case: "updateMetadata",
|
716
|
+
updateMetadata: UpdateParticipantMetadata.fromPartial(object.message.updateMetadata),
|
717
|
+
};
|
718
|
+
}
|
719
|
+
if (
|
720
|
+
object.message?.$case === "pingReq" && object.message?.pingReq !== undefined && object.message?.pingReq !== null
|
721
|
+
) {
|
722
|
+
message.message = { $case: "pingReq", pingReq: Ping.fromPartial(object.message.pingReq) };
|
723
|
+
}
|
653
724
|
return message;
|
654
725
|
},
|
655
726
|
};
|
@@ -715,6 +786,9 @@ export const SignalResponse = {
|
|
715
786
|
if (message.message?.$case === "reconnect") {
|
716
787
|
ReconnectResponse.encode(message.message.reconnect, writer.uint32(154).fork()).ldelim();
|
717
788
|
}
|
789
|
+
if (message.message?.$case === "pongResp") {
|
790
|
+
Pong.encode(message.message.pongResp, writer.uint32(162).fork()).ldelim();
|
791
|
+
}
|
718
792
|
return writer;
|
719
793
|
},
|
720
794
|
|
@@ -800,6 +874,9 @@ export const SignalResponse = {
|
|
800
874
|
case 19:
|
801
875
|
message.message = { $case: "reconnect", reconnect: ReconnectResponse.decode(reader, reader.uint32()) };
|
802
876
|
break;
|
877
|
+
case 20:
|
878
|
+
message.message = { $case: "pongResp", pongResp: Pong.decode(reader, reader.uint32()) };
|
879
|
+
break;
|
803
880
|
default:
|
804
881
|
reader.skipType(tag & 7);
|
805
882
|
break;
|
@@ -852,6 +929,8 @@ export const SignalResponse = {
|
|
852
929
|
? { $case: "pong", pong: Number(object.pong) }
|
853
930
|
: isSet(object.reconnect)
|
854
931
|
? { $case: "reconnect", reconnect: ReconnectResponse.fromJSON(object.reconnect) }
|
932
|
+
: isSet(object.pongResp)
|
933
|
+
? { $case: "pongResp", pongResp: Pong.fromJSON(object.pongResp) }
|
855
934
|
: undefined,
|
856
935
|
};
|
857
936
|
},
|
@@ -901,6 +980,8 @@ export const SignalResponse = {
|
|
901
980
|
message.message?.$case === "pong" && (obj.pong = Math.round(message.message?.pong));
|
902
981
|
message.message?.$case === "reconnect" &&
|
903
982
|
(obj.reconnect = message.message?.reconnect ? ReconnectResponse.toJSON(message.message?.reconnect) : undefined);
|
983
|
+
message.message?.$case === "pongResp" &&
|
984
|
+
(obj.pongResp = message.message?.pongResp ? Pong.toJSON(message.message?.pongResp) : undefined);
|
904
985
|
return obj;
|
905
986
|
},
|
906
987
|
|
@@ -1025,6 +1106,13 @@ export const SignalResponse = {
|
|
1025
1106
|
) {
|
1026
1107
|
message.message = { $case: "reconnect", reconnect: ReconnectResponse.fromPartial(object.message.reconnect) };
|
1027
1108
|
}
|
1109
|
+
if (
|
1110
|
+
object.message?.$case === "pongResp" &&
|
1111
|
+
object.message?.pongResp !== undefined &&
|
1112
|
+
object.message?.pongResp !== null
|
1113
|
+
) {
|
1114
|
+
message.message = { $case: "pongResp", pongResp: Pong.fromPartial(object.message.pongResp) };
|
1115
|
+
}
|
1028
1116
|
return message;
|
1029
1117
|
},
|
1030
1118
|
};
|
@@ -1587,7 +1675,13 @@ export const JoinResponse = {
|
|
1587
1675
|
};
|
1588
1676
|
|
1589
1677
|
function createBaseReconnectResponse(): ReconnectResponse {
|
1590
|
-
return {
|
1678
|
+
return {
|
1679
|
+
iceServers: [],
|
1680
|
+
clientConfiguration: undefined,
|
1681
|
+
room: undefined,
|
1682
|
+
participant: undefined,
|
1683
|
+
otherParticipants: [],
|
1684
|
+
};
|
1591
1685
|
}
|
1592
1686
|
|
1593
1687
|
export const ReconnectResponse = {
|
@@ -1598,6 +1692,15 @@ export const ReconnectResponse = {
|
|
1598
1692
|
if (message.clientConfiguration !== undefined) {
|
1599
1693
|
ClientConfiguration.encode(message.clientConfiguration, writer.uint32(18).fork()).ldelim();
|
1600
1694
|
}
|
1695
|
+
if (message.room !== undefined) {
|
1696
|
+
Room.encode(message.room, writer.uint32(26).fork()).ldelim();
|
1697
|
+
}
|
1698
|
+
if (message.participant !== undefined) {
|
1699
|
+
ParticipantInfo.encode(message.participant, writer.uint32(34).fork()).ldelim();
|
1700
|
+
}
|
1701
|
+
for (const v of message.otherParticipants) {
|
1702
|
+
ParticipantInfo.encode(v!, writer.uint32(42).fork()).ldelim();
|
1703
|
+
}
|
1601
1704
|
return writer;
|
1602
1705
|
},
|
1603
1706
|
|
@@ -1614,6 +1717,15 @@ export const ReconnectResponse = {
|
|
1614
1717
|
case 2:
|
1615
1718
|
message.clientConfiguration = ClientConfiguration.decode(reader, reader.uint32());
|
1616
1719
|
break;
|
1720
|
+
case 3:
|
1721
|
+
message.room = Room.decode(reader, reader.uint32());
|
1722
|
+
break;
|
1723
|
+
case 4:
|
1724
|
+
message.participant = ParticipantInfo.decode(reader, reader.uint32());
|
1725
|
+
break;
|
1726
|
+
case 5:
|
1727
|
+
message.otherParticipants.push(ParticipantInfo.decode(reader, reader.uint32()));
|
1728
|
+
break;
|
1617
1729
|
default:
|
1618
1730
|
reader.skipType(tag & 7);
|
1619
1731
|
break;
|
@@ -1628,6 +1740,11 @@ export const ReconnectResponse = {
|
|
1628
1740
|
clientConfiguration: isSet(object.clientConfiguration)
|
1629
1741
|
? ClientConfiguration.fromJSON(object.clientConfiguration)
|
1630
1742
|
: undefined,
|
1743
|
+
room: isSet(object.room) ? Room.fromJSON(object.room) : undefined,
|
1744
|
+
participant: isSet(object.participant) ? ParticipantInfo.fromJSON(object.participant) : undefined,
|
1745
|
+
otherParticipants: Array.isArray(object?.otherParticipants)
|
1746
|
+
? object.otherParticipants.map((e: any) => ParticipantInfo.fromJSON(e))
|
1747
|
+
: [],
|
1631
1748
|
};
|
1632
1749
|
},
|
1633
1750
|
|
@@ -1641,6 +1758,14 @@ export const ReconnectResponse = {
|
|
1641
1758
|
message.clientConfiguration !== undefined && (obj.clientConfiguration = message.clientConfiguration
|
1642
1759
|
? ClientConfiguration.toJSON(message.clientConfiguration)
|
1643
1760
|
: undefined);
|
1761
|
+
message.room !== undefined && (obj.room = message.room ? Room.toJSON(message.room) : undefined);
|
1762
|
+
message.participant !== undefined &&
|
1763
|
+
(obj.participant = message.participant ? ParticipantInfo.toJSON(message.participant) : undefined);
|
1764
|
+
if (message.otherParticipants) {
|
1765
|
+
obj.otherParticipants = message.otherParticipants.map((e) => e ? ParticipantInfo.toJSON(e) : undefined);
|
1766
|
+
} else {
|
1767
|
+
obj.otherParticipants = [];
|
1768
|
+
}
|
1644
1769
|
return obj;
|
1645
1770
|
},
|
1646
1771
|
|
@@ -1650,6 +1775,11 @@ export const ReconnectResponse = {
|
|
1650
1775
|
message.clientConfiguration = (object.clientConfiguration !== undefined && object.clientConfiguration !== null)
|
1651
1776
|
? ClientConfiguration.fromPartial(object.clientConfiguration)
|
1652
1777
|
: undefined;
|
1778
|
+
message.room = (object.room !== undefined && object.room !== null) ? Room.fromPartial(object.room) : undefined;
|
1779
|
+
message.participant = (object.participant !== undefined && object.participant !== null)
|
1780
|
+
? ParticipantInfo.fromPartial(object.participant)
|
1781
|
+
: undefined;
|
1782
|
+
message.otherParticipants = object.otherParticipants?.map((e) => ParticipantInfo.fromPartial(e)) || [];
|
1653
1783
|
return message;
|
1654
1784
|
},
|
1655
1785
|
};
|
@@ -1949,7 +2079,7 @@ export const UpdateSubscription = {
|
|
1949
2079
|
};
|
1950
2080
|
|
1951
2081
|
function createBaseUpdateTrackSettings(): UpdateTrackSettings {
|
1952
|
-
return { trackSids: [], disabled: false, quality: 0, width: 0, height: 0, fps: 0 };
|
2082
|
+
return { trackSids: [], disabled: false, quality: 0, width: 0, height: 0, fps: 0, priority: 0 };
|
1953
2083
|
}
|
1954
2084
|
|
1955
2085
|
export const UpdateTrackSettings = {
|
@@ -1972,6 +2102,9 @@ export const UpdateTrackSettings = {
|
|
1972
2102
|
if (message.fps !== 0) {
|
1973
2103
|
writer.uint32(56).uint32(message.fps);
|
1974
2104
|
}
|
2105
|
+
if (message.priority !== 0) {
|
2106
|
+
writer.uint32(64).uint32(message.priority);
|
2107
|
+
}
|
1975
2108
|
return writer;
|
1976
2109
|
},
|
1977
2110
|
|
@@ -2000,6 +2133,9 @@ export const UpdateTrackSettings = {
|
|
2000
2133
|
case 7:
|
2001
2134
|
message.fps = reader.uint32();
|
2002
2135
|
break;
|
2136
|
+
case 8:
|
2137
|
+
message.priority = reader.uint32();
|
2138
|
+
break;
|
2003
2139
|
default:
|
2004
2140
|
reader.skipType(tag & 7);
|
2005
2141
|
break;
|
@@ -2016,6 +2152,7 @@ export const UpdateTrackSettings = {
|
|
2016
2152
|
width: isSet(object.width) ? Number(object.width) : 0,
|
2017
2153
|
height: isSet(object.height) ? Number(object.height) : 0,
|
2018
2154
|
fps: isSet(object.fps) ? Number(object.fps) : 0,
|
2155
|
+
priority: isSet(object.priority) ? Number(object.priority) : 0,
|
2019
2156
|
};
|
2020
2157
|
},
|
2021
2158
|
|
@@ -2031,6 +2168,7 @@ export const UpdateTrackSettings = {
|
|
2031
2168
|
message.width !== undefined && (obj.width = Math.round(message.width));
|
2032
2169
|
message.height !== undefined && (obj.height = Math.round(message.height));
|
2033
2170
|
message.fps !== undefined && (obj.fps = Math.round(message.fps));
|
2171
|
+
message.priority !== undefined && (obj.priority = Math.round(message.priority));
|
2034
2172
|
return obj;
|
2035
2173
|
},
|
2036
2174
|
|
@@ -2042,6 +2180,7 @@ export const UpdateTrackSettings = {
|
|
2042
2180
|
message.width = object.width ?? 0;
|
2043
2181
|
message.height = object.height ?? 0;
|
2044
2182
|
message.fps = object.fps ?? 0;
|
2183
|
+
message.priority = object.priority ?? 0;
|
2045
2184
|
return message;
|
2046
2185
|
},
|
2047
2186
|
};
|
@@ -2166,6 +2305,53 @@ export const UpdateVideoLayers = {
|
|
2166
2305
|
},
|
2167
2306
|
};
|
2168
2307
|
|
2308
|
+
function createBaseUpdateParticipantMetadata(): UpdateParticipantMetadata {
|
2309
|
+
return { metadata: "" };
|
2310
|
+
}
|
2311
|
+
|
2312
|
+
export const UpdateParticipantMetadata = {
|
2313
|
+
encode(message: UpdateParticipantMetadata, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
2314
|
+
if (message.metadata !== "") {
|
2315
|
+
writer.uint32(10).string(message.metadata);
|
2316
|
+
}
|
2317
|
+
return writer;
|
2318
|
+
},
|
2319
|
+
|
2320
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): UpdateParticipantMetadata {
|
2321
|
+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
|
2322
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
2323
|
+
const message = createBaseUpdateParticipantMetadata();
|
2324
|
+
while (reader.pos < end) {
|
2325
|
+
const tag = reader.uint32();
|
2326
|
+
switch (tag >>> 3) {
|
2327
|
+
case 1:
|
2328
|
+
message.metadata = reader.string();
|
2329
|
+
break;
|
2330
|
+
default:
|
2331
|
+
reader.skipType(tag & 7);
|
2332
|
+
break;
|
2333
|
+
}
|
2334
|
+
}
|
2335
|
+
return message;
|
2336
|
+
},
|
2337
|
+
|
2338
|
+
fromJSON(object: any): UpdateParticipantMetadata {
|
2339
|
+
return { metadata: isSet(object.metadata) ? String(object.metadata) : "" };
|
2340
|
+
},
|
2341
|
+
|
2342
|
+
toJSON(message: UpdateParticipantMetadata): unknown {
|
2343
|
+
const obj: any = {};
|
2344
|
+
message.metadata !== undefined && (obj.metadata = message.metadata);
|
2345
|
+
return obj;
|
2346
|
+
},
|
2347
|
+
|
2348
|
+
fromPartial<I extends Exact<DeepPartial<UpdateParticipantMetadata>, I>>(object: I): UpdateParticipantMetadata {
|
2349
|
+
const message = createBaseUpdateParticipantMetadata();
|
2350
|
+
message.metadata = object.metadata ?? "";
|
2351
|
+
return message;
|
2352
|
+
},
|
2353
|
+
};
|
2354
|
+
|
2169
2355
|
function createBaseICEServer(): ICEServer {
|
2170
2356
|
return { urls: [], username: "", credential: "" };
|
2171
2357
|
}
|
@@ -3293,10 +3479,126 @@ export const SimulateScenario = {
|
|
3293
3479
|
},
|
3294
3480
|
};
|
3295
3481
|
|
3482
|
+
function createBasePing(): Ping {
|
3483
|
+
return { timestamp: 0, rtt: 0 };
|
3484
|
+
}
|
3485
|
+
|
3486
|
+
export const Ping = {
|
3487
|
+
encode(message: Ping, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
3488
|
+
if (message.timestamp !== 0) {
|
3489
|
+
writer.uint32(8).int64(message.timestamp);
|
3490
|
+
}
|
3491
|
+
if (message.rtt !== 0) {
|
3492
|
+
writer.uint32(16).int64(message.rtt);
|
3493
|
+
}
|
3494
|
+
return writer;
|
3495
|
+
},
|
3496
|
+
|
3497
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): Ping {
|
3498
|
+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
|
3499
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
3500
|
+
const message = createBasePing();
|
3501
|
+
while (reader.pos < end) {
|
3502
|
+
const tag = reader.uint32();
|
3503
|
+
switch (tag >>> 3) {
|
3504
|
+
case 1:
|
3505
|
+
message.timestamp = longToNumber(reader.int64() as Long);
|
3506
|
+
break;
|
3507
|
+
case 2:
|
3508
|
+
message.rtt = longToNumber(reader.int64() as Long);
|
3509
|
+
break;
|
3510
|
+
default:
|
3511
|
+
reader.skipType(tag & 7);
|
3512
|
+
break;
|
3513
|
+
}
|
3514
|
+
}
|
3515
|
+
return message;
|
3516
|
+
},
|
3517
|
+
|
3518
|
+
fromJSON(object: any): Ping {
|
3519
|
+
return {
|
3520
|
+
timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0,
|
3521
|
+
rtt: isSet(object.rtt) ? Number(object.rtt) : 0,
|
3522
|
+
};
|
3523
|
+
},
|
3524
|
+
|
3525
|
+
toJSON(message: Ping): unknown {
|
3526
|
+
const obj: any = {};
|
3527
|
+
message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp));
|
3528
|
+
message.rtt !== undefined && (obj.rtt = Math.round(message.rtt));
|
3529
|
+
return obj;
|
3530
|
+
},
|
3531
|
+
|
3532
|
+
fromPartial<I extends Exact<DeepPartial<Ping>, I>>(object: I): Ping {
|
3533
|
+
const message = createBasePing();
|
3534
|
+
message.timestamp = object.timestamp ?? 0;
|
3535
|
+
message.rtt = object.rtt ?? 0;
|
3536
|
+
return message;
|
3537
|
+
},
|
3538
|
+
};
|
3539
|
+
|
3540
|
+
function createBasePong(): Pong {
|
3541
|
+
return { lastPingTimestamp: 0, timestamp: 0 };
|
3542
|
+
}
|
3543
|
+
|
3544
|
+
export const Pong = {
|
3545
|
+
encode(message: Pong, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
3546
|
+
if (message.lastPingTimestamp !== 0) {
|
3547
|
+
writer.uint32(8).int64(message.lastPingTimestamp);
|
3548
|
+
}
|
3549
|
+
if (message.timestamp !== 0) {
|
3550
|
+
writer.uint32(16).int64(message.timestamp);
|
3551
|
+
}
|
3552
|
+
return writer;
|
3553
|
+
},
|
3554
|
+
|
3555
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): Pong {
|
3556
|
+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
|
3557
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
3558
|
+
const message = createBasePong();
|
3559
|
+
while (reader.pos < end) {
|
3560
|
+
const tag = reader.uint32();
|
3561
|
+
switch (tag >>> 3) {
|
3562
|
+
case 1:
|
3563
|
+
message.lastPingTimestamp = longToNumber(reader.int64() as Long);
|
3564
|
+
break;
|
3565
|
+
case 2:
|
3566
|
+
message.timestamp = longToNumber(reader.int64() as Long);
|
3567
|
+
break;
|
3568
|
+
default:
|
3569
|
+
reader.skipType(tag & 7);
|
3570
|
+
break;
|
3571
|
+
}
|
3572
|
+
}
|
3573
|
+
return message;
|
3574
|
+
},
|
3575
|
+
|
3576
|
+
fromJSON(object: any): Pong {
|
3577
|
+
return {
|
3578
|
+
lastPingTimestamp: isSet(object.lastPingTimestamp) ? Number(object.lastPingTimestamp) : 0,
|
3579
|
+
timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0,
|
3580
|
+
};
|
3581
|
+
},
|
3582
|
+
|
3583
|
+
toJSON(message: Pong): unknown {
|
3584
|
+
const obj: any = {};
|
3585
|
+
message.lastPingTimestamp !== undefined && (obj.lastPingTimestamp = Math.round(message.lastPingTimestamp));
|
3586
|
+
message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp));
|
3587
|
+
return obj;
|
3588
|
+
},
|
3589
|
+
|
3590
|
+
fromPartial<I extends Exact<DeepPartial<Pong>, I>>(object: I): Pong {
|
3591
|
+
const message = createBasePong();
|
3592
|
+
message.lastPingTimestamp = object.lastPingTimestamp ?? 0;
|
3593
|
+
message.timestamp = object.timestamp ?? 0;
|
3594
|
+
return message;
|
3595
|
+
},
|
3596
|
+
};
|
3597
|
+
|
3296
3598
|
declare var self: any | undefined;
|
3297
3599
|
declare var window: any | undefined;
|
3298
3600
|
declare var global: any | undefined;
|
3299
|
-
var
|
3601
|
+
var tsProtoGlobalThis: any = (() => {
|
3300
3602
|
if (typeof globalThis !== "undefined") {
|
3301
3603
|
return globalThis;
|
3302
3604
|
}
|
@@ -3326,7 +3628,7 @@ export type Exact<P, I extends P> = P extends Builtin ? P
|
|
3326
3628
|
|
3327
3629
|
function longToNumber(long: Long): number {
|
3328
3630
|
if (long.gt(Number.MAX_SAFE_INTEGER)) {
|
3329
|
-
throw new
|
3631
|
+
throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
|
3330
3632
|
}
|
3331
3633
|
return long.toNumber();
|
3332
3634
|
}
|
package/src/room/RTCEngine.ts
CHANGED
@@ -9,6 +9,7 @@ import {
|
|
9
9
|
DataPacket,
|
10
10
|
DataPacket_Kind,
|
11
11
|
DisconnectReason,
|
12
|
+
ReconnectReason,
|
12
13
|
SpeakerInfo,
|
13
14
|
TrackInfo,
|
14
15
|
UserPacket,
|
@@ -305,7 +306,8 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
305
306
|
|
306
307
|
let primaryPC = this.publisher.pc;
|
307
308
|
let secondaryPC = this.subscriber.pc;
|
308
|
-
|
309
|
+
let subscriberPrimary = joinResponse.subscriberPrimary;
|
310
|
+
if (subscriberPrimary) {
|
309
311
|
primaryPC = this.subscriber.pc;
|
310
312
|
secondaryPC = this.publisher.pc;
|
311
313
|
// in subscriber primary mode, server side opens sub data channels.
|
@@ -330,7 +332,13 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
330
332
|
if (this.pcState === PCState.Connected) {
|
331
333
|
this.pcState = PCState.Disconnected;
|
332
334
|
|
333
|
-
this.handleDisconnect(
|
335
|
+
this.handleDisconnect(
|
336
|
+
'primary peerconnection',
|
337
|
+
false,
|
338
|
+
subscriberPrimary
|
339
|
+
? ReconnectReason.REASON_SUBSCRIBER_FAILED
|
340
|
+
: ReconnectReason.REASON_PUBLISHER_FAILED,
|
341
|
+
);
|
334
342
|
}
|
335
343
|
}
|
336
344
|
};
|
@@ -338,7 +346,13 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
338
346
|
log.debug(`secondary PC state changed ${secondaryPC.connectionState}`);
|
339
347
|
// also reconnect if secondary peerconnection fails
|
340
348
|
if (secondaryPC.connectionState === 'failed') {
|
341
|
-
this.handleDisconnect(
|
349
|
+
this.handleDisconnect(
|
350
|
+
'secondary peerconnection',
|
351
|
+
false,
|
352
|
+
subscriberPrimary
|
353
|
+
? ReconnectReason.REASON_PUBLISHER_FAILED
|
354
|
+
: ReconnectReason.REASON_SUBSCRIBER_FAILED,
|
355
|
+
);
|
342
356
|
}
|
343
357
|
};
|
344
358
|
|
@@ -405,7 +419,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
405
419
|
};
|
406
420
|
|
407
421
|
this.client.onClose = () => {
|
408
|
-
this.handleDisconnect('signal');
|
422
|
+
this.handleDisconnect('signal', false, ReconnectReason.REASON_SIGNAL_DISCONNECTED);
|
409
423
|
};
|
410
424
|
|
411
425
|
this.client.onLeave = (leave?: LeaveRequest) => {
|
@@ -676,19 +690,23 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
676
690
|
// websocket reconnect behavior. if websocket is interrupted, and the PeerConnection
|
677
691
|
// continues to work, we can reconnect to websocket to continue the session
|
678
692
|
// after a number of retries, we'll close and give up permanently
|
679
|
-
private handleDisconnect = (
|
693
|
+
private handleDisconnect = (
|
694
|
+
connection: string,
|
695
|
+
signalEvents: boolean = false,
|
696
|
+
disconnectReason?: ReconnectReason,
|
697
|
+
) => {
|
680
698
|
if (this._isClosed) {
|
681
699
|
return;
|
682
700
|
}
|
683
701
|
|
684
|
-
log.
|
702
|
+
log.warn(`${connection} disconnected`);
|
685
703
|
if (this.reconnectAttempts === 0) {
|
686
704
|
// only reset start time on the first try
|
687
705
|
this.reconnectStart = Date.now();
|
688
706
|
}
|
689
707
|
|
690
708
|
const disconnect = (duration: number) => {
|
691
|
-
log.
|
709
|
+
log.warn(
|
692
710
|
`could not recover connection after ${this.reconnectAttempts} attempts, ${duration}ms. giving up`,
|
693
711
|
);
|
694
712
|
this.emit(EngineEvent.Disconnected);
|
@@ -713,12 +731,12 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
713
731
|
|
714
732
|
this.clearReconnectTimeout();
|
715
733
|
this.reconnectTimeout = CriticalTimers.setTimeout(
|
716
|
-
() => this.attemptReconnect(signalEvents),
|
734
|
+
() => this.attemptReconnect(signalEvents, disconnectReason),
|
717
735
|
delay,
|
718
736
|
);
|
719
737
|
};
|
720
738
|
|
721
|
-
private async attemptReconnect(signalEvents: boolean = false) {
|
739
|
+
private async attemptReconnect(signalEvents: boolean = false, reason?: ReconnectReason) {
|
722
740
|
if (this._isClosed) {
|
723
741
|
return;
|
724
742
|
}
|
@@ -740,7 +758,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
740
758
|
if (this.fullReconnectOnNext) {
|
741
759
|
await this.restartConnection(signalEvents);
|
742
760
|
} else {
|
743
|
-
await this.resumeConnection(signalEvents);
|
761
|
+
await this.resumeConnection(signalEvents, reason);
|
744
762
|
}
|
745
763
|
this.clearPendingReconnect();
|
746
764
|
this.fullReconnectOnNext = false;
|
@@ -766,7 +784,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
766
784
|
}
|
767
785
|
|
768
786
|
if (recoverable) {
|
769
|
-
this.handleDisconnect('reconnect', requireSignalEvents);
|
787
|
+
this.handleDisconnect('reconnect', requireSignalEvents, ReconnectReason.REASON_UNKOWN);
|
770
788
|
} else {
|
771
789
|
log.info(
|
772
790
|
`could not recover connection after ${this.reconnectAttempts} attempts, ${
|
@@ -831,7 +849,10 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
831
849
|
this.emit(EngineEvent.Restarted, joinResponse);
|
832
850
|
}
|
833
851
|
|
834
|
-
private async resumeConnection(
|
852
|
+
private async resumeConnection(
|
853
|
+
emitResuming: boolean = false,
|
854
|
+
reason?: ReconnectReason,
|
855
|
+
): Promise<void> {
|
835
856
|
if (!this.url || !this.token) {
|
836
857
|
// permanent failure, don't attempt reconnection
|
837
858
|
throw new UnexpectedConnectionState('could not reconnect, url or token not saved');
|
@@ -847,7 +868,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
847
868
|
}
|
848
869
|
|
849
870
|
try {
|
850
|
-
const res = await this.client.reconnect(this.url, this.token, this.participantSid);
|
871
|
+
const res = await this.client.reconnect(this.url, this.token, this.participantSid, reason);
|
851
872
|
if (res) {
|
852
873
|
const rtcConfig = this.makeRTCConfiguration(res);
|
853
874
|
this.publisher.pc.setConfiguration(rtcConfig);
|
@@ -1001,7 +1022,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
1001
1022
|
|
1002
1023
|
const negotiationTimeout = setTimeout(() => {
|
1003
1024
|
reject('negotiation timed out');
|
1004
|
-
this.handleDisconnect('negotiation');
|
1025
|
+
this.handleDisconnect('negotiation', false, ReconnectReason.REASON_SIGNAL_DISCONNECTED);
|
1005
1026
|
}, this.peerConnectionTimeout);
|
1006
1027
|
|
1007
1028
|
const cleanup = () => {
|
@@ -1022,7 +1043,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
1022
1043
|
if (e instanceof NegotiationError) {
|
1023
1044
|
this.fullReconnectOnNext = true;
|
1024
1045
|
}
|
1025
|
-
this.handleDisconnect('negotiation');
|
1046
|
+
this.handleDisconnect('negotiation', false, ReconnectReason.REASON_UNKOWN);
|
1026
1047
|
});
|
1027
1048
|
});
|
1028
1049
|
}
|
@@ -1060,7 +1081,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
1060
1081
|
// in case the engine is currently reconnecting, attempt a reconnect immediately after the browser state has changed to 'onLine'
|
1061
1082
|
if (this.client.isReconnecting) {
|
1062
1083
|
this.clearReconnectTimeout();
|
1063
|
-
this.attemptReconnect(true);
|
1084
|
+
this.attemptReconnect(true, ReconnectReason.REASON_SIGNAL_DISCONNECTED);
|
1064
1085
|
}
|
1065
1086
|
};
|
1066
1087
|
|