livekit-client 1.6.2 → 1.6.4
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 +468 -140
- 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 +3 -3
- 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/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/proto/livekit_models.d.ts +53 -4
- package/dist/src/proto/livekit_models.d.ts.map +1 -1
- package/dist/src/proto/livekit_rtc.d.ts +650 -91
- package/dist/src/proto/livekit_rtc.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +1 -0
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +2 -0
- 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/timers.d.ts +13 -0
- package/dist/src/room/timers.d.ts.map +1 -0
- package/dist/src/room/track/RemoteVideoTrack.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 +3 -3
- package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +2 -2
- package/dist/ts4.2/src/index.d.ts +2 -1
- package/dist/ts4.2/src/proto/livekit_models.d.ts +59 -4
- package/dist/ts4.2/src/proto/livekit_rtc.d.ts +739 -120
- package/dist/ts4.2/src/room/PCTransport.d.ts +1 -0
- package/dist/ts4.2/src/room/RTCEngine.d.ts +2 -0
- 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/timers.d.ts +13 -0
- 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 +33 -21
- package/src/connectionHelper/ConnectionCheck.ts +1 -1
- package/src/index.ts +2 -0
- package/src/proto/google/protobuf/timestamp.ts +2 -2
- package/src/proto/livekit_models.ts +158 -10
- package/src/proto/livekit_rtc.ts +205 -6
- package/src/room/PCTransport.ts +22 -6
- package/src/room/RTCEngine.ts +58 -45
- package/src/room/Room.ts +8 -10
- package/src/room/errors.ts +6 -0
- package/src/room/participant/LocalParticipant.ts +12 -17
- package/src/room/participant/Participant.ts +10 -2
- package/src/room/timers.ts +16 -0
- package/src/room/track/RemoteVideoTrack.ts +2 -1
- package/src/room/track/create.ts +6 -1
- package/src/room/track/options.ts +2 -2
@@ -18,6 +18,7 @@ export default class PCTransport extends EventEmitter {
|
|
18
18
|
renegotiate: boolean;
|
19
19
|
trackBitrates: TrackBitrateInfo[];
|
20
20
|
remoteStereoMids: string[];
|
21
|
+
remoteNackMids: string[];
|
21
22
|
onOffer?: (offer: RTCSessionDescriptionInit) => void;
|
22
23
|
constructor(config?: RTCConfiguration);
|
23
24
|
get isICEConnected(): boolean;
|
@@ -54,6 +54,7 @@ export default class RTCEngine extends RTCEngine_base {
|
|
54
54
|
get dataSubscriberReadyState(): string | undefined;
|
55
55
|
get connectedServerAddress(): string | undefined;
|
56
56
|
private configure;
|
57
|
+
private makeRTCConfiguration;
|
57
58
|
private createDataChannels;
|
58
59
|
private handleDataChannel;
|
59
60
|
private handleDataMessage;
|
@@ -79,6 +80,7 @@ export default class RTCEngine extends RTCEngine_base {
|
|
79
80
|
/** @internal */
|
80
81
|
negotiate(): Promise<void>;
|
81
82
|
dataChannelForKind(kind: DataPacket_Kind, sub?: boolean): RTCDataChannel | undefined;
|
83
|
+
private clearReconnectTimeout;
|
82
84
|
private clearPendingReconnect;
|
83
85
|
private handleBrowserOnLine;
|
84
86
|
private registerOnLineListener;
|
@@ -204,7 +204,7 @@ export type RoomEventCallbacks = {
|
|
204
204
|
localTrackPublished: (publication: LocalTrackPublication, participant: LocalParticipant) => void;
|
205
205
|
localTrackUnpublished: (publication: LocalTrackPublication, participant: LocalParticipant) => void;
|
206
206
|
participantMetadataChanged: (metadata: string | undefined, participant: RemoteParticipant | LocalParticipant) => void;
|
207
|
-
participantPermissionsChanged: (prevPermissions: ParticipantPermission, participant: RemoteParticipant | LocalParticipant) => void;
|
207
|
+
participantPermissionsChanged: (prevPermissions: ParticipantPermission | undefined, participant: RemoteParticipant | LocalParticipant) => void;
|
208
208
|
activeSpeakersChanged: (speakers: Array<Participant>) => void;
|
209
209
|
roomMetadataChanged: (metadata: string) => void;
|
210
210
|
dataReceived: (payload: Uint8Array, participant?: RemoteParticipant, kind?: DataPacket_Kind) => void;
|
@@ -12,6 +12,9 @@ export declare class ConnectionError extends LivekitError {
|
|
12
12
|
reason?: ConnectionErrorReason;
|
13
13
|
constructor(message?: string, reason?: ConnectionErrorReason, status?: number);
|
14
14
|
}
|
15
|
+
export declare class DeviceUnsupportedError extends LivekitError {
|
16
|
+
constructor(message?: string);
|
17
|
+
}
|
15
18
|
export declare class TrackInvalidError extends LivekitError {
|
16
19
|
constructor(message?: string);
|
17
20
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import 'webrtc-adapter';
|
2
2
|
import type { InternalRoomOptions } from '../../options';
|
3
|
-
import { DataPacket_Kind, ParticipantInfo
|
3
|
+
import { DataPacket_Kind, ParticipantInfo } from '../../proto/livekit_models';
|
4
4
|
import { DataChannelInfo, TrackPublishedResponse } from '../../proto/livekit_rtc';
|
5
5
|
import type RTCEngine from '../RTCEngine';
|
6
6
|
import LocalTrack from '../track/LocalTrack';
|
@@ -52,8 +52,6 @@ export default class LocalParticipant extends Participant {
|
|
52
52
|
* Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise
|
53
53
|
*/
|
54
54
|
setScreenShareEnabled(enabled: boolean, options?: ScreenShareCaptureOptions, publishOptions?: TrackPublishOptions): Promise<LocalTrackPublication | undefined>;
|
55
|
-
/** @internal */
|
56
|
-
setPermissions(permissions: ParticipantPermission): boolean;
|
57
55
|
/**
|
58
56
|
* Enable or disable publishing for a track by source. This serves as a simple
|
59
57
|
* way to manage the common tracks (camera, mic, or screen share).
|
@@ -85,7 +85,7 @@ export type ParticipantEventCallbacks = {
|
|
85
85
|
trackStreamStateChanged: (publication: RemoteTrackPublication, streamState: Track.StreamState) => void;
|
86
86
|
trackSubscriptionPermissionChanged: (publication: RemoteTrackPublication, status: TrackPublication.PermissionStatus) => void;
|
87
87
|
mediaDevicesError: (error: Error) => void;
|
88
|
-
participantPermissionsChanged: (prevPermissions
|
88
|
+
participantPermissionsChanged: (prevPermissions?: ParticipantPermission) => void;
|
89
89
|
trackSubscriptionStatusChanged: (publication: RemoteTrackPublication, status: TrackPublication.SubscriptionStatus) => void;
|
90
90
|
};
|
91
91
|
export {};
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
/**
|
3
|
+
* Timers that can be overridden with platform specific implementations
|
4
|
+
* that ensure that they are fired. These should be used when it is critical
|
5
|
+
* that the timer fires on time.
|
6
|
+
*/
|
7
|
+
export default class CriticalTimers {
|
8
|
+
static setTimeout: (callback: (args: void) => void, ms?: number | undefined) => NodeJS.Timeout;
|
9
|
+
static setInterval: (callback: (args: void) => void, ms?: number | undefined) => NodeJS.Timer;
|
10
|
+
static clearTimeout: (timeoutId: NodeJS.Timeout) => void;
|
11
|
+
static clearInterval: (intervalId: NodeJS.Timeout) => void;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=timers.d.ts.map
|
@@ -187,8 +187,8 @@ declare const backupCodecs: readonly [
|
|
187
187
|
"vp8",
|
188
188
|
"h264"
|
189
189
|
];
|
190
|
-
export type VideoCodec = typeof codecs[number];
|
191
|
-
export type BackupVideoCodec = typeof backupCodecs[number];
|
190
|
+
export type VideoCodec = (typeof codecs)[number];
|
191
|
+
export type BackupVideoCodec = (typeof backupCodecs)[number];
|
192
192
|
export declare function isBackupCodec(codec: string): codec is BackupVideoCodec;
|
193
193
|
/**
|
194
194
|
* scalability modes for svc, only supprot l3t3 now.
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "livekit-client",
|
3
|
-
"version": "1.6.
|
3
|
+
"version": "1.6.4",
|
4
4
|
"description": "JavaScript/TypeScript client SDK for LiveKit",
|
5
5
|
"main": "./dist/livekit-client.umd.js",
|
6
6
|
"unpkg": "./dist/livekit-client.umd.js",
|
@@ -51,40 +51,40 @@
|
|
51
51
|
"webrtc-adapter": "^8.1.1"
|
52
52
|
},
|
53
53
|
"devDependencies": {
|
54
|
-
"@babel/core": "7.20.
|
54
|
+
"@babel/core": "7.20.12",
|
55
55
|
"@babel/preset-env": "7.20.2",
|
56
56
|
"@changesets/changelog-github": "0.4.8",
|
57
57
|
"@changesets/cli": "2.26.0",
|
58
58
|
"@rollup/plugin-babel": "6.0.3",
|
59
|
-
"@rollup/plugin-commonjs": "24.0.
|
59
|
+
"@rollup/plugin-commonjs": "24.0.1",
|
60
60
|
"@rollup/plugin-json": "6.0.0",
|
61
61
|
"@rollup/plugin-node-resolve": "15.0.1",
|
62
|
-
"@types/jest": "29.
|
62
|
+
"@types/jest": "29.4.0",
|
63
63
|
"@types/sdp-transform": "2.4.5",
|
64
64
|
"@types/ua-parser-js": "0.7.36",
|
65
65
|
"@types/ws": "8.5.4",
|
66
|
-
"@typescript-eslint/eslint-plugin": "5.
|
67
|
-
"@typescript-eslint/parser": "5.
|
66
|
+
"@typescript-eslint/eslint-plugin": "5.50.0",
|
67
|
+
"@typescript-eslint/parser": "5.50.0",
|
68
68
|
"downlevel-dts": "^0.11.0",
|
69
|
-
"eslint": "8.
|
69
|
+
"eslint": "8.33.0",
|
70
70
|
"eslint-config-airbnb-typescript": "17.0.0",
|
71
|
-
"eslint-config-prettier": "8.
|
72
|
-
"eslint-plugin-import": "2.
|
71
|
+
"eslint-config-prettier": "8.6.0",
|
72
|
+
"eslint-plugin-import": "2.27.5",
|
73
73
|
"gh-pages": "4.0.0",
|
74
|
-
"jest": "29.
|
75
|
-
"prettier": "2.8.
|
76
|
-
"rollup": "3.
|
74
|
+
"jest": "29.4.1",
|
75
|
+
"prettier": "2.8.3",
|
76
|
+
"rollup": "3.12.1",
|
77
77
|
"rollup-plugin-delete": "^2.0.0",
|
78
78
|
"rollup-plugin-filesize": "9.1.2",
|
79
79
|
"rollup-plugin-re": "1.0.7",
|
80
80
|
"rollup-plugin-terser": "7.0.2",
|
81
81
|
"rollup-plugin-typescript2": "0.34.1",
|
82
|
-
"ts-jest": "29.0.
|
83
|
-
"ts-proto": "1.
|
84
|
-
"typedoc": "0.23.
|
82
|
+
"ts-jest": "29.0.5",
|
83
|
+
"ts-proto": "1.139.0",
|
84
|
+
"typedoc": "0.23.24",
|
85
85
|
"typedoc-plugin-no-inherit": "1.4.0",
|
86
|
-
"typescript": "4.9.
|
87
|
-
"vite": "4.0.
|
86
|
+
"typescript": "4.9.5",
|
87
|
+
"vite": "4.0.4"
|
88
88
|
},
|
89
89
|
"browserslist": [
|
90
90
|
"safari >= 11",
|
package/src/api/SignalClient.ts
CHANGED
@@ -14,6 +14,7 @@ import {
|
|
14
14
|
ConnectionQualityUpdate,
|
15
15
|
JoinResponse,
|
16
16
|
LeaveRequest,
|
17
|
+
ReconnectResponse,
|
17
18
|
SessionDescription,
|
18
19
|
SignalRequest,
|
19
20
|
SignalResponse,
|
@@ -30,6 +31,7 @@ import {
|
|
30
31
|
UpdateTrackSettings,
|
31
32
|
} from '../proto/livekit_rtc';
|
32
33
|
import { ConnectionError, ConnectionErrorReason } from '../room/errors';
|
34
|
+
import CriticalTimers from '../room/timers';
|
33
35
|
import { getClientInfo, Mutex, sleep } from '../room/utils';
|
34
36
|
|
35
37
|
// internal options
|
@@ -164,7 +166,7 @@ export class SignalClient {
|
|
164
166
|
return res as JoinResponse;
|
165
167
|
}
|
166
168
|
|
167
|
-
async reconnect(url: string, token: string, sid?: string): Promise<void> {
|
169
|
+
async reconnect(url: string, token: string, sid?: string): Promise<ReconnectResponse | void> {
|
168
170
|
if (!this.options) {
|
169
171
|
log.warn('attempted to reconnect without signal options being set, ignoring');
|
170
172
|
return;
|
@@ -173,7 +175,8 @@ export class SignalClient {
|
|
173
175
|
// clear ping interval and restart it once reconnected
|
174
176
|
this.clearPingInterval();
|
175
177
|
|
176
|
-
await this.connect(url, token, { ...this.options, reconnect: true, sid });
|
178
|
+
const res = await this.connect(url, token, { ...this.options, reconnect: true, sid });
|
179
|
+
return res;
|
177
180
|
}
|
178
181
|
|
179
182
|
connect(
|
@@ -181,7 +184,7 @@ export class SignalClient {
|
|
181
184
|
token: string,
|
182
185
|
opts: ConnectOpts,
|
183
186
|
abortSignal?: AbortSignal,
|
184
|
-
): Promise<JoinResponse | void> {
|
187
|
+
): Promise<JoinResponse | ReconnectResponse | void> {
|
185
188
|
this.connectOptions = opts;
|
186
189
|
if (url.startsWith('http')) {
|
187
190
|
url = url.replace('http', 'ws');
|
@@ -193,7 +196,7 @@ export class SignalClient {
|
|
193
196
|
const clientInfo = getClientInfo();
|
194
197
|
const params = createConnectionParams(token, clientInfo, opts);
|
195
198
|
|
196
|
-
return new Promise<JoinResponse | void>(async (resolve, reject) => {
|
199
|
+
return new Promise<JoinResponse | ReconnectResponse | void>(async (resolve, reject) => {
|
197
200
|
const abortHandler = async () => {
|
198
201
|
await this.close();
|
199
202
|
reject(new ConnectionError('room connection has been cancelled'));
|
@@ -240,16 +243,6 @@ export class SignalClient {
|
|
240
243
|
this.handleWSError(ev);
|
241
244
|
};
|
242
245
|
|
243
|
-
this.ws.onopen = () => {
|
244
|
-
if (opts.reconnect) {
|
245
|
-
// upon reconnection, there will not be additional handshake
|
246
|
-
this.isConnected = true;
|
247
|
-
// restart ping interval as it's cleared for reconnection
|
248
|
-
this.startPingInterval();
|
249
|
-
resolve();
|
250
|
-
}
|
251
|
-
};
|
252
|
-
|
253
246
|
this.ws.onmessage = async (ev: MessageEvent) => {
|
254
247
|
// not considered connected until JoinResponse is received
|
255
248
|
let resp: SignalResponse;
|
@@ -264,6 +257,7 @@ export class SignalClient {
|
|
264
257
|
}
|
265
258
|
|
266
259
|
if (!this.isConnected) {
|
260
|
+
let shouldProcessMessage = false;
|
267
261
|
// handle join message only
|
268
262
|
if (resp.message?.$case === 'join') {
|
269
263
|
this.isConnected = true;
|
@@ -279,14 +273,28 @@ export class SignalClient {
|
|
279
273
|
this.startPingInterval();
|
280
274
|
}
|
281
275
|
resolve(resp.message.join);
|
282
|
-
} else {
|
276
|
+
} else if (opts.reconnect) {
|
277
|
+
// in reconnecting, any message received means signal reconnected
|
278
|
+
this.isConnected = true;
|
279
|
+
abortSignal?.removeEventListener('abort', abortHandler);
|
280
|
+
this.startPingInterval();
|
281
|
+
if (resp.message?.$case === 'reconnect') {
|
282
|
+
resolve(resp.message?.reconnect);
|
283
|
+
} else {
|
284
|
+
resolve();
|
285
|
+
shouldProcessMessage = true;
|
286
|
+
}
|
287
|
+
} else if (!opts.reconnect) {
|
288
|
+
// non-reconnect case, should receive join response first
|
283
289
|
reject(
|
284
290
|
new ConnectionError(
|
285
291
|
`did not receive join response, got ${resp.message?.$case} instead`,
|
286
292
|
),
|
287
293
|
);
|
288
294
|
}
|
289
|
-
|
295
|
+
if (!shouldProcessMessage) {
|
296
|
+
return;
|
297
|
+
}
|
290
298
|
}
|
291
299
|
|
292
300
|
if (this.signalLatency) {
|
@@ -485,7 +493,11 @@ export class SignalClient {
|
|
485
493
|
}
|
486
494
|
|
487
495
|
private handleSignalResponse(res: SignalResponse) {
|
488
|
-
const msg = res.message
|
496
|
+
const msg = res.message;
|
497
|
+
if (msg == undefined) {
|
498
|
+
log.debug('received unsupported message');
|
499
|
+
return;
|
500
|
+
}
|
489
501
|
if (msg.$case === 'answer') {
|
490
502
|
const sd = fromProtoSessionDescription(msg.answer);
|
491
503
|
if (this.onAnswer) {
|
@@ -576,7 +588,7 @@ export class SignalClient {
|
|
576
588
|
log.warn('ping timeout duration not set');
|
577
589
|
return;
|
578
590
|
}
|
579
|
-
this.pingTimeout = setTimeout(() => {
|
591
|
+
this.pingTimeout = CriticalTimers.setTimeout(() => {
|
580
592
|
log.warn(
|
581
593
|
`ping timeout triggered. last pong received at: ${new Date(
|
582
594
|
Date.now() - this.pingTimeoutDuration! * 1000,
|
@@ -590,7 +602,7 @@ export class SignalClient {
|
|
590
602
|
|
591
603
|
private clearPingTimeout() {
|
592
604
|
if (this.pingTimeout) {
|
593
|
-
clearTimeout(this.pingTimeout);
|
605
|
+
CriticalTimers.clearTimeout(this.pingTimeout);
|
594
606
|
}
|
595
607
|
}
|
596
608
|
|
@@ -602,7 +614,7 @@ export class SignalClient {
|
|
602
614
|
return;
|
603
615
|
}
|
604
616
|
log.debug('start ping interval');
|
605
|
-
this.pingInterval = setInterval(() => {
|
617
|
+
this.pingInterval = CriticalTimers.setInterval(() => {
|
606
618
|
this.sendPing();
|
607
619
|
}, this.pingIntervalDuration * 1000);
|
608
620
|
}
|
@@ -611,7 +623,7 @@ export class SignalClient {
|
|
611
623
|
log.debug('clearing ping interval');
|
612
624
|
this.clearPingTimeout();
|
613
625
|
if (this.pingInterval) {
|
614
|
-
clearInterval(this.pingInterval);
|
626
|
+
CriticalTimers.clearInterval(this.pingInterval);
|
615
627
|
}
|
616
628
|
}
|
617
629
|
}
|
@@ -9,7 +9,7 @@ import { TURNCheck } from './checks/turn';
|
|
9
9
|
import { WebRTCCheck } from './checks/webrtc';
|
10
10
|
import { WebSocketCheck } from './checks/websocket';
|
11
11
|
|
12
|
-
export type { CheckInfo };
|
12
|
+
export type { CheckInfo, CheckStatus };
|
13
13
|
|
14
14
|
export class ConnectionCheck extends (EventEmitter as new () => TypedEmitter<ConnectionCheckCallbacks>) {
|
15
15
|
token: string;
|
package/src/index.ts
CHANGED
@@ -16,6 +16,7 @@ import RemoteTrackPublication from './room/track/RemoteTrackPublication';
|
|
16
16
|
import RemoteVideoTrack from './room/track/RemoteVideoTrack';
|
17
17
|
import type { ElementInfo } from './room/track/RemoteVideoTrack';
|
18
18
|
import { TrackPublication } from './room/track/TrackPublication';
|
19
|
+
import CriticalTimers from './room/timers';
|
19
20
|
import {
|
20
21
|
getEmptyAudioStreamTrack,
|
21
22
|
getEmptyVideoStreamTrack,
|
@@ -71,4 +72,5 @@ export {
|
|
71
72
|
ConnectionQuality,
|
72
73
|
ElementInfo,
|
73
74
|
DefaultReconnectPolicy,
|
75
|
+
CriticalTimers,
|
74
76
|
};
|
@@ -172,7 +172,7 @@ export const Timestamp = {
|
|
172
172
|
declare var self: any | undefined;
|
173
173
|
declare var window: any | undefined;
|
174
174
|
declare var global: any | undefined;
|
175
|
-
var
|
175
|
+
var tsProtoGlobalThis: any = (() => {
|
176
176
|
if (typeof globalThis !== "undefined") {
|
177
177
|
return globalThis;
|
178
178
|
}
|
@@ -202,7 +202,7 @@ export type Exact<P, I extends P> = P extends Builtin ? P
|
|
202
202
|
|
203
203
|
function longToNumber(long: Long): number {
|
204
204
|
if (long.gt(Number.MAX_SAFE_INTEGER)) {
|
205
|
-
throw new
|
205
|
+
throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
|
206
206
|
}
|
207
207
|
return long.toNumber();
|
208
208
|
}
|