livekit-client 1.1.4 → 1.1.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 +77 -37
- 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/room/Room.d.ts +2 -1
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +6 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/room/Room.ts +73 -35
- package/src/room/utils.ts +15 -0
package/dist/src/room/Room.d.ts
CHANGED
@@ -55,6 +55,7 @@ declare class Room extends Room_base {
|
|
55
55
|
private audioContext?;
|
56
56
|
/** used for aborting pending connections to a LiveKit server */
|
57
57
|
private abortController?;
|
58
|
+
private connectFuture?;
|
58
59
|
/**
|
59
60
|
* Creates a new Room, the primary construct for a LiveKit session.
|
60
61
|
* @param options
|
@@ -70,7 +71,7 @@ declare class Room extends Room_base {
|
|
70
71
|
* @returns a list of available local devices
|
71
72
|
*/
|
72
73
|
static getLocalDevices(kind?: MediaDeviceKind, requestPermissions?: boolean): Promise<MediaDeviceInfo[]>;
|
73
|
-
connect: (url: string, token: string, opts?: RoomConnectOptions | undefined) => Promise<
|
74
|
+
connect: (url: string, token: string, opts?: RoomConnectOptions | undefined) => Promise<void>;
|
74
75
|
/**
|
75
76
|
* disconnects the room, emits [[RoomEvent.Disconnected]]
|
76
77
|
*/
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Room.d.ts","sourceRoot":"","sources":["../../../src/room/Room.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,eAAe,EAGf,qBAAqB,EAItB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,WAAW,EAAE,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,SAAmC,MAAM,aAAa,CAAC;AAG9D,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAElE,OAAO,sBAAsB,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAA0B,WAAW,EAAE,MAAM,eAAe,CAAC;AAIpE,oBAAY,eAAe;IACzB,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B;AAED,oEAAoE;AACpE,eAAO,MAAM,SAAS,wBAAkB,CAAC;mCAUK,aAAa,kBAAkB,CAAC;AAR9E;;;;;;;GAOG;AACH,cAAM,IAAK,SAAQ,SAA4D;IAC7E,KAAK,EAAE,eAAe,CAAgC;IAEtD,wCAAwC;IACxC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAE7C;;;OAGG;IACH,cAAc,EAAE,WAAW,EAAE,CAAM;IAEnC,gBAAgB;IAChB,MAAM,EAAG,SAAS,CAAC;IAGnB,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAM;IAEjB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAM;IAElB,8BAA8B;IAC9B,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,oBAAoB;IACpB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAa;IAEzC,sBAAsB;IACtB,OAAO,EAAE,WAAW,CAAC;IAErB,OAAO,CAAC,aAAa,CAAsB;IAE3C,8BAA8B;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAqB;IAEzC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,gEAAgE;IAChE,OAAO,CAAC,eAAe,CAAC,CAAkB;IAE1C;;;OAGG;gBACS,OAAO,CAAC,EAAE,WAAW;IAwBjC,OAAO,CAAC,YAAY;IAkDpB;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CACpB,IAAI,CAAC,EAAE,eAAe,EACtB,kBAAkB,GAAE,OAAc,GACjC,OAAO,CAAC,eAAe,EAAE,CAAC;IAI7B,OAAO,QAAe,MAAM,SAAS,MAAM,
|
1
|
+
{"version":3,"file":"Room.d.ts","sourceRoot":"","sources":["../../../src/room/Room.ts"],"names":[],"mappings":"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"}
|
package/dist/src/room/utils.d.ts
CHANGED
@@ -14,4 +14,10 @@ export interface ObservableMediaElement extends HTMLMediaElement {
|
|
14
14
|
export declare function getClientInfo(): ClientInfo;
|
15
15
|
export declare function getEmptyVideoStreamTrack(): MediaStreamTrack;
|
16
16
|
export declare function getEmptyAudioStreamTrack(): MediaStreamTrack;
|
17
|
+
export declare class Future<T> {
|
18
|
+
promise: Promise<T>;
|
19
|
+
resolve: (arg: T) => void;
|
20
|
+
reject: (e: any) => void;
|
21
|
+
constructor();
|
22
|
+
}
|
17
23
|
//# sourceMappingURL=utils.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/room/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,yBAAyB,CAAC;AAKrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAMvD;AAED,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAgB,SAAS,IAAI,OAAO,CAGnC;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAGlC;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAGlC;AAED,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAeD,eAAO,MAAM,iBAAiB,sBAG7B,CAAC;AAGF,eAAO,MAAM,uBAAuB,4BAOnC,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,YAAY,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnD,uBAAuB,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACrE;AAED,wBAAgB,aAAa,IAAI,UAAU,CAO1C;AAID,wBAAgB,wBAAwB,qBAgBvC;AAID,wBAAgB,wBAAwB,qBAevC"}
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/room/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,yBAAyB,CAAC;AAKrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAMvD;AAED,wBAAsB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAgB,SAAS,IAAI,OAAO,CAGnC;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAGlC;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAGlC;AAED,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAeD,eAAO,MAAM,iBAAiB,sBAG7B,CAAC;AAGF,eAAO,MAAM,uBAAuB,4BAOnC,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,YAAY,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnD,uBAAuB,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACrE;AAED,wBAAgB,aAAa,IAAI,UAAU,CAO1C;AAID,wBAAgB,wBAAwB,qBAgBvC;AAID,wBAAgB,wBAAwB,qBAevC;AAED,qBAAa,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpB,OAAO,EAAG,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAE3B,MAAM,EAAG,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;;CAQ3B"}
|
package/package.json
CHANGED
package/src/room/Room.ts
CHANGED
@@ -35,7 +35,7 @@ import { Track } from './track/Track';
|
|
35
35
|
import { TrackPublication } from './track/TrackPublication';
|
36
36
|
import { AdaptiveStreamSettings, RemoteTrack } from './track/types';
|
37
37
|
import { getNewAudioContext } from './track/utils';
|
38
|
-
import { isWeb, unpackStreamId } from './utils';
|
38
|
+
import { Future, isWeb, unpackStreamId } from './utils';
|
39
39
|
|
40
40
|
export enum ConnectionState {
|
41
41
|
Disconnected = 'disconnected',
|
@@ -98,6 +98,8 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
98
98
|
/** used for aborting pending connections to a LiveKit server */
|
99
99
|
private abortController?: AbortController;
|
100
100
|
|
101
|
+
private connectFuture?: Future<void>;
|
102
|
+
|
101
103
|
/**
|
102
104
|
* Creates a new Room, the primary construct for a LiveKit session.
|
103
105
|
* @param options
|
@@ -191,13 +193,16 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
191
193
|
return DeviceManager.getInstance().getDevices(kind, requestPermissions);
|
192
194
|
}
|
193
195
|
|
194
|
-
connect = async (url: string, token: string, opts?: RoomConnectOptions) => {
|
195
|
-
|
196
|
-
|
196
|
+
connect = async (url: string, token: string, opts?: RoomConnectOptions): Promise<void> => {
|
197
|
+
if (this.state === ConnectionState.Connected) {
|
198
|
+
// when the state is reconnecting or connected, this function returns immediately
|
197
199
|
log.warn(`already connected to room ${this.name}`);
|
198
200
|
return;
|
199
201
|
}
|
200
202
|
|
203
|
+
if (this.connectFuture) {
|
204
|
+
return this.connectFuture.promise;
|
205
|
+
}
|
201
206
|
this.setAndEmitConnectionState(ConnectionState.Connecting);
|
202
207
|
|
203
208
|
if (!this.abortController || this.abortController.signal.aborted) {
|
@@ -292,42 +297,51 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
292
297
|
this.emit(RoomEvent.SignalConnected);
|
293
298
|
} catch (err) {
|
294
299
|
this.recreateEngine();
|
295
|
-
this.setAndEmitConnectionState(
|
300
|
+
this.setAndEmitConnectionState(
|
301
|
+
ConnectionState.Disconnected,
|
302
|
+
new ConnectionError('could not establish signal connection'),
|
303
|
+
);
|
296
304
|
throw err;
|
297
305
|
}
|
298
306
|
|
299
307
|
// don't return until ICE connected
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
308
|
+
const connectTimeout = setTimeout(() => {
|
309
|
+
// timeout
|
310
|
+
this.recreateEngine();
|
311
|
+
this.setAndEmitConnectionState(
|
312
|
+
ConnectionState.Disconnected,
|
313
|
+
new ConnectionError('could not connect PeerConnection after timeout'),
|
314
|
+
);
|
315
|
+
}, maxICEConnectTimeout);
|
316
|
+
const abortHandler = () => {
|
317
|
+
log.warn('closing engine');
|
318
|
+
clearTimeout(connectTimeout);
|
319
|
+
this.recreateEngine();
|
320
|
+
this.setAndEmitConnectionState(
|
321
|
+
ConnectionState.Disconnected,
|
322
|
+
new ConnectionError('room connection has been cancelled'),
|
323
|
+
);
|
324
|
+
};
|
325
|
+
if (this.abortController?.signal.aborted) {
|
326
|
+
abortHandler();
|
327
|
+
}
|
328
|
+
this.abortController?.signal.addEventListener('abort', abortHandler);
|
329
|
+
|
330
|
+
this.engine.once(EngineEvent.Connected, () => {
|
331
|
+
clearTimeout(connectTimeout);
|
332
|
+
this.abortController?.signal.removeEventListener('abort', abortHandler);
|
333
|
+
// also hook unload event
|
334
|
+
if (isWeb()) {
|
335
|
+
window.addEventListener('beforeunload', this.onBeforeUnload);
|
336
|
+
navigator.mediaDevices?.addEventListener('devicechange', this.handleDeviceChange);
|
316
337
|
}
|
317
|
-
this.
|
318
|
-
|
319
|
-
this.engine.once(EngineEvent.Connected, () => {
|
320
|
-
clearTimeout(connectTimeout);
|
321
|
-
this.abortController?.signal.removeEventListener('abort', abortHandler);
|
322
|
-
// also hook unload event
|
323
|
-
if (isWeb()) {
|
324
|
-
window.addEventListener('beforeunload', this.onBeforeUnload);
|
325
|
-
navigator.mediaDevices?.addEventListener('devicechange', this.handleDeviceChange);
|
326
|
-
}
|
327
|
-
this.setAndEmitConnectionState(ConnectionState.Connected);
|
328
|
-
resolve(this);
|
329
|
-
});
|
338
|
+
this.setAndEmitConnectionState(ConnectionState.Connected);
|
330
339
|
});
|
340
|
+
|
341
|
+
if (this.connectFuture) {
|
342
|
+
/** @ts-ignore */
|
343
|
+
return this.connectFuture.promise;
|
344
|
+
}
|
331
345
|
};
|
332
346
|
|
333
347
|
/**
|
@@ -996,11 +1010,35 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
996
1010
|
}
|
997
1011
|
}
|
998
1012
|
|
999
|
-
private setAndEmitConnectionState(state: ConnectionState): boolean {
|
1013
|
+
private setAndEmitConnectionState(state: ConnectionState, error?: Error): boolean {
|
1000
1014
|
if (state === this.state) {
|
1001
1015
|
// unchanged
|
1002
1016
|
return false;
|
1003
1017
|
}
|
1018
|
+
switch (state) {
|
1019
|
+
case ConnectionState.Connecting:
|
1020
|
+
case ConnectionState.Reconnecting:
|
1021
|
+
if (!this.connectFuture) {
|
1022
|
+
// reuse existing connect future if possible
|
1023
|
+
this.connectFuture = new Future<void>();
|
1024
|
+
}
|
1025
|
+
break;
|
1026
|
+
case ConnectionState.Connected:
|
1027
|
+
if (this.connectFuture) {
|
1028
|
+
this.connectFuture.resolve();
|
1029
|
+
this.connectFuture = undefined;
|
1030
|
+
}
|
1031
|
+
break;
|
1032
|
+
case ConnectionState.Disconnected:
|
1033
|
+
if (this.connectFuture) {
|
1034
|
+
error ??= new Error('disconnected from Room');
|
1035
|
+
this.connectFuture.reject(error);
|
1036
|
+
this.connectFuture = undefined;
|
1037
|
+
}
|
1038
|
+
break;
|
1039
|
+
default:
|
1040
|
+
// nothing
|
1041
|
+
}
|
1004
1042
|
this.state = state;
|
1005
1043
|
this.emit(RoomEvent.ConnectionStateChanged, this.state);
|
1006
1044
|
return true;
|
package/src/room/utils.ts
CHANGED
@@ -114,3 +114,18 @@ export function getEmptyAudioStreamTrack() {
|
|
114
114
|
}
|
115
115
|
return emptyAudioStreamTrack;
|
116
116
|
}
|
117
|
+
|
118
|
+
export class Future<T> {
|
119
|
+
promise: Promise<T>;
|
120
|
+
|
121
|
+
resolve!: (arg: T) => void;
|
122
|
+
|
123
|
+
reject!: (e: any) => void;
|
124
|
+
|
125
|
+
constructor() {
|
126
|
+
this.promise = new Promise<T>((resolve, reject) => {
|
127
|
+
this.resolve = resolve;
|
128
|
+
this.reject = reject;
|
129
|
+
});
|
130
|
+
}
|
131
|
+
}
|