livekit-client 1.5.0 → 1.6.0
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 +2031 -5393
- 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 -2
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -1
- package/dist/src/connectionHelper/checks/Checker.d.ts +4 -4
- package/dist/src/connectionHelper/checks/Checker.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/logger.d.ts +3 -3
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/options.d.ts +4 -1
- package/dist/src/options.d.ts.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.d.ts +4 -4
- package/dist/src/proto/google/protobuf/timestamp.d.ts.map +1 -1
- package/dist/src/proto/livekit_models.d.ts +4 -4
- package/dist/src/proto/livekit_models.d.ts.map +1 -1
- package/dist/src/proto/livekit_rtc.d.ts +4 -4
- package/dist/src/proto/livekit_rtc.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +4 -3
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +21 -4
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +4 -0
- package/dist/src/room/events.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/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +2 -1
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/track/TrackPublication.d.ts +1 -1
- package/dist/src/room/track/TrackPublication.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +3 -3
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/track/types.d.ts +3 -3
- package/dist/src/room/track/types.d.ts.map +1 -1
- package/dist/src/room/types.d.ts +13 -0
- package/dist/src/room/types.d.ts.map +1 -0
- package/dist/src/room/utils.d.ts +44 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/api/SignalClient.d.ts +3 -2
- package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +1 -1
- package/dist/ts4.2/src/connectionHelper/checks/Checker.d.ts +4 -4
- package/dist/ts4.2/src/index.d.ts +3 -2
- package/dist/ts4.2/src/logger.d.ts +3 -3
- package/dist/ts4.2/src/options.d.ts +4 -1
- package/dist/ts4.2/src/proto/google/protobuf/timestamp.d.ts +4 -4
- package/dist/ts4.2/src/proto/livekit_models.d.ts +4 -4
- package/dist/ts4.2/src/proto/livekit_rtc.d.ts +4 -4
- package/dist/ts4.2/src/room/RTCEngine.d.ts +4 -3
- package/dist/ts4.2/src/room/Room.d.ts +21 -4
- package/dist/ts4.2/src/room/events.d.ts +4 -0
- package/dist/ts4.2/src/room/participant/Participant.d.ts +1 -1
- package/dist/ts4.2/src/room/track/Track.d.ts +2 -1
- package/dist/ts4.2/src/room/track/TrackPublication.d.ts +1 -1
- package/dist/ts4.2/src/room/track/options.d.ts +3 -3
- package/dist/ts4.2/src/room/track/types.d.ts +3 -3
- package/dist/ts4.2/src/room/types.d.ts +13 -0
- package/dist/ts4.2/src/room/utils.d.ts +44 -0
- package/package.json +21 -21
- package/src/api/SignalClient.ts +40 -16
- package/src/connectionHelper/checks/turn.ts +1 -1
- package/src/connectionHelper/checks/websocket.ts +1 -1
- package/src/index.ts +5 -0
- package/src/options.ts +5 -1
- package/src/room/RTCEngine.ts +35 -26
- package/src/room/Room.ts +209 -61
- package/src/room/events.ts +4 -0
- package/src/room/participant/LocalParticipant.ts +3 -3
- package/src/room/participant/publishUtils.ts +1 -1
- package/src/room/track/LocalAudioTrack.ts +1 -1
- package/src/room/track/LocalTrack.ts +1 -0
- package/src/room/track/LocalVideoTrack.ts +1 -1
- package/src/room/track/RemoteVideoTrack.ts +4 -0
- package/src/room/track/Track.ts +1 -0
- package/src/room/types.ts +12 -0
- package/src/room/utils.ts +150 -12
@@ -1,4 +1,6 @@
|
|
1
1
|
import { ClientInfo } from '../proto/livekit_models';
|
2
|
+
import type LocalAudioTrack from './track/LocalAudioTrack';
|
3
|
+
import type RemoteAudioTrack from './track/RemoteAudioTrack';
|
2
4
|
export declare function unpackStreamId(packed: string): string[];
|
3
5
|
export declare function sleep(duration: number): Promise<void>;
|
4
6
|
/** @internal */
|
@@ -24,6 +26,7 @@ export interface ObservableMediaElement extends HTMLMediaElement {
|
|
24
26
|
}
|
25
27
|
export declare function getClientInfo(): ClientInfo;
|
26
28
|
export declare function getEmptyVideoStreamTrack(): MediaStreamTrack;
|
29
|
+
export declare function createDummyVideoStreamTrack(width?: number, height?: number, enabled?: boolean, paintContent?: boolean): MediaStreamTrack;
|
27
30
|
export declare function getEmptyAudioStreamTrack(): MediaStreamTrack;
|
28
31
|
export declare class Future<T> {
|
29
32
|
promise: Promise<T>;
|
@@ -32,4 +35,45 @@ export declare class Future<T> {
|
|
32
35
|
onFinally?: () => void;
|
33
36
|
constructor(futureBase?: (resolve: (arg: T) => void, reject: (e: any) => void) => void, onFinally?: () => void);
|
34
37
|
}
|
38
|
+
export type AudioAnalyserOptions = {
|
39
|
+
/**
|
40
|
+
* If set to true, the analyser will use a cloned version of the underlying mediastreamtrack, which won't be impacted by muting the track.
|
41
|
+
* Useful for local tracks when implementing things like "seems like you're muted, but trying to speak".
|
42
|
+
* Defaults to false
|
43
|
+
*/
|
44
|
+
cloneTrack?: boolean;
|
45
|
+
/**
|
46
|
+
* see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize
|
47
|
+
*/
|
48
|
+
fftSize?: number;
|
49
|
+
/**
|
50
|
+
* see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/smoothingTimeConstant
|
51
|
+
*/
|
52
|
+
smoothingTimeConstant?: number;
|
53
|
+
/**
|
54
|
+
* see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/minDecibels
|
55
|
+
*/
|
56
|
+
minDecibels?: number;
|
57
|
+
/**
|
58
|
+
* see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/maxDecibels
|
59
|
+
*/
|
60
|
+
maxDecibels?: number;
|
61
|
+
};
|
62
|
+
/**
|
63
|
+
* Creates and returns an analyser web audio node that is attached to the provided track.
|
64
|
+
* Additionally returns a convenience method `calculateVolume` to perform instant volume readings on that track.
|
65
|
+
* Call the returned `cleanup` function to close the audioContext that has been created for the instance of this helper
|
66
|
+
*/
|
67
|
+
export declare function createAudioAnalyser(track: LocalAudioTrack | RemoteAudioTrack, options?: AudioAnalyserOptions): {
|
68
|
+
calculateVolume: () => number;
|
69
|
+
analyser: AnalyserNode;
|
70
|
+
cleanup: () => void;
|
71
|
+
};
|
72
|
+
export declare class Mutex {
|
73
|
+
private _locking;
|
74
|
+
private _locks;
|
75
|
+
constructor();
|
76
|
+
isLocked(): boolean;
|
77
|
+
lock(): Promise<() => void>;
|
78
|
+
}
|
35
79
|
//# sourceMappingURL=utils.d.ts.map
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "livekit-client",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.6.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",
|
@@ -26,7 +26,7 @@
|
|
26
26
|
"author": "David Zhao <david@davidzhao.com>",
|
27
27
|
"license": "Apache-2.0",
|
28
28
|
"scripts": {
|
29
|
-
"build": "rollup --config && yarn downlevel-dts",
|
29
|
+
"build": "rollup --config --bundleConfigAsCjs && yarn downlevel-dts",
|
30
30
|
"build:watch": "rollup --watch --config rollup.config.js",
|
31
31
|
"build-docs": "typedoc",
|
32
32
|
"proto": "protoc --plugin=node_modules/ts-proto/protoc-gen-ts_proto --ts_proto_opt=esModuleInterop=true --ts_proto_out=./src/proto --ts_proto_opt=outputClientImpl=false,useOptionals=messages,oneof=unions -I./protocol ./protocol/livekit_rtc.proto ./protocol/livekit_models.proto",
|
@@ -51,40 +51,40 @@
|
|
51
51
|
"webrtc-adapter": "^8.1.1"
|
52
52
|
},
|
53
53
|
"devDependencies": {
|
54
|
-
"@babel/core": "7.
|
55
|
-
"@babel/preset-env": "7.
|
54
|
+
"@babel/core": "7.20.5",
|
55
|
+
"@babel/preset-env": "7.20.2",
|
56
56
|
"@changesets/changelog-github": "0.4.7",
|
57
|
-
"@changesets/cli": "2.25.
|
58
|
-
"@rollup/plugin-babel": "
|
59
|
-
"@rollup/plugin-commonjs": "
|
60
|
-
"@rollup/plugin-json": "
|
61
|
-
"@rollup/plugin-node-resolve": "
|
62
|
-
"@types/jest": "29.
|
57
|
+
"@changesets/cli": "2.25.2",
|
58
|
+
"@rollup/plugin-babel": "6.0.3",
|
59
|
+
"@rollup/plugin-commonjs": "23.0.4",
|
60
|
+
"@rollup/plugin-json": "5.0.2",
|
61
|
+
"@rollup/plugin-node-resolve": "15.0.1",
|
62
|
+
"@types/jest": "29.2.4",
|
63
63
|
"@types/sdp-transform": "2.4.5",
|
64
64
|
"@types/ua-parser-js": "0.7.36",
|
65
65
|
"@types/ws": "8.5.3",
|
66
|
-
"@typescript-eslint/eslint-plugin": "5.
|
67
|
-
"@typescript-eslint/parser": "5.
|
66
|
+
"@typescript-eslint/eslint-plugin": "5.46.0",
|
67
|
+
"@typescript-eslint/parser": "5.46.0",
|
68
68
|
"downlevel-dts": "^0.11.0",
|
69
|
-
"eslint": "8.
|
69
|
+
"eslint": "8.29.0",
|
70
70
|
"eslint-config-airbnb-typescript": "17.0.0",
|
71
71
|
"eslint-config-prettier": "8.5.0",
|
72
72
|
"eslint-plugin-import": "2.26.0",
|
73
73
|
"gh-pages": "4.0.0",
|
74
|
-
"jest": "29.1
|
75
|
-
"prettier": "2.
|
76
|
-
"rollup": "
|
74
|
+
"jest": "29.3.1",
|
75
|
+
"prettier": "2.8.1",
|
76
|
+
"rollup": "3.7.0",
|
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
|
-
"rollup-plugin-typescript2": "0.34.
|
81
|
+
"rollup-plugin-typescript2": "0.34.1",
|
82
82
|
"ts-jest": "29.0.3",
|
83
|
-
"ts-proto": "1.
|
84
|
-
"typedoc": "0.23.
|
83
|
+
"ts-proto": "1.135.0",
|
84
|
+
"typedoc": "0.23.21",
|
85
85
|
"typedoc-plugin-no-inherit": "1.4.0",
|
86
|
-
"typescript": "4.
|
87
|
-
"vite": "3.
|
86
|
+
"typescript": "4.9.4",
|
87
|
+
"vite": "3.2.5"
|
88
88
|
},
|
89
89
|
"browserslist": [
|
90
90
|
"safari >= 11",
|
package/src/api/SignalClient.ts
CHANGED
@@ -30,7 +30,7 @@ import {
|
|
30
30
|
UpdateTrackSettings,
|
31
31
|
} from '../proto/livekit_rtc';
|
32
32
|
import { ConnectionError, ConnectionErrorReason } from '../room/errors';
|
33
|
-
import { getClientInfo, sleep } from '../room/utils';
|
33
|
+
import { getClientInfo, Mutex, sleep } from '../room/utils';
|
34
34
|
|
35
35
|
// internal options
|
36
36
|
interface ConnectOpts {
|
@@ -139,12 +139,15 @@ export class SignalClient {
|
|
139
139
|
|
140
140
|
private pingInterval: ReturnType<typeof setInterval> | undefined;
|
141
141
|
|
142
|
+
private closingLock: Mutex;
|
143
|
+
|
142
144
|
constructor(useJSON: boolean = false) {
|
143
145
|
this.isConnected = false;
|
144
146
|
this.isReconnecting = false;
|
145
147
|
this.useJSON = useJSON;
|
146
148
|
this.requestQueue = new Queue();
|
147
149
|
this.queuedRequests = [];
|
150
|
+
this.closingLock = new Mutex();
|
148
151
|
}
|
149
152
|
|
150
153
|
async join(
|
@@ -190,9 +193,9 @@ export class SignalClient {
|
|
190
193
|
const clientInfo = getClientInfo();
|
191
194
|
const params = createConnectionParams(token, clientInfo, opts);
|
192
195
|
|
193
|
-
return new Promise<JoinResponse | void>((resolve, reject) => {
|
194
|
-
const abortHandler = () => {
|
195
|
-
this.close();
|
196
|
+
return new Promise<JoinResponse | void>(async (resolve, reject) => {
|
197
|
+
const abortHandler = async () => {
|
198
|
+
await this.close();
|
196
199
|
reject(new ConnectionError('room connection has been cancelled'));
|
197
200
|
};
|
198
201
|
|
@@ -202,7 +205,7 @@ export class SignalClient {
|
|
202
205
|
abortSignal?.addEventListener('abort', abortHandler);
|
203
206
|
log.debug(`connecting to ${url + params}`);
|
204
207
|
if (this.ws) {
|
205
|
-
this.close();
|
208
|
+
await this.close();
|
206
209
|
}
|
207
210
|
this.ws = new WebSocket(url + params);
|
208
211
|
this.ws.binaryType = 'arraybuffer';
|
@@ -277,7 +280,11 @@ export class SignalClient {
|
|
277
280
|
}
|
278
281
|
resolve(resp.message.join);
|
279
282
|
} else {
|
280
|
-
reject(
|
283
|
+
reject(
|
284
|
+
new ConnectionError(
|
285
|
+
`did not receive join response, got ${resp.message?.$case} instead`,
|
286
|
+
),
|
287
|
+
);
|
281
288
|
}
|
282
289
|
return;
|
283
290
|
}
|
@@ -301,16 +308,33 @@ export class SignalClient {
|
|
301
308
|
});
|
302
309
|
}
|
303
310
|
|
304
|
-
close() {
|
305
|
-
|
306
|
-
|
307
|
-
this.
|
308
|
-
this.ws
|
309
|
-
|
310
|
-
|
311
|
+
async close() {
|
312
|
+
const unlock = await this.closingLock.lock();
|
313
|
+
try {
|
314
|
+
this.isConnected = false;
|
315
|
+
if (this.ws) {
|
316
|
+
this.ws.onclose = null;
|
317
|
+
this.ws.onmessage = null;
|
318
|
+
this.ws.onopen = null;
|
319
|
+
|
320
|
+
// calling `ws.close()` only starts the closing handshake (CLOSING state), prefer to wait until state is actually CLOSED
|
321
|
+
const closePromise = new Promise((resolve) => {
|
322
|
+
if (this.ws) {
|
323
|
+
this.ws.onclose = resolve;
|
324
|
+
} else {
|
325
|
+
resolve(true);
|
326
|
+
}
|
327
|
+
});
|
328
|
+
|
329
|
+
this.ws.close();
|
330
|
+
// 250ms grace period for ws to close gracefully
|
331
|
+
await Promise.race([closePromise, sleep(250)]);
|
332
|
+
}
|
333
|
+
this.ws = undefined;
|
334
|
+
this.clearPingInterval();
|
335
|
+
} finally {
|
336
|
+
unlock();
|
311
337
|
}
|
312
|
-
this.ws = undefined;
|
313
|
-
this.clearPingInterval();
|
314
338
|
}
|
315
339
|
|
316
340
|
// initial offer after joining
|
@@ -441,7 +465,7 @@ export class SignalClient {
|
|
441
465
|
if (this.signalLatency) {
|
442
466
|
await sleep(this.signalLatency);
|
443
467
|
}
|
444
|
-
if (!this.ws || this.ws.readyState
|
468
|
+
if (!this.ws || this.ws.readyState !== this.ws.OPEN) {
|
445
469
|
log.error(`cannot send signal request before connected, type: ${message?.$case}`);
|
446
470
|
return;
|
447
471
|
}
|
@@ -37,7 +37,7 @@ export class TURNCheck extends Checker {
|
|
37
37
|
} else if (hasTURN && !hasTLS) {
|
38
38
|
this.appendWarning('TURN is configured server side, but TURN/TLS is unavailable.');
|
39
39
|
}
|
40
|
-
signalClient.close();
|
40
|
+
await signalClient.close();
|
41
41
|
if (this.connectOptions?.rtcConfig?.iceServers || hasTURN) {
|
42
42
|
await this.room!.connect(this.url, this.token, {
|
43
43
|
rtcConfig: {
|
package/src/index.ts
CHANGED
@@ -23,8 +23,11 @@ import {
|
|
23
23
|
supportsAdaptiveStream,
|
24
24
|
supportsAV1,
|
25
25
|
supportsDynacast,
|
26
|
+
createAudioAnalyser,
|
26
27
|
} from './room/utils';
|
27
28
|
|
29
|
+
import type { AudioAnalyserOptions } from './room/utils';
|
30
|
+
|
28
31
|
export * from './options';
|
29
32
|
export * from './room/errors';
|
30
33
|
export * from './room/events';
|
@@ -43,6 +46,8 @@ export {
|
|
43
46
|
supportsAdaptiveStream,
|
44
47
|
supportsDynacast,
|
45
48
|
supportsAV1,
|
49
|
+
createAudioAnalyser,
|
50
|
+
AudioAnalyserOptions,
|
46
51
|
LogLevel,
|
47
52
|
Room,
|
48
53
|
ConnectionState,
|
package/src/options.ts
CHANGED
@@ -7,6 +7,10 @@ import type {
|
|
7
7
|
} from './room/track/options';
|
8
8
|
import type { AdaptiveStreamSettings } from './room/track/types';
|
9
9
|
|
10
|
+
export interface WebAudioSettings {
|
11
|
+
audioContext: AudioContext;
|
12
|
+
}
|
13
|
+
|
10
14
|
/**
|
11
15
|
* @internal
|
12
16
|
*/
|
@@ -72,7 +76,7 @@ export interface InternalRoomOptions {
|
|
72
76
|
* experimental flag, mix all audio tracks in web audio
|
73
77
|
*/
|
74
78
|
|
75
|
-
expWebAudioMix: boolean;
|
79
|
+
expWebAudioMix: boolean | WebAudioSettings;
|
76
80
|
}
|
77
81
|
|
78
82
|
/**
|
package/src/room/RTCEngine.ts
CHANGED
@@ -38,6 +38,7 @@ import type { TrackPublishOptions, VideoCodec } from './track/options';
|
|
38
38
|
import { Track } from './track/Track';
|
39
39
|
import {
|
40
40
|
isWeb,
|
41
|
+
Mutex,
|
41
42
|
sleep,
|
42
43
|
supportsAddTrack,
|
43
44
|
supportsSetCodecPreferences,
|
@@ -130,12 +131,15 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
130
131
|
/** specifies how often an initial join connection is allowed to retry */
|
131
132
|
private maxJoinAttempts: number = 1;
|
132
133
|
|
134
|
+
private closingLock: Mutex;
|
135
|
+
|
133
136
|
constructor(private options: InternalRoomOptions) {
|
134
137
|
super();
|
135
138
|
this.client = new SignalClient();
|
136
139
|
this.client.signalLatency = this.options.expSignalLatency;
|
137
140
|
this.reconnectPolicy = this.options.reconnectPolicy;
|
138
141
|
this.registerOnLineListener();
|
142
|
+
this.closingLock = new Mutex();
|
139
143
|
}
|
140
144
|
|
141
145
|
async join(
|
@@ -179,30 +183,35 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
179
183
|
}
|
180
184
|
}
|
181
185
|
|
182
|
-
close() {
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
this.
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
186
|
+
async close() {
|
187
|
+
const unlock = await this.closingLock.lock();
|
188
|
+
try {
|
189
|
+
this._isClosed = true;
|
190
|
+
this.removeAllListeners();
|
191
|
+
this.deregisterOnLineListener();
|
192
|
+
this.clearPendingReconnect();
|
193
|
+
if (this.publisher && this.publisher.pc.signalingState !== 'closed') {
|
194
|
+
this.publisher.pc.getSenders().forEach((sender) => {
|
195
|
+
try {
|
196
|
+
// TODO: react-native-webrtc doesn't have removeTrack yet.
|
197
|
+
if (this.publisher?.pc.removeTrack) {
|
198
|
+
this.publisher?.pc.removeTrack(sender);
|
199
|
+
}
|
200
|
+
} catch (e) {
|
201
|
+
log.warn('could not removeTrack', { error: e });
|
193
202
|
}
|
194
|
-
}
|
195
|
-
|
196
|
-
|
197
|
-
}
|
198
|
-
this.
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
this.
|
203
|
-
|
203
|
+
});
|
204
|
+
this.publisher.close();
|
205
|
+
this.publisher = undefined;
|
206
|
+
}
|
207
|
+
if (this.subscriber) {
|
208
|
+
this.subscriber.close();
|
209
|
+
this.subscriber = undefined;
|
210
|
+
}
|
211
|
+
await this.client.close();
|
212
|
+
} finally {
|
213
|
+
unlock();
|
204
214
|
}
|
205
|
-
this.client.close();
|
206
215
|
}
|
207
216
|
|
208
217
|
addTrack(req: AddTrackRequest): Promise<TrackInfo> {
|
@@ -335,7 +344,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
335
344
|
const shouldEmit = this.pcState === PCState.New;
|
336
345
|
this.pcState = PCState.Connected;
|
337
346
|
if (shouldEmit) {
|
338
|
-
this.emit(EngineEvent.Connected);
|
347
|
+
this.emit(EngineEvent.Connected, joinResponse);
|
339
348
|
}
|
340
349
|
} else if (primaryPC.connectionState === 'failed') {
|
341
350
|
// on Safari, PeerConnection will switch to 'disconnected' during renegotiation
|
@@ -784,9 +793,9 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
784
793
|
}
|
785
794
|
|
786
795
|
if (this.client.isConnected) {
|
787
|
-
this.client.sendLeave();
|
796
|
+
await this.client.sendLeave();
|
788
797
|
}
|
789
|
-
this.client.close();
|
798
|
+
await this.client.close();
|
790
799
|
this.primaryPC = undefined;
|
791
800
|
this.publisher?.close();
|
792
801
|
this.publisher = undefined;
|
@@ -1040,7 +1049,7 @@ async function getConnectedAddress(pc: RTCPeerConnection): Promise<string | unde
|
|
1040
1049
|
class SignalReconnectError extends Error {}
|
1041
1050
|
|
1042
1051
|
export type EngineEventCallbacks = {
|
1043
|
-
connected: () => void;
|
1052
|
+
connected: (joinResp: JoinResponse) => void;
|
1044
1053
|
disconnected: (reason?: DisconnectReason) => void;
|
1045
1054
|
resuming: () => void;
|
1046
1055
|
resumed: () => void;
|