livekit-client 1.7.1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +20 -1
- package/dist/livekit-client.esm.mjs +2178 -1060
- 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/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.d.ts.map +1 -1
- package/dist/src/proto/livekit_models.d.ts +32 -0
- package/dist/src/proto/livekit_models.d.ts.map +1 -1
- package/dist/src/proto/livekit_rtc.d.ts +315 -75
- package/dist/src/proto/livekit_rtc.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +8 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/ReconnectPolicy.d.ts +1 -0
- package/dist/src/room/ReconnectPolicy.d.ts.map +1 -1
- package/dist/src/room/RegionUrlProvider.d.ts +14 -0
- package/dist/src/room/RegionUrlProvider.d.ts.map +1 -0
- package/dist/src/room/Room.d.ts +4 -0
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/errors.d.ts +2 -1
- package/dist/src/room/errors.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +8 -2
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrack.d.ts +3 -2
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteTrackPublication.d.ts +1 -1
- package/dist/src/room/track/RemoteTrackPublication.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +3 -1
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/types.d.ts +4 -0
- package/dist/src/room/types.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +4 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/index.d.ts +3 -1
- package/dist/ts4.2/src/proto/livekit_models.d.ts +32 -0
- package/dist/ts4.2/src/proto/livekit_rtc.d.ts +348 -84
- package/dist/ts4.2/src/room/RTCEngine.d.ts +8 -1
- package/dist/ts4.2/src/room/ReconnectPolicy.d.ts +1 -0
- package/dist/ts4.2/src/room/RegionUrlProvider.d.ts +14 -0
- package/dist/ts4.2/src/room/Room.d.ts +4 -0
- package/dist/ts4.2/src/room/errors.d.ts +2 -1
- package/dist/ts4.2/src/room/events.d.ts +8 -2
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +3 -2
- package/dist/ts4.2/src/room/track/RemoteTrackPublication.d.ts +1 -1
- package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/Track.d.ts +3 -1
- package/dist/ts4.2/src/room/types.d.ts +4 -0
- package/dist/ts4.2/src/room/utils.d.ts +4 -0
- package/package.json +19 -19
- package/src/api/SignalClient.ts +4 -4
- package/src/index.ts +3 -0
- package/src/proto/google/protobuf/timestamp.ts +15 -6
- package/src/proto/livekit_models.ts +903 -222
- package/src/proto/livekit_rtc.ts +1053 -279
- package/src/room/RTCEngine.ts +143 -40
- package/src/room/ReconnectPolicy.ts +2 -0
- package/src/room/RegionUrlProvider.ts +73 -0
- package/src/room/Room.ts +201 -132
- package/src/room/errors.ts +1 -0
- package/src/room/events.ts +7 -0
- package/src/room/track/LocalAudioTrack.ts +13 -6
- package/src/room/track/LocalTrack.ts +22 -8
- package/src/room/track/LocalVideoTrack.ts +12 -6
- package/src/room/track/RemoteTrackPublication.ts +4 -3
- package/src/room/track/RemoteVideoTrack.ts +5 -4
- package/src/room/track/Track.ts +46 -31
- package/src/room/types.ts +6 -0
- package/src/room/utils.ts +53 -0
@@ -21,6 +21,7 @@ export default class RTCEngine extends RTCEngine_base {
|
|
21
21
|
private lossyDC?;
|
22
22
|
private lossyDCSub?;
|
23
23
|
private reliableDC?;
|
24
|
+
private dcBufferStatus;
|
24
25
|
private reliableDCSub?;
|
25
26
|
private subscriberPrimary;
|
26
27
|
private primaryPC?;
|
@@ -46,6 +47,7 @@ export default class RTCEngine extends RTCEngine_base {
|
|
46
47
|
private closingLock;
|
47
48
|
private dataProcessLock;
|
48
49
|
private shouldFailNext;
|
50
|
+
private regionUrlProvider?;
|
49
51
|
constructor(options: InternalRoomOptions);
|
50
52
|
join(url: string, token: string, opts: SignalOptions, abortSignal?: AbortSignal): Promise<JoinResponse>;
|
51
53
|
close(): Promise<void>;
|
@@ -66,6 +68,7 @@ export default class RTCEngine extends RTCEngine_base {
|
|
66
68
|
private handleDataChannel;
|
67
69
|
private handleDataMessage;
|
68
70
|
private handleDataError;
|
71
|
+
private handleBufferedAmountLow;
|
69
72
|
private setPreferredCodec;
|
70
73
|
createSender(track: LocalTrack, opts: TrackPublishOptions, encodings?: RTCRtpEncodingParameters[]): Promise<RTCRtpSender>;
|
71
74
|
createSimulcastSender(track: LocalVideoTrack, simulcastTrack: SimulcastTrackInfo, opts: TrackPublishOptions, encodings?: RTCRtpEncodingParameters[]): Promise<RTCRtpSender | undefined>;
|
@@ -77,8 +80,11 @@ export default class RTCEngine extends RTCEngine_base {
|
|
77
80
|
private getNextRetryDelay;
|
78
81
|
private restartConnection;
|
79
82
|
private resumeConnection;
|
80
|
-
|
83
|
+
waitForPCInitialConnection(timeout?: number, abortController?: AbortController): Promise<void>;
|
84
|
+
waitForPCReconnected(): Promise<void>;
|
81
85
|
sendDataPacket(packet: DataPacket, kind: DataPacket_Kind): Promise<void>;
|
86
|
+
private updateAndEmitDCBufferStatus;
|
87
|
+
private isBufferStatusLow;
|
82
88
|
/**
|
83
89
|
* @internal
|
84
90
|
*/
|
@@ -107,6 +113,7 @@ export type EngineEventCallbacks = {
|
|
107
113
|
activeSpeakersUpdate: (speakers: Array<SpeakerInfo>) => void;
|
108
114
|
dataPacketReceived: (userPacket: UserPacket, kind: DataPacket_Kind) => void;
|
109
115
|
transportsCreated: (publisher: PCTransport, subscriber: PCTransport) => void;
|
116
|
+
dcBufferStatusChanged: (isLow: boolean, kind: DataPacket_Kind) => void;
|
110
117
|
};
|
111
118
|
export {};
|
112
119
|
//# sourceMappingURL=RTCEngine.d.ts.map
|
@@ -0,0 +1,14 @@
|
|
1
|
+
export declare class RegionUrlProvider {
|
2
|
+
private serverUrl;
|
3
|
+
private token;
|
4
|
+
private regionSettings;
|
5
|
+
private lastUpdateAt;
|
6
|
+
private settingsCacheTime;
|
7
|
+
private attemptedRegions;
|
8
|
+
constructor(url: string, token: string);
|
9
|
+
isCloud(): boolean;
|
10
|
+
getNextBestRegionUrl(abortSignal?: AbortSignal): Promise<string | null>;
|
11
|
+
resetAttempts(): void;
|
12
|
+
private fetchRegionSettings;
|
13
|
+
}
|
14
|
+
//# sourceMappingURL=RegionUrlProvider.d.ts.map
|
@@ -86,6 +86,9 @@ declare class Room extends Room_base {
|
|
86
86
|
*/
|
87
87
|
prepareConnection(url: string): Promise<void>;
|
88
88
|
connect: (url: string, token: string, opts?: RoomConnectOptions) => Promise<void>;
|
89
|
+
private connectSignal;
|
90
|
+
private applyJoinResponse;
|
91
|
+
private attemptConnection;
|
89
92
|
/**
|
90
93
|
* disconnects the room, emits [[RoomEvent.Disconnected]]
|
91
94
|
*/
|
@@ -217,5 +220,6 @@ export type RoomEventCallbacks = {
|
|
217
220
|
audioPlaybackChanged: (playing: boolean) => void;
|
218
221
|
signalConnected: () => void;
|
219
222
|
recordingStatusChanged: (recording: boolean) => void;
|
223
|
+
dcBufferStatusChanged: (isLow: boolean, kind: DataPacket_Kind) => void;
|
220
224
|
};
|
221
225
|
//# sourceMappingURL=Room.d.ts.map
|
@@ -5,7 +5,8 @@ export declare class LivekitError extends Error {
|
|
5
5
|
export declare const enum ConnectionErrorReason {
|
6
6
|
NotAllowed = 0,
|
7
7
|
ServerUnreachable = 1,
|
8
|
-
InternalError = 2
|
8
|
+
InternalError = 2,
|
9
|
+
Cancelled = 3
|
9
10
|
}
|
10
11
|
export declare class ConnectionError extends LivekitError {
|
11
12
|
status?: number;
|
@@ -231,7 +231,12 @@ export declare enum RoomEvent {
|
|
231
231
|
* Recording of a room has started/stopped. Room.isRecording will be updated too.
|
232
232
|
* args: (isRecording: boolean)
|
233
233
|
*/
|
234
|
-
RecordingStatusChanged = "recordingStatusChanged"
|
234
|
+
RecordingStatusChanged = "recordingStatusChanged",
|
235
|
+
/**
|
236
|
+
* Emits whenever the current buffer status of a data channel changes
|
237
|
+
* args: (isLow: boolean, kind: [[DataPacket_Kind]])
|
238
|
+
*/
|
239
|
+
DCBufferStatusChanged = "dcBufferStatusChanged"
|
235
240
|
}
|
236
241
|
export declare enum ParticipantEvent {
|
237
242
|
/**
|
@@ -378,7 +383,8 @@ export declare enum EngineEvent {
|
|
378
383
|
Closing = "closing",
|
379
384
|
MediaTrackAdded = "mediaTrackAdded",
|
380
385
|
ActiveSpeakersUpdate = "activeSpeakersUpdate",
|
381
|
-
DataPacketReceived = "dataPacketReceived"
|
386
|
+
DataPacketReceived = "dataPacketReceived",
|
387
|
+
DCBufferStatusChanged = "dcBufferStatusChanged"
|
382
388
|
}
|
383
389
|
export declare enum TrackEvent {
|
384
390
|
Message = "message",
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import
|
1
|
+
import { Mutex } from '../utils';
|
2
2
|
import type { VideoCodec } from './options';
|
3
3
|
import { Track } from './Track';
|
4
4
|
export default abstract class LocalTrack extends Track {
|
@@ -9,7 +9,8 @@ export default abstract class LocalTrack extends Track {
|
|
9
9
|
protected constraints: MediaTrackConstraints;
|
10
10
|
protected reacquireTrack: boolean;
|
11
11
|
protected providedByUser: boolean;
|
12
|
-
protected
|
12
|
+
protected muteLock: Mutex;
|
13
|
+
protected pauseUpstreamLock: Mutex;
|
13
14
|
/**
|
14
15
|
*
|
15
16
|
* @param mediaTrack
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { TrackInfo, VideoQuality } from '../../proto/livekit_models';
|
2
2
|
import type RemoteTrack from './RemoteTrack';
|
3
|
-
import
|
3
|
+
import { Track } from './Track';
|
4
4
|
import { TrackPublication } from './TrackPublication';
|
5
5
|
export default class RemoteTrackPublication extends TrackPublication {
|
6
6
|
track?: RemoteTrack;
|
@@ -6,7 +6,7 @@ export default class RemoteVideoTrack extends RemoteTrack {
|
|
6
6
|
private adaptiveStreamSettings?;
|
7
7
|
private lastVisible?;
|
8
8
|
private lastDimensions?;
|
9
|
-
private
|
9
|
+
private isObserved;
|
10
10
|
constructor(mediaTrack: MediaStreamTrack, sid: string, receiver?: RTCRtpReceiver, adaptiveStreamSettings?: AdaptiveStreamSettings);
|
11
11
|
get isAdaptiveStream(): boolean;
|
12
12
|
get mediaStreamTrack(): MediaStreamTrack;
|
@@ -58,10 +58,12 @@ export declare abstract class Track extends Track_base {
|
|
58
58
|
protected enable(): void;
|
59
59
|
protected disable(): void;
|
60
60
|
abstract startMonitor(signalClient?: SignalClient): void;
|
61
|
-
|
61
|
+
stopMonitor(): void;
|
62
62
|
private recycleElement;
|
63
63
|
protected appVisibilityChangedListener: () => void;
|
64
64
|
protected handleAppVisibilityChanged(): Promise<void>;
|
65
|
+
protected addAppVisibilityListener(): void;
|
66
|
+
protected removeAppVisibilityListener(): void;
|
65
67
|
}
|
66
68
|
/** @internal */
|
67
69
|
export declare function attachToElement(track: MediaStreamTrack, element: HTMLMediaElement): void;
|
@@ -18,4 +18,8 @@ export type DataPublishOptions = {
|
|
18
18
|
/** the topic under which the message gets published */
|
19
19
|
topic?: string;
|
20
20
|
};
|
21
|
+
export type LiveKitReactNativeInfo = {
|
22
|
+
platform: 'ios' | 'android' | 'windows' | 'macos' | 'web' | 'native';
|
23
|
+
devicePixelRatio: number;
|
24
|
+
};
|
21
25
|
//# sourceMappingURL=types.d.ts.map
|
@@ -17,6 +17,10 @@ export declare function isFireFox(): boolean;
|
|
17
17
|
export declare function isSafari(): boolean;
|
18
18
|
export declare function isMobile(): boolean;
|
19
19
|
export declare function isWeb(): boolean;
|
20
|
+
export declare function isReactNative(): boolean;
|
21
|
+
export declare function isCloud(serverUrl: URL): boolean;
|
22
|
+
export declare function getReactNativeOs(): string | undefined;
|
23
|
+
export declare function getDevicePixelRatio(): number;
|
20
24
|
export declare function compareVersions(v1: string, v2: string): number;
|
21
25
|
export declare const getResizeObserver: () => ResizeObserver;
|
22
26
|
export declare const getIntersectionObserver: () => IntersectionObserver;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "livekit-client",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.8.0",
|
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.21.
|
55
|
-
"@babel/preset-env": "7.
|
54
|
+
"@babel/core": "7.21.4",
|
55
|
+
"@babel/preset-env": "7.21.4",
|
56
56
|
"@changesets/changelog-github": "0.4.8",
|
57
|
-
"@changesets/cli": "2.26.
|
57
|
+
"@changesets/cli": "2.26.1",
|
58
58
|
"@rollup/plugin-babel": "6.0.3",
|
59
|
-
"@rollup/plugin-commonjs": "24.0
|
59
|
+
"@rollup/plugin-commonjs": "24.1.0",
|
60
60
|
"@rollup/plugin-json": "6.0.0",
|
61
|
-
"@rollup/plugin-node-resolve": "15.0.
|
61
|
+
"@rollup/plugin-node-resolve": "15.0.2",
|
62
62
|
"@rollup/plugin-terser": "^0.4.0",
|
63
|
-
"@types/jest": "29.
|
64
|
-
"@types/sdp-transform": "2.4.
|
63
|
+
"@types/jest": "29.5.0",
|
64
|
+
"@types/sdp-transform": "2.4.6",
|
65
65
|
"@types/ua-parser-js": "0.7.36",
|
66
66
|
"@types/ws": "8.5.4",
|
67
|
-
"@typescript-eslint/eslint-plugin": "5.
|
68
|
-
"@typescript-eslint/parser": "5.
|
67
|
+
"@typescript-eslint/eslint-plugin": "5.58.0",
|
68
|
+
"@typescript-eslint/parser": "5.58.0",
|
69
69
|
"downlevel-dts": "^0.11.0",
|
70
|
-
"eslint": "8.
|
70
|
+
"eslint": "8.38.0",
|
71
71
|
"eslint-config-airbnb-typescript": "17.0.0",
|
72
|
-
"eslint-config-prettier": "8.
|
72
|
+
"eslint-config-prettier": "8.8.0",
|
73
73
|
"eslint-plugin-import": "2.27.5",
|
74
74
|
"gh-pages": "5.0.0",
|
75
|
-
"jest": "29.
|
76
|
-
"prettier": "2.8.
|
77
|
-
"rollup": "3.
|
75
|
+
"jest": "29.5.0",
|
76
|
+
"prettier": "2.8.7",
|
77
|
+
"rollup": "3.20.2",
|
78
78
|
"rollup-plugin-delete": "^2.0.0",
|
79
79
|
"rollup-plugin-filesize": "10.0.0",
|
80
80
|
"rollup-plugin-re": "1.0.7",
|
81
81
|
"rollup-plugin-typescript2": "0.34.1",
|
82
|
-
"ts-jest": "29.0
|
83
|
-
"ts-proto": "1.
|
84
|
-
"typedoc": "0.
|
82
|
+
"ts-jest": "29.1.0",
|
83
|
+
"ts-proto": "1.146.0",
|
84
|
+
"typedoc": "0.24.1",
|
85
85
|
"typedoc-plugin-no-inherit": "1.4.0",
|
86
86
|
"typescript": "4.9.5",
|
87
|
-
"vite": "4.1
|
87
|
+
"vite": "4.2.1"
|
88
88
|
},
|
89
89
|
"browserslist": [
|
90
90
|
"safari >= 11",
|
package/src/api/SignalClient.ts
CHANGED
@@ -33,7 +33,7 @@ import {
|
|
33
33
|
} from '../proto/livekit_rtc';
|
34
34
|
import { ConnectionError, ConnectionErrorReason } from '../room/errors';
|
35
35
|
import CriticalTimers from '../room/timers';
|
36
|
-
import { getClientInfo, Mutex, sleep } from '../room/utils';
|
36
|
+
import { getClientInfo, isReactNative, Mutex, sleep } from '../room/utils';
|
37
37
|
|
38
38
|
// internal options
|
39
39
|
interface ConnectOpts {
|
@@ -216,7 +216,7 @@ export class SignalClient {
|
|
216
216
|
return new Promise<JoinResponse | ReconnectResponse | void>(async (resolve, reject) => {
|
217
217
|
const abortHandler = async () => {
|
218
218
|
await this.close();
|
219
|
-
reject(new ConnectionError('room connection has been cancelled'));
|
219
|
+
reject(new ConnectionError('room connection has been cancelled (signal)'));
|
220
220
|
};
|
221
221
|
|
222
222
|
if (abortSignal?.aborted) {
|
@@ -234,7 +234,7 @@ export class SignalClient {
|
|
234
234
|
if (!this.isConnected) {
|
235
235
|
try {
|
236
236
|
const resp = await fetch(`http${url.substring(2)}/validate${params}`);
|
237
|
-
if (
|
237
|
+
if (resp.status.toFixed(0).startsWith('4')) {
|
238
238
|
const msg = await resp.text();
|
239
239
|
reject(new ConnectionError(msg, ConnectionErrorReason.NotAllowed, resp.status));
|
240
240
|
} else {
|
@@ -706,7 +706,7 @@ function createConnectionParams(token: string, info: ClientInfo, opts: ConnectOp
|
|
706
706
|
params.set('auto_subscribe', opts.autoSubscribe ? '1' : '0');
|
707
707
|
|
708
708
|
// ClientInfo
|
709
|
-
params.set('sdk', 'js');
|
709
|
+
params.set('sdk', isReactNative() ? 'reactnative' : 'js');
|
710
710
|
params.set('version', info.version!);
|
711
711
|
params.set('protocol', info.protocol!.toString());
|
712
712
|
if (info.deviceModel) {
|
package/src/index.ts
CHANGED
@@ -28,10 +28,12 @@ import {
|
|
28
28
|
} from './room/utils';
|
29
29
|
|
30
30
|
import type { AudioAnalyserOptions } from './room/utils';
|
31
|
+
import type { LiveKitReactNativeInfo } from './room/types';
|
31
32
|
|
32
33
|
export * from './options';
|
33
34
|
export * from './room/errors';
|
34
35
|
export * from './room/events';
|
36
|
+
export type { DataPublishOptions } from './room/types';
|
35
37
|
export * from './room/track/create';
|
36
38
|
export * from './room/track/options';
|
37
39
|
export * from './room/track/Track';
|
@@ -73,4 +75,5 @@ export {
|
|
73
75
|
ElementInfo,
|
74
76
|
DefaultReconnectPolicy,
|
75
77
|
CriticalTimers,
|
78
|
+
LiveKitReactNativeInfo,
|
76
79
|
};
|
@@ -127,22 +127,31 @@ export const Timestamp = {
|
|
127
127
|
},
|
128
128
|
|
129
129
|
decode(input: _m0.Reader | Uint8Array, length?: number): Timestamp {
|
130
|
-
const reader = input instanceof _m0.Reader ? input :
|
130
|
+
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
|
131
131
|
let end = length === undefined ? reader.len : reader.pos + length;
|
132
132
|
const message = createBaseTimestamp();
|
133
133
|
while (reader.pos < end) {
|
134
134
|
const tag = reader.uint32();
|
135
135
|
switch (tag >>> 3) {
|
136
136
|
case 1:
|
137
|
+
if (tag != 8) {
|
138
|
+
break;
|
139
|
+
}
|
140
|
+
|
137
141
|
message.seconds = longToNumber(reader.int64() as Long);
|
138
|
-
|
142
|
+
continue;
|
139
143
|
case 2:
|
144
|
+
if (tag != 16) {
|
145
|
+
break;
|
146
|
+
}
|
147
|
+
|
140
148
|
message.nanos = reader.int32();
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
149
|
+
continue;
|
150
|
+
}
|
151
|
+
if ((tag & 7) == 4 || tag == 0) {
|
152
|
+
break;
|
145
153
|
}
|
154
|
+
reader.skipType(tag & 7);
|
146
155
|
}
|
147
156
|
return message;
|
148
157
|
},
|