livekit-client 1.0.1 → 1.0.2
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 +792 -197
- 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/{api → src/api}/RequestQueue.d.ts +0 -0
- package/dist/src/api/RequestQueue.d.ts.map +1 -0
- package/dist/{api → src/api}/SignalClient.d.ts +1 -1
- package/dist/src/api/SignalClient.d.ts.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +0 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/{options.d.ts → src/options.d.ts} +0 -0
- package/dist/src/options.d.ts.map +1 -0
- package/dist/{proto → src/proto}/google/protobuf/timestamp.d.ts +0 -0
- package/dist/src/proto/google/protobuf/timestamp.d.ts.map +1 -0
- package/dist/{proto → src/proto}/livekit_models.d.ts +80 -0
- package/dist/src/proto/livekit_models.d.ts.map +1 -0
- package/dist/{proto → src/proto}/livekit_rtc.d.ts +661 -0
- package/dist/src/proto/livekit_rtc.d.ts.map +1 -0
- package/dist/{room → src/room}/DeviceManager.d.ts +0 -0
- package/dist/src/room/DeviceManager.d.ts.map +1 -0
- package/dist/{room → src/room}/PCTransport.d.ts +0 -0
- package/dist/src/room/PCTransport.d.ts.map +1 -0
- package/dist/{room → src/room}/RTCEngine.d.ts +1 -0
- package/dist/src/room/RTCEngine.d.ts.map +1 -0
- package/dist/{room → src/room}/Room.d.ts +2 -0
- package/dist/src/room/Room.d.ts.map +1 -0
- package/dist/{room → src/room}/errors.d.ts +0 -0
- package/dist/src/room/errors.d.ts.map +1 -0
- package/dist/{room → src/room}/events.d.ts +5 -1
- package/dist/src/room/events.d.ts.map +1 -0
- package/dist/{room → src/room}/participant/LocalParticipant.d.ts +4 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -0
- package/dist/{room → src/room}/participant/Participant.d.ts +0 -0
- package/dist/src/room/participant/Participant.d.ts.map +1 -0
- package/dist/{room → src/room}/participant/ParticipantTrackPermission.d.ts +0 -0
- package/dist/src/room/participant/ParticipantTrackPermission.d.ts.map +1 -0
- package/dist/{room → src/room}/participant/RemoteParticipant.d.ts +0 -0
- package/dist/src/room/participant/RemoteParticipant.d.ts.map +1 -0
- package/dist/{room → src/room}/participant/publishUtils.d.ts +0 -0
- package/dist/src/room/participant/publishUtils.d.ts.map +1 -0
- package/dist/{room → src/room}/stats.d.ts +1 -0
- package/dist/src/room/stats.d.ts.map +1 -0
- package/dist/{room → src/room}/track/LocalAudioTrack.d.ts +0 -0
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -0
- package/dist/{room → src/room}/track/LocalTrack.d.ts +3 -0
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -0
- package/dist/{room → src/room}/track/LocalTrackPublication.d.ts +0 -0
- package/dist/src/room/track/LocalTrackPublication.d.ts.map +1 -0
- package/dist/{room → src/room}/track/LocalVideoTrack.d.ts +17 -2
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -0
- package/dist/{room → src/room}/track/RemoteAudioTrack.d.ts +0 -0
- package/dist/src/room/track/RemoteAudioTrack.d.ts.map +1 -0
- package/dist/{room → src/room}/track/RemoteTrack.d.ts +0 -1
- package/dist/src/room/track/RemoteTrack.d.ts.map +1 -0
- package/dist/{room → src/room}/track/RemoteTrackPublication.d.ts +0 -0
- package/dist/src/room/track/RemoteTrackPublication.d.ts.map +1 -0
- package/dist/{room → src/room}/track/RemoteVideoTrack.d.ts +2 -0
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -0
- package/dist/{room → src/room}/track/Track.d.ts +4 -0
- package/dist/src/room/track/Track.d.ts.map +1 -0
- package/dist/{room → src/room}/track/TrackPublication.d.ts +0 -0
- package/dist/src/room/track/TrackPublication.d.ts.map +1 -0
- package/dist/{room → src/room}/track/create.d.ts +0 -0
- package/dist/src/room/track/create.d.ts.map +1 -0
- package/dist/{room → src/room}/track/defaults.d.ts +0 -0
- package/dist/src/room/track/defaults.d.ts.map +1 -0
- package/dist/{room → src/room}/track/options.d.ts +2 -1
- package/dist/src/room/track/options.d.ts.map +1 -0
- package/dist/{room → src/room}/track/types.d.ts +0 -0
- package/dist/src/room/track/types.d.ts.map +1 -0
- package/dist/{room → src/room}/track/utils.d.ts +0 -0
- package/dist/src/room/track/utils.d.ts.map +1 -0
- package/dist/{room → src/room}/utils.d.ts +0 -0
- package/dist/src/room/utils.d.ts.map +1 -0
- package/dist/{test → src/test}/MockMediaStreamTrack.d.ts +0 -0
- package/dist/src/test/MockMediaStreamTrack.d.ts.map +1 -0
- package/dist/{test → src/test}/mocks.d.ts +0 -0
- package/dist/src/test/mocks.d.ts.map +1 -0
- package/dist/src/version.d.ts +3 -0
- package/dist/src/version.d.ts.map +1 -0
- package/package.json +5 -2
- package/src/api/SignalClient.ts +2 -2
- package/src/proto/livekit_models.ts +90 -0
- package/src/proto/livekit_rtc.ts +235 -1
- package/src/room/RTCEngine.ts +30 -2
- package/src/room/Room.ts +60 -15
- package/src/room/events.ts +5 -0
- package/src/room/participant/LocalParticipant.ts +104 -23
- package/src/room/participant/RemoteParticipant.ts +1 -0
- package/src/room/stats.ts +2 -0
- package/src/room/track/LocalAudioTrack.ts +4 -0
- package/src/room/track/LocalTrack.ts +12 -5
- package/src/room/track/LocalVideoTrack.ts +143 -55
- package/src/room/track/RemoteTrack.ts +0 -2
- package/src/room/track/RemoteVideoTrack.ts +6 -0
- package/src/room/track/Track.ts +5 -0
- package/src/room/track/options.ts +2 -1
- package/src/version.ts +4 -2
- package/dist/api/RequestQueue.d.ts.map +0 -1
- package/dist/api/SignalClient.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/options.d.ts.map +0 -1
- package/dist/proto/google/protobuf/timestamp.d.ts.map +0 -1
- package/dist/proto/livekit_models.d.ts.map +0 -1
- package/dist/proto/livekit_rtc.d.ts.map +0 -1
- package/dist/room/DeviceManager.d.ts.map +0 -1
- package/dist/room/PCTransport.d.ts.map +0 -1
- package/dist/room/RTCEngine.d.ts.map +0 -1
- package/dist/room/Room.d.ts.map +0 -1
- package/dist/room/errors.d.ts.map +0 -1
- package/dist/room/events.d.ts.map +0 -1
- package/dist/room/participant/LocalParticipant.d.ts.map +0 -1
- package/dist/room/participant/Participant.d.ts.map +0 -1
- package/dist/room/participant/ParticipantTrackPermission.d.ts.map +0 -1
- package/dist/room/participant/RemoteParticipant.d.ts.map +0 -1
- package/dist/room/participant/publishUtils.d.ts.map +0 -1
- package/dist/room/stats.d.ts.map +0 -1
- package/dist/room/track/LocalAudioTrack.d.ts.map +0 -1
- package/dist/room/track/LocalTrack.d.ts.map +0 -1
- package/dist/room/track/LocalTrackPublication.d.ts.map +0 -1
- package/dist/room/track/LocalVideoTrack.d.ts.map +0 -1
- package/dist/room/track/RemoteAudioTrack.d.ts.map +0 -1
- package/dist/room/track/RemoteTrack.d.ts.map +0 -1
- package/dist/room/track/RemoteTrackPublication.d.ts.map +0 -1
- package/dist/room/track/RemoteVideoTrack.d.ts.map +0 -1
- package/dist/room/track/Track.d.ts.map +0 -1
- package/dist/room/track/TrackPublication.d.ts.map +0 -1
- package/dist/room/track/create.d.ts.map +0 -1
- package/dist/room/track/defaults.d.ts.map +0 -1
- package/dist/room/track/options.d.ts.map +0 -1
- package/dist/room/track/types.d.ts.map +0 -1
- package/dist/room/track/utils.d.ts.map +0 -1
- package/dist/room/utils.d.ts.map +0 -1
- package/dist/test/MockMediaStreamTrack.d.ts.map +0 -1
- package/dist/test/mocks.d.ts.map +0 -1
- package/dist/version.d.ts +0 -3
- package/dist/version.d.ts.map +0 -1
@@ -311,6 +311,12 @@ export function participantInfo_StateToJSON(object: ParticipantInfo_State): stri
|
|
311
311
|
}
|
312
312
|
}
|
313
313
|
|
314
|
+
export interface SimulcastCodecInfo {
|
315
|
+
mimeType: string;
|
316
|
+
mid: string;
|
317
|
+
cid: string;
|
318
|
+
}
|
319
|
+
|
314
320
|
export interface TrackInfo {
|
315
321
|
sid: string;
|
316
322
|
type: TrackType;
|
@@ -333,6 +339,7 @@ export interface TrackInfo {
|
|
333
339
|
/** mime type of codec */
|
334
340
|
mimeType: string;
|
335
341
|
mid: string;
|
342
|
+
codecs: SimulcastCodecInfo[];
|
336
343
|
}
|
337
344
|
|
338
345
|
/** provide information about available spatial layers */
|
@@ -1007,6 +1014,73 @@ export const ParticipantInfo = {
|
|
1007
1014
|
},
|
1008
1015
|
};
|
1009
1016
|
|
1017
|
+
function createBaseSimulcastCodecInfo(): SimulcastCodecInfo {
|
1018
|
+
return { mimeType: '', mid: '', cid: '' };
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
export const SimulcastCodecInfo = {
|
1022
|
+
encode(message: SimulcastCodecInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
1023
|
+
if (message.mimeType !== '') {
|
1024
|
+
writer.uint32(10).string(message.mimeType);
|
1025
|
+
}
|
1026
|
+
if (message.mid !== '') {
|
1027
|
+
writer.uint32(18).string(message.mid);
|
1028
|
+
}
|
1029
|
+
if (message.cid !== '') {
|
1030
|
+
writer.uint32(26).string(message.cid);
|
1031
|
+
}
|
1032
|
+
return writer;
|
1033
|
+
},
|
1034
|
+
|
1035
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): SimulcastCodecInfo {
|
1036
|
+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
|
1037
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
1038
|
+
const message = createBaseSimulcastCodecInfo();
|
1039
|
+
while (reader.pos < end) {
|
1040
|
+
const tag = reader.uint32();
|
1041
|
+
switch (tag >>> 3) {
|
1042
|
+
case 1:
|
1043
|
+
message.mimeType = reader.string();
|
1044
|
+
break;
|
1045
|
+
case 2:
|
1046
|
+
message.mid = reader.string();
|
1047
|
+
break;
|
1048
|
+
case 3:
|
1049
|
+
message.cid = reader.string();
|
1050
|
+
break;
|
1051
|
+
default:
|
1052
|
+
reader.skipType(tag & 7);
|
1053
|
+
break;
|
1054
|
+
}
|
1055
|
+
}
|
1056
|
+
return message;
|
1057
|
+
},
|
1058
|
+
|
1059
|
+
fromJSON(object: any): SimulcastCodecInfo {
|
1060
|
+
return {
|
1061
|
+
mimeType: isSet(object.mimeType) ? String(object.mimeType) : '',
|
1062
|
+
mid: isSet(object.mid) ? String(object.mid) : '',
|
1063
|
+
cid: isSet(object.cid) ? String(object.cid) : '',
|
1064
|
+
};
|
1065
|
+
},
|
1066
|
+
|
1067
|
+
toJSON(message: SimulcastCodecInfo): unknown {
|
1068
|
+
const obj: any = {};
|
1069
|
+
message.mimeType !== undefined && (obj.mimeType = message.mimeType);
|
1070
|
+
message.mid !== undefined && (obj.mid = message.mid);
|
1071
|
+
message.cid !== undefined && (obj.cid = message.cid);
|
1072
|
+
return obj;
|
1073
|
+
},
|
1074
|
+
|
1075
|
+
fromPartial<I extends Exact<DeepPartial<SimulcastCodecInfo>, I>>(object: I): SimulcastCodecInfo {
|
1076
|
+
const message = createBaseSimulcastCodecInfo();
|
1077
|
+
message.mimeType = object.mimeType ?? '';
|
1078
|
+
message.mid = object.mid ?? '';
|
1079
|
+
message.cid = object.cid ?? '';
|
1080
|
+
return message;
|
1081
|
+
},
|
1082
|
+
};
|
1083
|
+
|
1010
1084
|
function createBaseTrackInfo(): TrackInfo {
|
1011
1085
|
return {
|
1012
1086
|
sid: '',
|
@@ -1021,6 +1095,7 @@ function createBaseTrackInfo(): TrackInfo {
|
|
1021
1095
|
layers: [],
|
1022
1096
|
mimeType: '',
|
1023
1097
|
mid: '',
|
1098
|
+
codecs: [],
|
1024
1099
|
};
|
1025
1100
|
}
|
1026
1101
|
|
@@ -1062,6 +1137,9 @@ export const TrackInfo = {
|
|
1062
1137
|
if (message.mid !== '') {
|
1063
1138
|
writer.uint32(98).string(message.mid);
|
1064
1139
|
}
|
1140
|
+
for (const v of message.codecs) {
|
1141
|
+
SimulcastCodecInfo.encode(v!, writer.uint32(106).fork()).ldelim();
|
1142
|
+
}
|
1065
1143
|
return writer;
|
1066
1144
|
},
|
1067
1145
|
|
@@ -1108,6 +1186,9 @@ export const TrackInfo = {
|
|
1108
1186
|
case 12:
|
1109
1187
|
message.mid = reader.string();
|
1110
1188
|
break;
|
1189
|
+
case 13:
|
1190
|
+
message.codecs.push(SimulcastCodecInfo.decode(reader, reader.uint32()));
|
1191
|
+
break;
|
1111
1192
|
default:
|
1112
1193
|
reader.skipType(tag & 7);
|
1113
1194
|
break;
|
@@ -1132,6 +1213,9 @@ export const TrackInfo = {
|
|
1132
1213
|
: [],
|
1133
1214
|
mimeType: isSet(object.mimeType) ? String(object.mimeType) : '',
|
1134
1215
|
mid: isSet(object.mid) ? String(object.mid) : '',
|
1216
|
+
codecs: Array.isArray(object?.codecs)
|
1217
|
+
? object.codecs.map((e: any) => SimulcastCodecInfo.fromJSON(e))
|
1218
|
+
: [],
|
1135
1219
|
};
|
1136
1220
|
},
|
1137
1221
|
|
@@ -1153,6 +1237,11 @@ export const TrackInfo = {
|
|
1153
1237
|
}
|
1154
1238
|
message.mimeType !== undefined && (obj.mimeType = message.mimeType);
|
1155
1239
|
message.mid !== undefined && (obj.mid = message.mid);
|
1240
|
+
if (message.codecs) {
|
1241
|
+
obj.codecs = message.codecs.map((e) => (e ? SimulcastCodecInfo.toJSON(e) : undefined));
|
1242
|
+
} else {
|
1243
|
+
obj.codecs = [];
|
1244
|
+
}
|
1156
1245
|
return obj;
|
1157
1246
|
},
|
1158
1247
|
|
@@ -1170,6 +1259,7 @@ export const TrackInfo = {
|
|
1170
1259
|
message.layers = object.layers?.map((e) => VideoLayer.fromPartial(e)) || [];
|
1171
1260
|
message.mimeType = object.mimeType ?? '';
|
1172
1261
|
message.mid = object.mid ?? '';
|
1262
|
+
message.codecs = object.codecs?.map((e) => SimulcastCodecInfo.fromPartial(e)) || [];
|
1173
1263
|
return message;
|
1174
1264
|
},
|
1175
1265
|
};
|
package/src/proto/livekit_rtc.ts
CHANGED
@@ -89,6 +89,38 @@ export function streamStateToJSON(object: StreamState): string {
|
|
89
89
|
}
|
90
90
|
}
|
91
91
|
|
92
|
+
export enum CandidateProtocol {
|
93
|
+
UDP = 0,
|
94
|
+
TCP = 1,
|
95
|
+
UNRECOGNIZED = -1,
|
96
|
+
}
|
97
|
+
|
98
|
+
export function candidateProtocolFromJSON(object: any): CandidateProtocol {
|
99
|
+
switch (object) {
|
100
|
+
case 0:
|
101
|
+
case 'UDP':
|
102
|
+
return CandidateProtocol.UDP;
|
103
|
+
case 1:
|
104
|
+
case 'TCP':
|
105
|
+
return CandidateProtocol.TCP;
|
106
|
+
case -1:
|
107
|
+
case 'UNRECOGNIZED':
|
108
|
+
default:
|
109
|
+
return CandidateProtocol.UNRECOGNIZED;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
export function candidateProtocolToJSON(object: CandidateProtocol): string {
|
114
|
+
switch (object) {
|
115
|
+
case CandidateProtocol.UDP:
|
116
|
+
return 'UDP';
|
117
|
+
case CandidateProtocol.TCP:
|
118
|
+
return 'TCP';
|
119
|
+
default:
|
120
|
+
return 'UNKNOWN';
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
92
124
|
export interface SignalRequest {
|
93
125
|
/** initial join exchange, for publisher */
|
94
126
|
offer?: SessionDescription | undefined;
|
@@ -156,6 +188,12 @@ export interface SignalResponse {
|
|
156
188
|
trackUnpublished?: TrackUnpublishedResponse | undefined;
|
157
189
|
}
|
158
190
|
|
191
|
+
export interface SimulcastCodec {
|
192
|
+
codec: string;
|
193
|
+
cid: string;
|
194
|
+
enableSimulcastLayers: boolean;
|
195
|
+
}
|
196
|
+
|
159
197
|
export interface AddTrackRequest {
|
160
198
|
/** client ID of track, to match it when RTC track is received */
|
161
199
|
cid: string;
|
@@ -170,6 +208,7 @@ export interface AddTrackRequest {
|
|
170
208
|
disableDtx: boolean;
|
171
209
|
source: TrackSource;
|
172
210
|
layers: VideoLayer[];
|
211
|
+
simulcastCodecs: SimulcastCodec[];
|
173
212
|
}
|
174
213
|
|
175
214
|
export interface TrickleRequest {
|
@@ -289,9 +328,15 @@ export interface SubscribedQuality {
|
|
289
328
|
enabled: boolean;
|
290
329
|
}
|
291
330
|
|
331
|
+
export interface SubscribedCodec {
|
332
|
+
codec: string;
|
333
|
+
qualities: SubscribedQuality[];
|
334
|
+
}
|
335
|
+
|
292
336
|
export interface SubscribedQualityUpdate {
|
293
337
|
trackSid: string;
|
294
338
|
subscribedQualities: SubscribedQuality[];
|
339
|
+
subscribedCodecs: SubscribedCodec[];
|
295
340
|
}
|
296
341
|
|
297
342
|
export interface TrackPermission {
|
@@ -335,6 +380,8 @@ export interface SimulateScenario {
|
|
335
380
|
migration: boolean | undefined;
|
336
381
|
/** server to send leave */
|
337
382
|
serverLeave: boolean | undefined;
|
383
|
+
/** switch candidate protocol to tcp */
|
384
|
+
switchCandidateProtocol: CandidateProtocol | undefined;
|
338
385
|
}
|
339
386
|
|
340
387
|
function createBaseSignalRequest(): SignalRequest {
|
@@ -864,6 +911,76 @@ export const SignalResponse = {
|
|
864
911
|
},
|
865
912
|
};
|
866
913
|
|
914
|
+
function createBaseSimulcastCodec(): SimulcastCodec {
|
915
|
+
return { codec: '', cid: '', enableSimulcastLayers: false };
|
916
|
+
}
|
917
|
+
|
918
|
+
export const SimulcastCodec = {
|
919
|
+
encode(message: SimulcastCodec, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
920
|
+
if (message.codec !== '') {
|
921
|
+
writer.uint32(10).string(message.codec);
|
922
|
+
}
|
923
|
+
if (message.cid !== '') {
|
924
|
+
writer.uint32(18).string(message.cid);
|
925
|
+
}
|
926
|
+
if (message.enableSimulcastLayers === true) {
|
927
|
+
writer.uint32(24).bool(message.enableSimulcastLayers);
|
928
|
+
}
|
929
|
+
return writer;
|
930
|
+
},
|
931
|
+
|
932
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): SimulcastCodec {
|
933
|
+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
|
934
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
935
|
+
const message = createBaseSimulcastCodec();
|
936
|
+
while (reader.pos < end) {
|
937
|
+
const tag = reader.uint32();
|
938
|
+
switch (tag >>> 3) {
|
939
|
+
case 1:
|
940
|
+
message.codec = reader.string();
|
941
|
+
break;
|
942
|
+
case 2:
|
943
|
+
message.cid = reader.string();
|
944
|
+
break;
|
945
|
+
case 3:
|
946
|
+
message.enableSimulcastLayers = reader.bool();
|
947
|
+
break;
|
948
|
+
default:
|
949
|
+
reader.skipType(tag & 7);
|
950
|
+
break;
|
951
|
+
}
|
952
|
+
}
|
953
|
+
return message;
|
954
|
+
},
|
955
|
+
|
956
|
+
fromJSON(object: any): SimulcastCodec {
|
957
|
+
return {
|
958
|
+
codec: isSet(object.codec) ? String(object.codec) : '',
|
959
|
+
cid: isSet(object.cid) ? String(object.cid) : '',
|
960
|
+
enableSimulcastLayers: isSet(object.enableSimulcastLayers)
|
961
|
+
? Boolean(object.enableSimulcastLayers)
|
962
|
+
: false,
|
963
|
+
};
|
964
|
+
},
|
965
|
+
|
966
|
+
toJSON(message: SimulcastCodec): unknown {
|
967
|
+
const obj: any = {};
|
968
|
+
message.codec !== undefined && (obj.codec = message.codec);
|
969
|
+
message.cid !== undefined && (obj.cid = message.cid);
|
970
|
+
message.enableSimulcastLayers !== undefined &&
|
971
|
+
(obj.enableSimulcastLayers = message.enableSimulcastLayers);
|
972
|
+
return obj;
|
973
|
+
},
|
974
|
+
|
975
|
+
fromPartial<I extends Exact<DeepPartial<SimulcastCodec>, I>>(object: I): SimulcastCodec {
|
976
|
+
const message = createBaseSimulcastCodec();
|
977
|
+
message.codec = object.codec ?? '';
|
978
|
+
message.cid = object.cid ?? '';
|
979
|
+
message.enableSimulcastLayers = object.enableSimulcastLayers ?? false;
|
980
|
+
return message;
|
981
|
+
},
|
982
|
+
};
|
983
|
+
|
867
984
|
function createBaseAddTrackRequest(): AddTrackRequest {
|
868
985
|
return {
|
869
986
|
cid: '',
|
@@ -875,6 +992,7 @@ function createBaseAddTrackRequest(): AddTrackRequest {
|
|
875
992
|
disableDtx: false,
|
876
993
|
source: 0,
|
877
994
|
layers: [],
|
995
|
+
simulcastCodecs: [],
|
878
996
|
};
|
879
997
|
}
|
880
998
|
|
@@ -907,6 +1025,9 @@ export const AddTrackRequest = {
|
|
907
1025
|
for (const v of message.layers) {
|
908
1026
|
VideoLayer.encode(v!, writer.uint32(74).fork()).ldelim();
|
909
1027
|
}
|
1028
|
+
for (const v of message.simulcastCodecs) {
|
1029
|
+
SimulcastCodec.encode(v!, writer.uint32(82).fork()).ldelim();
|
1030
|
+
}
|
910
1031
|
return writer;
|
911
1032
|
},
|
912
1033
|
|
@@ -944,6 +1065,9 @@ export const AddTrackRequest = {
|
|
944
1065
|
case 9:
|
945
1066
|
message.layers.push(VideoLayer.decode(reader, reader.uint32()));
|
946
1067
|
break;
|
1068
|
+
case 10:
|
1069
|
+
message.simulcastCodecs.push(SimulcastCodec.decode(reader, reader.uint32()));
|
1070
|
+
break;
|
947
1071
|
default:
|
948
1072
|
reader.skipType(tag & 7);
|
949
1073
|
break;
|
@@ -965,6 +1089,9 @@ export const AddTrackRequest = {
|
|
965
1089
|
layers: Array.isArray(object?.layers)
|
966
1090
|
? object.layers.map((e: any) => VideoLayer.fromJSON(e))
|
967
1091
|
: [],
|
1092
|
+
simulcastCodecs: Array.isArray(object?.simulcastCodecs)
|
1093
|
+
? object.simulcastCodecs.map((e: any) => SimulcastCodec.fromJSON(e))
|
1094
|
+
: [],
|
968
1095
|
};
|
969
1096
|
},
|
970
1097
|
|
@@ -983,6 +1110,13 @@ export const AddTrackRequest = {
|
|
983
1110
|
} else {
|
984
1111
|
obj.layers = [];
|
985
1112
|
}
|
1113
|
+
if (message.simulcastCodecs) {
|
1114
|
+
obj.simulcastCodecs = message.simulcastCodecs.map((e) =>
|
1115
|
+
e ? SimulcastCodec.toJSON(e) : undefined,
|
1116
|
+
);
|
1117
|
+
} else {
|
1118
|
+
obj.simulcastCodecs = [];
|
1119
|
+
}
|
986
1120
|
return obj;
|
987
1121
|
},
|
988
1122
|
|
@@ -997,6 +1131,8 @@ export const AddTrackRequest = {
|
|
997
1131
|
message.disableDtx = object.disableDtx ?? false;
|
998
1132
|
message.source = object.source ?? 0;
|
999
1133
|
message.layers = object.layers?.map((e) => VideoLayer.fromPartial(e)) || [];
|
1134
|
+
message.simulcastCodecs =
|
1135
|
+
object.simulcastCodecs?.map((e) => SimulcastCodec.fromPartial(e)) || [];
|
1000
1136
|
return message;
|
1001
1137
|
},
|
1002
1138
|
};
|
@@ -2284,8 +2420,72 @@ export const SubscribedQuality = {
|
|
2284
2420
|
},
|
2285
2421
|
};
|
2286
2422
|
|
2423
|
+
function createBaseSubscribedCodec(): SubscribedCodec {
|
2424
|
+
return { codec: '', qualities: [] };
|
2425
|
+
}
|
2426
|
+
|
2427
|
+
export const SubscribedCodec = {
|
2428
|
+
encode(message: SubscribedCodec, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
|
2429
|
+
if (message.codec !== '') {
|
2430
|
+
writer.uint32(10).string(message.codec);
|
2431
|
+
}
|
2432
|
+
for (const v of message.qualities) {
|
2433
|
+
SubscribedQuality.encode(v!, writer.uint32(18).fork()).ldelim();
|
2434
|
+
}
|
2435
|
+
return writer;
|
2436
|
+
},
|
2437
|
+
|
2438
|
+
decode(input: _m0.Reader | Uint8Array, length?: number): SubscribedCodec {
|
2439
|
+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
|
2440
|
+
let end = length === undefined ? reader.len : reader.pos + length;
|
2441
|
+
const message = createBaseSubscribedCodec();
|
2442
|
+
while (reader.pos < end) {
|
2443
|
+
const tag = reader.uint32();
|
2444
|
+
switch (tag >>> 3) {
|
2445
|
+
case 1:
|
2446
|
+
message.codec = reader.string();
|
2447
|
+
break;
|
2448
|
+
case 2:
|
2449
|
+
message.qualities.push(SubscribedQuality.decode(reader, reader.uint32()));
|
2450
|
+
break;
|
2451
|
+
default:
|
2452
|
+
reader.skipType(tag & 7);
|
2453
|
+
break;
|
2454
|
+
}
|
2455
|
+
}
|
2456
|
+
return message;
|
2457
|
+
},
|
2458
|
+
|
2459
|
+
fromJSON(object: any): SubscribedCodec {
|
2460
|
+
return {
|
2461
|
+
codec: isSet(object.codec) ? String(object.codec) : '',
|
2462
|
+
qualities: Array.isArray(object?.qualities)
|
2463
|
+
? object.qualities.map((e: any) => SubscribedQuality.fromJSON(e))
|
2464
|
+
: [],
|
2465
|
+
};
|
2466
|
+
},
|
2467
|
+
|
2468
|
+
toJSON(message: SubscribedCodec): unknown {
|
2469
|
+
const obj: any = {};
|
2470
|
+
message.codec !== undefined && (obj.codec = message.codec);
|
2471
|
+
if (message.qualities) {
|
2472
|
+
obj.qualities = message.qualities.map((e) => (e ? SubscribedQuality.toJSON(e) : undefined));
|
2473
|
+
} else {
|
2474
|
+
obj.qualities = [];
|
2475
|
+
}
|
2476
|
+
return obj;
|
2477
|
+
},
|
2478
|
+
|
2479
|
+
fromPartial<I extends Exact<DeepPartial<SubscribedCodec>, I>>(object: I): SubscribedCodec {
|
2480
|
+
const message = createBaseSubscribedCodec();
|
2481
|
+
message.codec = object.codec ?? '';
|
2482
|
+
message.qualities = object.qualities?.map((e) => SubscribedQuality.fromPartial(e)) || [];
|
2483
|
+
return message;
|
2484
|
+
},
|
2485
|
+
};
|
2486
|
+
|
2287
2487
|
function createBaseSubscribedQualityUpdate(): SubscribedQualityUpdate {
|
2288
|
-
return { trackSid: '', subscribedQualities: [] };
|
2488
|
+
return { trackSid: '', subscribedQualities: [], subscribedCodecs: [] };
|
2289
2489
|
}
|
2290
2490
|
|
2291
2491
|
export const SubscribedQualityUpdate = {
|
@@ -2296,6 +2496,9 @@ export const SubscribedQualityUpdate = {
|
|
2296
2496
|
for (const v of message.subscribedQualities) {
|
2297
2497
|
SubscribedQuality.encode(v!, writer.uint32(18).fork()).ldelim();
|
2298
2498
|
}
|
2499
|
+
for (const v of message.subscribedCodecs) {
|
2500
|
+
SubscribedCodec.encode(v!, writer.uint32(26).fork()).ldelim();
|
2501
|
+
}
|
2299
2502
|
return writer;
|
2300
2503
|
},
|
2301
2504
|
|
@@ -2312,6 +2515,9 @@ export const SubscribedQualityUpdate = {
|
|
2312
2515
|
case 2:
|
2313
2516
|
message.subscribedQualities.push(SubscribedQuality.decode(reader, reader.uint32()));
|
2314
2517
|
break;
|
2518
|
+
case 3:
|
2519
|
+
message.subscribedCodecs.push(SubscribedCodec.decode(reader, reader.uint32()));
|
2520
|
+
break;
|
2315
2521
|
default:
|
2316
2522
|
reader.skipType(tag & 7);
|
2317
2523
|
break;
|
@@ -2326,6 +2532,9 @@ export const SubscribedQualityUpdate = {
|
|
2326
2532
|
subscribedQualities: Array.isArray(object?.subscribedQualities)
|
2327
2533
|
? object.subscribedQualities.map((e: any) => SubscribedQuality.fromJSON(e))
|
2328
2534
|
: [],
|
2535
|
+
subscribedCodecs: Array.isArray(object?.subscribedCodecs)
|
2536
|
+
? object.subscribedCodecs.map((e: any) => SubscribedCodec.fromJSON(e))
|
2537
|
+
: [],
|
2329
2538
|
};
|
2330
2539
|
},
|
2331
2540
|
|
@@ -2339,6 +2548,13 @@ export const SubscribedQualityUpdate = {
|
|
2339
2548
|
} else {
|
2340
2549
|
obj.subscribedQualities = [];
|
2341
2550
|
}
|
2551
|
+
if (message.subscribedCodecs) {
|
2552
|
+
obj.subscribedCodecs = message.subscribedCodecs.map((e) =>
|
2553
|
+
e ? SubscribedCodec.toJSON(e) : undefined,
|
2554
|
+
);
|
2555
|
+
} else {
|
2556
|
+
obj.subscribedCodecs = [];
|
2557
|
+
}
|
2342
2558
|
return obj;
|
2343
2559
|
},
|
2344
2560
|
|
@@ -2349,6 +2565,8 @@ export const SubscribedQualityUpdate = {
|
|
2349
2565
|
message.trackSid = object.trackSid ?? '';
|
2350
2566
|
message.subscribedQualities =
|
2351
2567
|
object.subscribedQualities?.map((e) => SubscribedQuality.fromPartial(e)) || [];
|
2568
|
+
message.subscribedCodecs =
|
2569
|
+
object.subscribedCodecs?.map((e) => SubscribedCodec.fromPartial(e)) || [];
|
2352
2570
|
return message;
|
2353
2571
|
},
|
2354
2572
|
};
|
@@ -2757,6 +2975,7 @@ function createBaseSimulateScenario(): SimulateScenario {
|
|
2757
2975
|
nodeFailure: undefined,
|
2758
2976
|
migration: undefined,
|
2759
2977
|
serverLeave: undefined,
|
2978
|
+
switchCandidateProtocol: undefined,
|
2760
2979
|
};
|
2761
2980
|
}
|
2762
2981
|
|
@@ -2774,6 +2993,9 @@ export const SimulateScenario = {
|
|
2774
2993
|
if (message.serverLeave !== undefined) {
|
2775
2994
|
writer.uint32(32).bool(message.serverLeave);
|
2776
2995
|
}
|
2996
|
+
if (message.switchCandidateProtocol !== undefined) {
|
2997
|
+
writer.uint32(40).int32(message.switchCandidateProtocol);
|
2998
|
+
}
|
2777
2999
|
return writer;
|
2778
3000
|
},
|
2779
3001
|
|
@@ -2796,6 +3018,9 @@ export const SimulateScenario = {
|
|
2796
3018
|
case 4:
|
2797
3019
|
message.serverLeave = reader.bool();
|
2798
3020
|
break;
|
3021
|
+
case 5:
|
3022
|
+
message.switchCandidateProtocol = reader.int32() as any;
|
3023
|
+
break;
|
2799
3024
|
default:
|
2800
3025
|
reader.skipType(tag & 7);
|
2801
3026
|
break;
|
@@ -2810,6 +3035,9 @@ export const SimulateScenario = {
|
|
2810
3035
|
nodeFailure: isSet(object.nodeFailure) ? Boolean(object.nodeFailure) : undefined,
|
2811
3036
|
migration: isSet(object.migration) ? Boolean(object.migration) : undefined,
|
2812
3037
|
serverLeave: isSet(object.serverLeave) ? Boolean(object.serverLeave) : undefined,
|
3038
|
+
switchCandidateProtocol: isSet(object.switchCandidateProtocol)
|
3039
|
+
? candidateProtocolFromJSON(object.switchCandidateProtocol)
|
3040
|
+
: undefined,
|
2813
3041
|
};
|
2814
3042
|
},
|
2815
3043
|
|
@@ -2819,6 +3047,11 @@ export const SimulateScenario = {
|
|
2819
3047
|
message.nodeFailure !== undefined && (obj.nodeFailure = message.nodeFailure);
|
2820
3048
|
message.migration !== undefined && (obj.migration = message.migration);
|
2821
3049
|
message.serverLeave !== undefined && (obj.serverLeave = message.serverLeave);
|
3050
|
+
message.switchCandidateProtocol !== undefined &&
|
3051
|
+
(obj.switchCandidateProtocol =
|
3052
|
+
message.switchCandidateProtocol !== undefined
|
3053
|
+
? candidateProtocolToJSON(message.switchCandidateProtocol)
|
3054
|
+
: undefined);
|
2822
3055
|
return obj;
|
2823
3056
|
},
|
2824
3057
|
|
@@ -2828,6 +3061,7 @@ export const SimulateScenario = {
|
|
2828
3061
|
message.nodeFailure = object.nodeFailure ?? undefined;
|
2829
3062
|
message.migration = object.migration ?? undefined;
|
2830
3063
|
message.serverLeave = object.serverLeave ?? undefined;
|
3064
|
+
message.switchCandidateProtocol = object.switchCandidateProtocol ?? undefined;
|
2831
3065
|
return message;
|
2832
3066
|
},
|
2833
3067
|
};
|
package/src/room/RTCEngine.ts
CHANGED
@@ -93,6 +93,8 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
93
93
|
|
94
94
|
private connectedServerAddr?: string;
|
95
95
|
|
96
|
+
private attemptingReconnect: boolean = false;
|
97
|
+
|
96
98
|
constructor() {
|
97
99
|
super();
|
98
100
|
this.client = new SignalClient();
|
@@ -229,7 +231,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
229
231
|
}
|
230
232
|
this.primaryPC = primaryPC;
|
231
233
|
primaryPC.onconnectionstatechange = async () => {
|
232
|
-
log.
|
234
|
+
log.debug('primary PC state changed', {
|
233
235
|
state: primaryPC.connectionState,
|
234
236
|
});
|
235
237
|
if (primaryPC.connectionState === 'connected') {
|
@@ -253,6 +255,9 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
253
255
|
}
|
254
256
|
};
|
255
257
|
secondaryPC.onconnectionstatechange = async () => {
|
258
|
+
log.debug('secondary PC state changed', {
|
259
|
+
state: secondaryPC.connectionState,
|
260
|
+
});
|
256
261
|
// also reconnect if secondary peerconnection fails
|
257
262
|
if (secondaryPC.connectionState === 'failed') {
|
258
263
|
this.handleDisconnect('secondary peerconnection');
|
@@ -426,14 +431,22 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
426
431
|
if (this._isClosed) {
|
427
432
|
return;
|
428
433
|
}
|
434
|
+
// guard for attempting reconnection multiple times while one attempt is still not finished
|
435
|
+
if (this.attemptingReconnect) {
|
436
|
+
return;
|
437
|
+
}
|
429
438
|
if (
|
430
439
|
isFireFox() || // TODO remove once clientConfiguration handles firefox case server side
|
431
|
-
this.clientConfiguration?.resumeConnection === ClientConfigSetting.DISABLED
|
440
|
+
this.clientConfiguration?.resumeConnection === ClientConfigSetting.DISABLED ||
|
441
|
+
// signaling state could change to closed due to hardware sleep
|
442
|
+
// those connections cannot be resumed
|
443
|
+
(this.primaryPC?.signalingState ?? 'closed') === 'closed'
|
432
444
|
) {
|
433
445
|
this.fullReconnectOnNext = true;
|
434
446
|
}
|
435
447
|
|
436
448
|
try {
|
449
|
+
this.attemptingReconnect = true;
|
437
450
|
if (this.fullReconnectOnNext) {
|
438
451
|
await this.restartConnection();
|
439
452
|
} else {
|
@@ -443,6 +456,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
443
456
|
this.fullReconnectOnNext = false;
|
444
457
|
} catch (e) {
|
445
458
|
this.reconnectAttempts += 1;
|
459
|
+
let reconnectRequired = false;
|
446
460
|
let recoverable = true;
|
447
461
|
if (e instanceof UnexpectedConnectionState) {
|
448
462
|
log.debug('received unrecoverable error', { error: e });
|
@@ -450,7 +464,14 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
450
464
|
recoverable = false;
|
451
465
|
} else if (!(e instanceof SignalReconnectError)) {
|
452
466
|
// cannot resume
|
467
|
+
reconnectRequired = true;
|
468
|
+
}
|
469
|
+
|
470
|
+
// when we flip from resume to reconnect, we need to reset reconnectAttempts
|
471
|
+
// this is needed to fire the right reconnecting events
|
472
|
+
if (reconnectRequired && !this.fullReconnectOnNext) {
|
453
473
|
this.fullReconnectOnNext = true;
|
474
|
+
this.reconnectAttempts = 0;
|
454
475
|
}
|
455
476
|
|
456
477
|
const duration = Date.now() - this.reconnectStart;
|
@@ -467,6 +488,8 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
467
488
|
this.emit(EngineEvent.Disconnected);
|
468
489
|
this.close();
|
469
490
|
}
|
491
|
+
} finally {
|
492
|
+
this.attemptingReconnect = false;
|
470
493
|
}
|
471
494
|
}, delay);
|
472
495
|
};
|
@@ -482,6 +505,10 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
482
505
|
this.emit(EngineEvent.Restarting);
|
483
506
|
}
|
484
507
|
|
508
|
+
if (this.client.isConnected) {
|
509
|
+
this.client.sendLeave();
|
510
|
+
}
|
511
|
+
this.client.close();
|
485
512
|
this.primaryPC = undefined;
|
486
513
|
this.publisher?.close();
|
487
514
|
this.publisher = undefined;
|
@@ -511,6 +538,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
511
538
|
if (!this.publisher || !this.subscriber) {
|
512
539
|
throw new UnexpectedConnectionState('publisher and subscriber connections unset');
|
513
540
|
}
|
541
|
+
|
514
542
|
log.info(`resuming signal connection, attempt ${this.reconnectAttempts}`);
|
515
543
|
if (this.reconnectAttempts === 0) {
|
516
544
|
this.emit(EngineEvent.Resuming);
|