livekit-client 0.15.4 → 0.16.3
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/api/RequestQueue.d.ts +12 -0
- package/dist/api/RequestQueue.js +61 -0
- package/dist/api/RequestQueue.js.map +1 -0
- package/dist/api/SignalClient.d.ts +7 -3
- package/dist/api/SignalClient.js +25 -4
- package/dist/api/SignalClient.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +0 -10
- package/dist/proto/livekit_rtc.d.ts +15 -10
- package/dist/proto/livekit_rtc.js +36 -22
- package/dist/proto/livekit_rtc.js.map +1 -1
- package/dist/room/RTCEngine.d.ts +27 -6
- package/dist/room/RTCEngine.js +163 -46
- package/dist/room/RTCEngine.js.map +1 -1
- package/dist/room/Room.d.ts +50 -6
- package/dist/room/Room.js +128 -67
- package/dist/room/Room.js.map +1 -1
- package/dist/room/events.d.ts +13 -4
- package/dist/room/events.js +15 -6
- package/dist/room/events.js.map +1 -1
- package/dist/room/participant/LocalParticipant.d.ts +1 -2
- package/dist/room/participant/LocalParticipant.js +7 -8
- package/dist/room/participant/LocalParticipant.js.map +1 -1
- package/dist/room/participant/Participant.d.ts +30 -4
- package/dist/room/participant/Participant.js +2 -2
- package/dist/room/participant/Participant.js.map +1 -1
- package/dist/room/participant/RemoteParticipant.d.ts +3 -4
- package/dist/room/participant/RemoteParticipant.js +3 -0
- package/dist/room/participant/RemoteParticipant.js.map +1 -1
- package/dist/room/track/LocalAudioTrack.js +8 -1
- package/dist/room/track/LocalAudioTrack.js.map +1 -1
- package/dist/room/track/LocalTrackPublication.d.ts +2 -0
- package/dist/room/track/LocalTrackPublication.js.map +1 -1
- package/dist/room/track/LocalVideoTrack.d.ts +1 -5
- package/dist/room/track/LocalVideoTrack.js +12 -117
- package/dist/room/track/LocalVideoTrack.js.map +1 -1
- package/dist/room/track/RemoteTrackPublication.d.ts +1 -1
- package/dist/room/track/RemoteTrackPublication.js +7 -1
- package/dist/room/track/RemoteTrackPublication.js.map +1 -1
- package/dist/room/track/RemoteVideoTrack.js +12 -7
- package/dist/room/track/RemoteVideoTrack.js.map +1 -1
- package/dist/room/track/Track.d.ts +16 -3
- package/dist/room/track/Track.js +30 -20
- package/dist/room/track/Track.js.map +1 -1
- package/dist/room/track/types.d.ts +4 -4
- package/dist/room/utils.d.ts +1 -0
- package/dist/room/utils.js +5 -21
- package/dist/room/utils.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/package.json +3 -4
- package/src/api/RequestQueue.ts +53 -0
- package/src/api/SignalClient.ts +33 -5
- package/src/index.ts +1 -1
- package/src/options.ts +0 -12
- package/src/proto/livekit_rtc.ts +55 -41
- package/src/room/RTCEngine.ts +198 -53
- package/src/room/Room.ts +227 -96
- package/src/room/events.ts +15 -4
- package/src/room/participant/LocalParticipant.ts +6 -7
- package/src/room/participant/Participant.ts +39 -4
- package/src/room/participant/RemoteParticipant.ts +9 -4
- package/src/room/track/LocalAudioTrack.ts +8 -1
- package/src/room/track/LocalTrackPublication.ts +3 -0
- package/src/room/track/LocalVideoTrack.ts +11 -142
- package/src/room/track/RemoteTrackPublication.ts +8 -2
- package/src/room/track/RemoteVideoTrack.ts +14 -7
- package/src/room/track/Track.ts +46 -24
- package/src/room/track/types.ts +4 -4
- package/src/room/utils.ts +4 -16
- package/src/version.ts +2 -2
package/dist/room/track/Track.js
CHANGED
@@ -45,16 +45,13 @@ class Track extends events_1.EventEmitter {
|
|
45
45
|
element = document.createElement(elementType);
|
46
46
|
}
|
47
47
|
}
|
48
|
-
if (element
|
49
|
-
element
|
50
|
-
element.autoplay = true;
|
51
|
-
}
|
52
|
-
// already attached
|
53
|
-
if (this.attachedElements.includes(element)) {
|
54
|
-
return element;
|
48
|
+
if (!this.attachedElements.includes(element)) {
|
49
|
+
this.attachedElements.push(element);
|
55
50
|
}
|
51
|
+
// even if we believe it's already attached to the element, it's possible
|
52
|
+
// the element's srcObject was set to something else out of band.
|
53
|
+
// we'll want to re-attach it in that case
|
56
54
|
attachToElement(this.mediaStreamTrack, element);
|
57
|
-
this.attachedElements.push(element);
|
58
55
|
if (element instanceof HTMLAudioElement) {
|
59
56
|
// manually play audio to detect audio playback status
|
60
57
|
element.play()
|
@@ -122,9 +119,8 @@ function attachToElement(track, element) {
|
|
122
119
|
}
|
123
120
|
else {
|
124
121
|
mediaStream = new MediaStream();
|
125
|
-
element.srcObject = mediaStream;
|
126
122
|
}
|
127
|
-
//
|
123
|
+
// check if track matches existing track
|
128
124
|
let existingTracks;
|
129
125
|
if (track.kind === 'audio') {
|
130
126
|
existingTracks = mediaStream.getAudioTracks();
|
@@ -132,16 +128,30 @@ function attachToElement(track, element) {
|
|
132
128
|
else {
|
133
129
|
existingTracks = mediaStream.getVideoTracks();
|
134
130
|
}
|
135
|
-
existingTracks.
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
131
|
+
if (!existingTracks.includes(track)) {
|
132
|
+
existingTracks.forEach((et) => {
|
133
|
+
mediaStream.removeTrack(et);
|
134
|
+
});
|
135
|
+
mediaStream.addTrack(track);
|
136
|
+
}
|
137
|
+
// avoid flicker
|
138
|
+
if (element.srcObject !== mediaStream) {
|
139
|
+
element.srcObject = mediaStream;
|
140
|
+
if ((utils_1.isSafari() || utils_1.isFireFox()) && element instanceof HTMLVideoElement) {
|
141
|
+
// Firefox also has a timing issue where video doesn't actually get attached unless
|
142
|
+
// performed out-of-band
|
143
|
+
// Safari 15 has a bug where in certain layouts, video element renders
|
144
|
+
// black until the page is resized or other changes take place.
|
145
|
+
// Resetting the src triggers it to render.
|
146
|
+
// https://developer.apple.com/forums/thread/690523
|
147
|
+
setTimeout(() => {
|
148
|
+
element.srcObject = mediaStream;
|
149
|
+
}, 0);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
element.autoplay = true;
|
153
|
+
if (element instanceof HTMLVideoElement) {
|
154
|
+
element.playsInline = true;
|
145
155
|
}
|
146
156
|
}
|
147
157
|
exports.attachToElement = attachToElement;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Track.js","sourceRoot":"","sources":["../../../src/room/track/Track.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;
|
1
|
+
{"version":3,"file":"Track.js","sourceRoot":"","sources":["../../../src/room/track/Track.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import LocalAudioTrack from './LocalAudioTrack';
|
2
|
-
import LocalVideoTrack from './LocalVideoTrack';
|
3
|
-
import RemoteAudioTrack from './RemoteAudioTrack';
|
4
|
-
import RemoteVideoTrack from './RemoteVideoTrack';
|
1
|
+
import type LocalAudioTrack from './LocalAudioTrack';
|
2
|
+
import type LocalVideoTrack from './LocalVideoTrack';
|
3
|
+
import type RemoteAudioTrack from './RemoteAudioTrack';
|
4
|
+
import type RemoteVideoTrack from './RemoteVideoTrack';
|
5
5
|
export declare type RemoteTrack = RemoteAudioTrack | RemoteVideoTrack;
|
6
6
|
export declare type AudioTrack = RemoteAudioTrack | LocalAudioTrack;
|
7
7
|
export declare type VideoTrack = RemoteVideoTrack | LocalVideoTrack;
|
package/dist/room/utils.d.ts
CHANGED
@@ -2,6 +2,7 @@ import { ClientInfo } from '../proto/livekit_models';
|
|
2
2
|
export declare function unpackStreamId(packed: string): string[];
|
3
3
|
export declare function sleep(duration: number): Promise<void>;
|
4
4
|
export declare function isFireFox(): boolean;
|
5
|
+
export declare function isSafari(): boolean;
|
5
6
|
export declare const getResizeObserver: () => ResizeObserver;
|
6
7
|
export declare const getIntersectionObserver: () => IntersectionObserver;
|
7
8
|
export interface ObservableMediaElement extends HTMLMediaElement {
|
package/dist/room/utils.js
CHANGED
@@ -8,12 +8,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
9
|
});
|
10
10
|
};
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
-
};
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
-
exports.getClientInfo = exports.getIntersectionObserver = exports.getResizeObserver = exports.isFireFox = exports.sleep = exports.unpackStreamId = void 0;
|
16
|
-
const ua_parser_js_1 = __importDefault(require("ua-parser-js"));
|
12
|
+
exports.getClientInfo = exports.getIntersectionObserver = exports.getResizeObserver = exports.isSafari = exports.isFireFox = exports.sleep = exports.unpackStreamId = void 0;
|
17
13
|
const livekit_models_1 = require("../proto/livekit_models");
|
18
14
|
const version_1 = require("../version");
|
19
15
|
const separator = '|';
|
@@ -35,6 +31,10 @@ function isFireFox() {
|
|
35
31
|
return navigator.userAgent.indexOf('Firefox') !== -1;
|
36
32
|
}
|
37
33
|
exports.isFireFox = isFireFox;
|
34
|
+
function isSafari() {
|
35
|
+
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
36
|
+
}
|
37
|
+
exports.isSafari = isSafari;
|
38
38
|
function roDispatchCallback(entries) {
|
39
39
|
for (const entry of entries) {
|
40
40
|
entry.target.handleResize(entry);
|
@@ -60,27 +60,11 @@ const getIntersectionObserver = () => {
|
|
60
60
|
};
|
61
61
|
exports.getIntersectionObserver = getIntersectionObserver;
|
62
62
|
function getClientInfo() {
|
63
|
-
const ua = ua_parser_js_1.default(navigator.userAgent);
|
64
63
|
const info = livekit_models_1.ClientInfo.fromPartial({
|
65
64
|
sdk: livekit_models_1.ClientInfo_SDK.JS,
|
66
65
|
protocol: version_1.protocolVersion,
|
67
66
|
version: version_1.version,
|
68
|
-
os: ua.os.name,
|
69
|
-
osVersion: ua.os.version,
|
70
|
-
browser: ua.browser.name,
|
71
|
-
browserVersion: ua.browser.version,
|
72
67
|
});
|
73
|
-
let model = '';
|
74
|
-
if (ua.device.vendor) {
|
75
|
-
model += ua.device.vendor;
|
76
|
-
}
|
77
|
-
if (ua.device.model) {
|
78
|
-
if (model)
|
79
|
-
model += ' ';
|
80
|
-
model += ua.device.model;
|
81
|
-
}
|
82
|
-
if (model)
|
83
|
-
info.deviceModel = model;
|
84
68
|
return info;
|
85
69
|
}
|
86
70
|
exports.getClientInfo = getClientInfo;
|
package/dist/room/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/room/utils.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/room/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4DAAqE;AACrE,wCAAsD;AAEtD,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,SAAgB,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;KACvD;IACD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAND,wCAMC;AAED,SAAsB,KAAK,CAAC,QAAgB;;QAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;CAAA;AAFD,sBAEC;AAED,SAAgB,SAAS;IACvB,OAAO,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAFD,8BAEC;AAED,SAAgB,QAAQ;IACtB,OAAO,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC;AAFD,4BAEC;AAED,SAAS,kBAAkB,CAAC,OAA8B;IACxD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;QAC1B,KAAK,CAAC,MAAiC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KAC9D;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAoC;IAC9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;QAC1B,KAAK,CAAC,MAAiC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;KACzE;AACH,CAAC;AAED,IAAI,cAAc,GAA0B,IAAI,CAAC;AAC1C,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,IAAI,CAAC,cAAc;QAAE,cAAc,GAAG,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAC7E,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAHW,QAAA,iBAAiB,qBAG5B;AAEF,IAAI,oBAAoB,GAAgC,IAAI,CAAC;AACtD,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,IAAI,CAAC,oBAAoB;QAAE,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IAC/F,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAHW,QAAA,uBAAuB,2BAGlC;AAOF,SAAgB,aAAa;IAC3B,MAAM,IAAI,GAAG,2BAAU,CAAC,WAAW,CAAC;QAClC,GAAG,EAAE,+BAAc,CAAC,EAAE;QACtB,QAAQ,EAAE,yBAAe;QACzB,OAAO,EAAP,iBAAO;KACR,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAPD,sCAOC"}
|
package/dist/version.d.ts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "0.
|
2
|
-
export declare const protocolVersion =
|
1
|
+
export declare const version = "0.16.3";
|
2
|
+
export declare const protocolVersion = 6;
|
package/dist/version.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.protocolVersion = exports.version = void 0;
|
4
|
-
exports.version = '0.
|
5
|
-
exports.protocolVersion =
|
4
|
+
exports.version = '0.16.3';
|
5
|
+
exports.protocolVersion = 6;
|
6
6
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "livekit-client",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.16.3",
|
4
4
|
"description": "JavaScript/TypeScript client SDK for LiveKit",
|
5
5
|
"main": "dist/index.js",
|
6
6
|
"source": "src/index.ts",
|
@@ -23,12 +23,10 @@
|
|
23
23
|
"loglevel": "^1.8.0",
|
24
24
|
"protobufjs": "^6.11.2",
|
25
25
|
"ts-debounce": "^3.0.0",
|
26
|
-
"
|
27
|
-
"webrtc-adapter": "^8.1.0"
|
26
|
+
"webrtc-adapter": "^8.1.1"
|
28
27
|
},
|
29
28
|
"devDependencies": {
|
30
29
|
"@types/jest": "^27.0.3",
|
31
|
-
"@types/ua-parser-js": "^0.7.36",
|
32
30
|
"@types/ws": "^7.4.0",
|
33
31
|
"@typescript-eslint/eslint-plugin": "^4.31.2",
|
34
32
|
"@webpack-cli/serve": "^1.5.2",
|
@@ -40,6 +38,7 @@
|
|
40
38
|
"ts-jest": "^27.0.7",
|
41
39
|
"ts-loader": "^8.1.0",
|
42
40
|
"ts-proto": "^1.85.0",
|
41
|
+
"typed-emitter": "^2.1.0",
|
43
42
|
"typedoc": "^0.20.35",
|
44
43
|
"typedoc-plugin-no-inherit": "1.3.0",
|
45
44
|
"typescript": "~4.2.3",
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import logger from '../logger';
|
2
|
+
|
3
|
+
export default class Queue {
|
4
|
+
private queue: Array<() => void>;
|
5
|
+
|
6
|
+
private running: boolean;
|
7
|
+
|
8
|
+
constructor() {
|
9
|
+
this.queue = [];
|
10
|
+
this.running = false;
|
11
|
+
}
|
12
|
+
|
13
|
+
enqueue(cb: () => void) {
|
14
|
+
logger.debug('enqueuing request to fire later');
|
15
|
+
this.queue.push(cb);
|
16
|
+
}
|
17
|
+
|
18
|
+
dequeue() {
|
19
|
+
const evt = this.queue.shift();
|
20
|
+
if (evt) evt();
|
21
|
+
logger.debug('firing request from queue');
|
22
|
+
}
|
23
|
+
|
24
|
+
async run() {
|
25
|
+
if (this.running) return;
|
26
|
+
logger.debug('start queue');
|
27
|
+
this.running = true;
|
28
|
+
while (this.running && this.queue.length > 0) {
|
29
|
+
this.dequeue();
|
30
|
+
}
|
31
|
+
this.running = false;
|
32
|
+
logger.debug('queue finished');
|
33
|
+
}
|
34
|
+
|
35
|
+
pause() {
|
36
|
+
logger.debug('pausing queue');
|
37
|
+
this.running = false;
|
38
|
+
}
|
39
|
+
|
40
|
+
reset() {
|
41
|
+
logger.debug('resetting queue');
|
42
|
+
this.running = false;
|
43
|
+
this.queue = [];
|
44
|
+
}
|
45
|
+
|
46
|
+
isRunning() {
|
47
|
+
return this.running;
|
48
|
+
}
|
49
|
+
|
50
|
+
isEmpty() {
|
51
|
+
return this.queue.length === 0;
|
52
|
+
}
|
53
|
+
}
|
package/src/api/SignalClient.ts
CHANGED
@@ -8,6 +8,7 @@ import {
|
|
8
8
|
AddTrackRequest,
|
9
9
|
ConnectionQualityUpdate,
|
10
10
|
JoinResponse,
|
11
|
+
LeaveRequest,
|
11
12
|
SessionDescription,
|
12
13
|
SignalRequest,
|
13
14
|
SignalResponse,
|
@@ -20,6 +21,7 @@ import {
|
|
20
21
|
} from '../proto/livekit_rtc';
|
21
22
|
import { ConnectionError } from '../room/errors';
|
22
23
|
import { getClientInfo, sleep } from '../room/utils';
|
24
|
+
import Queue from './RequestQueue';
|
23
25
|
|
24
26
|
// internal options
|
25
27
|
interface ConnectOpts {
|
@@ -37,6 +39,10 @@ export interface SignalOptions {
|
|
37
39
|
export class SignalClient {
|
38
40
|
isConnected: boolean;
|
39
41
|
|
42
|
+
isReconnecting: boolean;
|
43
|
+
|
44
|
+
requestQueue: Queue;
|
45
|
+
|
40
46
|
useJSON: boolean;
|
41
47
|
|
42
48
|
/** simulate signaling latency by delaying messages */
|
@@ -71,13 +77,17 @@ export class SignalClient {
|
|
71
77
|
|
72
78
|
onSubscriptionPermissionUpdate?: (update: SubscriptionPermissionUpdate) => void;
|
73
79
|
|
74
|
-
|
80
|
+
onTokenRefresh?: (token: string) => void;
|
81
|
+
|
82
|
+
onLeave?: (leave: LeaveRequest) => void;
|
75
83
|
|
76
84
|
ws?: WebSocket;
|
77
85
|
|
78
86
|
constructor(useJSON: boolean = false) {
|
79
87
|
this.isConnected = false;
|
88
|
+
this.isReconnecting = false;
|
80
89
|
this.useJSON = useJSON;
|
90
|
+
this.requestQueue = new Queue();
|
81
91
|
}
|
82
92
|
|
83
93
|
async join(
|
@@ -85,6 +95,9 @@ export class SignalClient {
|
|
85
95
|
token: string,
|
86
96
|
opts?: SignalOptions,
|
87
97
|
): Promise<JoinResponse> {
|
98
|
+
// during a full reconnect, we'd want to start the sequence even if currently
|
99
|
+
// connected
|
100
|
+
this.isConnected = false;
|
88
101
|
const res = await this.connect(url, token, {
|
89
102
|
autoSubscribe: opts?.autoSubscribe,
|
90
103
|
});
|
@@ -92,9 +105,12 @@ export class SignalClient {
|
|
92
105
|
}
|
93
106
|
|
94
107
|
async reconnect(url: string, token: string): Promise<void> {
|
108
|
+
this.isReconnecting = true;
|
95
109
|
await this.connect(url, token, {
|
96
110
|
reconnect: true,
|
97
111
|
});
|
112
|
+
this.isReconnecting = false;
|
113
|
+
this.requestQueue.run();
|
98
114
|
}
|
99
115
|
|
100
116
|
connect(
|
@@ -177,7 +193,7 @@ export class SignalClient {
|
|
177
193
|
};
|
178
194
|
|
179
195
|
ws.onclose = (ev: CloseEvent) => {
|
180
|
-
if (!this.isConnected) return;
|
196
|
+
if (!this.isConnected || this.ws !== ws) return;
|
181
197
|
|
182
198
|
log.debug('websocket connection closed', ev.reason);
|
183
199
|
this.isConnected = false;
|
@@ -263,7 +279,7 @@ export class SignalClient {
|
|
263
279
|
trackPermissions: TrackPermission[],
|
264
280
|
) {
|
265
281
|
this.sendRequest({
|
266
|
-
|
282
|
+
subscriptionPermission: {
|
267
283
|
allParticipants,
|
268
284
|
trackPermissions,
|
269
285
|
},
|
@@ -280,7 +296,15 @@ export class SignalClient {
|
|
280
296
|
this.sendRequest(SignalRequest.fromPartial({ leave: {} }));
|
281
297
|
}
|
282
298
|
|
283
|
-
async sendRequest(req: SignalRequest) {
|
299
|
+
async sendRequest(req: SignalRequest, fromQueue: boolean = false) {
|
300
|
+
// capture all requests while reconnecting and put them in a queue.
|
301
|
+
// keep order by queueing up new events as long as the queue is not empty
|
302
|
+
// unless the request originates from the queue, then don't enqueue again
|
303
|
+
|
304
|
+
if ((this.isReconnecting && !req.simulate) || (!this.requestQueue.isEmpty() && !fromQueue)) {
|
305
|
+
this.requestQueue.enqueue(() => this.sendRequest(req, true));
|
306
|
+
return;
|
307
|
+
}
|
284
308
|
if (this.signalLatency) {
|
285
309
|
await sleep(this.signalLatency);
|
286
310
|
}
|
@@ -332,7 +356,7 @@ export class SignalClient {
|
|
332
356
|
}
|
333
357
|
} else if (msg.leave) {
|
334
358
|
if (this.onLeave) {
|
335
|
-
this.onLeave();
|
359
|
+
this.onLeave(msg.leave);
|
336
360
|
}
|
337
361
|
} else if (msg.mute) {
|
338
362
|
if (this.onRemoteMuteChanged) {
|
@@ -358,6 +382,10 @@ export class SignalClient {
|
|
358
382
|
if (this.onSubscriptionPermissionUpdate) {
|
359
383
|
this.onSubscriptionPermissionUpdate(msg.subscriptionPermissionUpdate);
|
360
384
|
}
|
385
|
+
} else if (msg.refreshToken) {
|
386
|
+
if (this.onTokenRefresh) {
|
387
|
+
this.onTokenRefresh(msg.refreshToken);
|
388
|
+
}
|
361
389
|
} else {
|
362
390
|
log.debug('unsupported message', msg);
|
363
391
|
}
|
package/src/index.ts
CHANGED
@@ -29,7 +29,6 @@ export {
|
|
29
29
|
Room,
|
30
30
|
RoomState,
|
31
31
|
DataPacket_Kind,
|
32
|
-
ConnectionQuality,
|
33
32
|
Participant,
|
34
33
|
RemoteParticipant,
|
35
34
|
LocalParticipant,
|
@@ -44,4 +43,5 @@ export {
|
|
44
43
|
ParticipantTrackPermission,
|
45
44
|
TrackPublication,
|
46
45
|
VideoQuality,
|
46
|
+
ConnectionQuality,
|
47
47
|
};
|
package/src/options.ts
CHANGED
@@ -46,12 +46,6 @@ export interface RoomOptions {
|
|
46
46
|
*/
|
47
47
|
stopLocalTrackOnUnpublish?: boolean;
|
48
48
|
|
49
|
-
/**
|
50
|
-
* @internal
|
51
|
-
* experimental flag, disable client managed layer pause when publishing capability is limited
|
52
|
-
*/
|
53
|
-
expDisableLayerPause?: boolean;
|
54
|
-
|
55
49
|
/**
|
56
50
|
* @internal
|
57
51
|
* experimental flag, introduce a delay before sending signaling messages
|
@@ -143,10 +137,4 @@ export interface ConnectOptions extends CreateLocalTracksOptions {
|
|
143
137
|
* set this to false if you would prefer to clean up unpublished local tracks manually.
|
144
138
|
*/
|
145
139
|
stopLocalTrackOnUnpublish?: boolean;
|
146
|
-
|
147
|
-
/**
|
148
|
-
* @internal
|
149
|
-
* experimental flag, disable client managed layer pause when publishing capability is limited
|
150
|
-
*/
|
151
|
-
expDisableLayerPause?: boolean;
|
152
140
|
}
|