mediasfu-shared 1.1.0 → 1.2.1
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/CHANGELOG.md +7 -0
- package/README.md +17 -0
- package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts +1 -1
- package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts.map +1 -1
- package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts +1 -1
- package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts.map +1 -1
- package/dist/consumers/connectIps.d.ts +1 -1
- package/dist/consumers/connectIps.d.ts.map +1 -1
- package/dist/consumers/connectRecvTransport.d.ts +1 -1
- package/dist/consumers/connectRecvTransport.d.ts.map +1 -1
- package/dist/consumers/connectSendTransport.d.ts +1 -1
- package/dist/consumers/connectSendTransport.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportAudio.d.ts +1 -1
- package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportScreen.d.ts +1 -1
- package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportVideo.d.ts +1 -1
- package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -1
- package/dist/consumers/createSendTransport.d.ts +1 -1
- package/dist/consumers/createSendTransport.d.ts.map +1 -1
- package/dist/consumers/disconnectSendTransportAudio.d.ts +1 -1
- package/dist/consumers/disconnectSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/disconnectSendTransportScreen.d.ts +1 -1
- package/dist/consumers/disconnectSendTransportScreen.d.ts.map +1 -1
- package/dist/consumers/disconnectSendTransportVideo.d.ts +1 -1
- package/dist/consumers/disconnectSendTransportVideo.d.ts.map +1 -1
- package/dist/consumers/index.cjs +80 -0
- package/dist/consumers/index.cjs.map +1 -0
- package/dist/consumers/index.d.ts +62 -0
- package/dist/consumers/index.d.ts.map +1 -0
- package/dist/consumers/index.js +80 -0
- package/dist/consumers/index.js.map +1 -0
- package/dist/consumers/resumeSendTransportAudio.d.ts +1 -1
- package/dist/consumers/resumeSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/signalNewConsumerTransport.d.ts +1 -1
- package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -1
- package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts +1 -1
- package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts.map +1 -1
- package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts +1 -1
- package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts.map +1 -1
- package/dist/consumers/streamSuccessAudio.d.ts +1 -1
- package/dist/consumers/streamSuccessAudio.d.ts.map +1 -1
- package/dist/consumers/streamSuccessAudioSwitch.d.ts +1 -1
- package/dist/consumers/streamSuccessAudioSwitch.d.ts.map +1 -1
- package/dist/consumers/streamSuccessVideo.d.ts +1 -1
- package/dist/consumers/streamSuccessVideo.d.ts.map +1 -1
- package/dist/getParticipantMedia-Bu_aZlxe.js +3555 -0
- package/dist/getParticipantMedia-Bu_aZlxe.js.map +1 -0
- package/dist/getParticipantMedia-DC_Nca8S.cjs +3554 -0
- package/dist/getParticipantMedia-DC_Nca8S.cjs.map +1 -0
- package/dist/index.cjs +299 -252
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1994 -1947
- package/dist/index.js.map +1 -1
- package/dist/index.native.cjs +230 -224
- package/dist/index.native.cjs.map +1 -1
- package/dist/index.native.js +349 -343
- package/dist/index.native.js.map +1 -1
- package/dist/joinLocalRoom-7ibqv7zZ.js +657 -0
- package/dist/joinLocalRoom-7ibqv7zZ.js.map +1 -0
- package/dist/joinLocalRoom-BJBDvTYh.cjs +673 -0
- package/dist/joinLocalRoom-BJBDvTYh.cjs.map +1 -0
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs +1222 -0
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +1 -0
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js +1223 -0
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +1 -0
- package/dist/methods/index.cjs +3975 -0
- package/dist/methods/index.cjs.map +1 -0
- package/dist/methods/index.js +3976 -0
- package/dist/methods/index.js.map +1 -0
- package/dist/methods/socketReceive/getDomains.d.ts +1 -1
- package/dist/methods/socketReceive/getDomains.d.ts.map +1 -1
- package/dist/methods/utils/headless/virtualBackground.d.ts +2 -2
- package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts +21 -0
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -0
- package/dist/methods/whiteboard/captureCanvasStream.d.ts +1 -1
- package/dist/methods/whiteboard/captureCanvasStream.d.ts.map +1 -1
- package/dist/producers/producerEmits/joinConRoom.d.ts +1 -1
- package/dist/producers/producerEmits/joinConRoom.d.ts.map +1 -1
- package/dist/producers/producerEmits/joinRoom.d.ts +1 -1
- package/dist/producers/producerEmits/joinRoom.d.ts.map +1 -1
- package/dist/translationConsumerSwitch-C20MfNNq.cjs +509 -0
- package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +1 -0
- package/dist/translationConsumerSwitch-zKuS5wgH.js +510 -0
- package/dist/translationConsumerSwitch-zKuS5wgH.js.map +1 -0
- package/dist/types/index.cjs +85 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +85 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/shared-base-types.d.ts +1 -1
- package/dist/types/shared-base-types.d.ts.map +1 -1
- package/dist/updateParticipantAudioDecibels-C_MygF6q.js +5432 -0
- package/dist/updateParticipantAudioDecibels-C_MygF6q.js.map +1 -0
- package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs +5431 -0
- package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs.map +1 -0
- package/dist/validateAlphanumeric-DKn5BsUP.cjs +15 -0
- package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +1 -0
- package/dist/validateAlphanumeric-Dk1JB80W.js +16 -0
- package/dist/validateAlphanumeric-Dk1JB80W.js.map +1 -0
- package/package.json +2 -1
- package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +1 -2
- package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +1 -1
- package/src/consumers/connectIps.ts +69 -9
- package/src/consumers/connectRecvTransport.ts +1 -1
- package/src/consumers/connectSendTransport.ts +1 -1
- package/src/consumers/connectSendTransportAudio.ts +1 -1
- package/src/consumers/connectSendTransportScreen.ts +1 -1
- package/src/consumers/connectSendTransportVideo.ts +1 -1
- package/src/consumers/createSendTransport.ts +1 -1
- package/src/consumers/disconnectSendTransportAudio.ts +1 -1
- package/src/consumers/disconnectSendTransportScreen.ts +1 -1
- package/src/consumers/disconnectSendTransportVideo.ts +1 -1
- package/src/consumers/index.ts +61 -0
- package/src/consumers/resumeSendTransportAudio.ts +1 -1
- package/src/consumers/signalNewConsumerTransport.ts +1 -2
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +1 -1
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +1 -1
- package/src/consumers/streamSuccessAudio.ts +1 -2
- package/src/consumers/streamSuccessAudioSwitch.ts +1 -2
- package/src/consumers/streamSuccessVideo.ts +1 -1
- package/src/index.ts +2 -0
- package/src/methods/socketReceive/getDomains.ts +1 -1
- package/src/methods/utils/headless/virtualBackground.ts +45 -30
- package/src/methods/utils/virtualBackgroundCompositor.ts +53 -0
- package/src/methods/whiteboard/captureCanvasStream.ts +2 -2
- package/src/producers/producerEmits/joinConRoom.ts +1 -1
- package/src/producers/producerEmits/joinRoom.ts +1 -1
- package/src/types/index.ts +1 -0
- package/src/types/shared-base-types.ts +2 -3
- package/dist/getParticipantMedia-D9ChmEqq.js +0 -15265
- package/dist/getParticipantMedia-D9ChmEqq.js.map +0 -1
- package/dist/getParticipantMedia-DWvIhPPY.cjs +0 -15281
- package/dist/getParticipantMedia-DWvIhPPY.cjs.map +0 -1
|
@@ -0,0 +1,1223 @@
|
|
|
1
|
+
var cookie = {};
|
|
2
|
+
/*!
|
|
3
|
+
* cookie
|
|
4
|
+
* Copyright(c) 2012-2014 Roman Shtylman
|
|
5
|
+
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
6
|
+
* MIT Licensed
|
|
7
|
+
*/
|
|
8
|
+
var hasRequiredCookie;
|
|
9
|
+
function requireCookie() {
|
|
10
|
+
if (hasRequiredCookie) return cookie;
|
|
11
|
+
hasRequiredCookie = 1;
|
|
12
|
+
cookie.parse = parse;
|
|
13
|
+
cookie.serialize = serialize;
|
|
14
|
+
var __toString = Object.prototype.toString;
|
|
15
|
+
var __hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
16
|
+
var cookieNameRegExp = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
17
|
+
var cookieValueRegExp = /^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/;
|
|
18
|
+
var domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
|
|
19
|
+
var pathValueRegExp = /^[\u0020-\u003A\u003D-\u007E]*$/;
|
|
20
|
+
function parse(str, opt) {
|
|
21
|
+
if (typeof str !== "string") {
|
|
22
|
+
throw new TypeError("argument str must be a string");
|
|
23
|
+
}
|
|
24
|
+
var obj = {};
|
|
25
|
+
var len = str.length;
|
|
26
|
+
if (len < 2) return obj;
|
|
27
|
+
var dec = opt && opt.decode || decode;
|
|
28
|
+
var index = 0;
|
|
29
|
+
var eqIdx = 0;
|
|
30
|
+
var endIdx = 0;
|
|
31
|
+
do {
|
|
32
|
+
eqIdx = str.indexOf("=", index);
|
|
33
|
+
if (eqIdx === -1) break;
|
|
34
|
+
endIdx = str.indexOf(";", index);
|
|
35
|
+
if (endIdx === -1) {
|
|
36
|
+
endIdx = len;
|
|
37
|
+
} else if (eqIdx > endIdx) {
|
|
38
|
+
index = str.lastIndexOf(";", eqIdx - 1) + 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
var keyStartIdx = startIndex(str, index, eqIdx);
|
|
42
|
+
var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);
|
|
43
|
+
var key = str.slice(keyStartIdx, keyEndIdx);
|
|
44
|
+
if (!__hasOwnProperty.call(obj, key)) {
|
|
45
|
+
var valStartIdx = startIndex(str, eqIdx + 1, endIdx);
|
|
46
|
+
var valEndIdx = endIndex(str, endIdx, valStartIdx);
|
|
47
|
+
if (str.charCodeAt(valStartIdx) === 34 && str.charCodeAt(valEndIdx - 1) === 34) {
|
|
48
|
+
valStartIdx++;
|
|
49
|
+
valEndIdx--;
|
|
50
|
+
}
|
|
51
|
+
var val = str.slice(valStartIdx, valEndIdx);
|
|
52
|
+
obj[key] = tryDecode(val, dec);
|
|
53
|
+
}
|
|
54
|
+
index = endIdx + 1;
|
|
55
|
+
} while (index < len);
|
|
56
|
+
return obj;
|
|
57
|
+
}
|
|
58
|
+
function startIndex(str, index, max) {
|
|
59
|
+
do {
|
|
60
|
+
var code = str.charCodeAt(index);
|
|
61
|
+
if (code !== 32 && code !== 9) return index;
|
|
62
|
+
} while (++index < max);
|
|
63
|
+
return max;
|
|
64
|
+
}
|
|
65
|
+
function endIndex(str, index, min) {
|
|
66
|
+
while (index > min) {
|
|
67
|
+
var code = str.charCodeAt(--index);
|
|
68
|
+
if (code !== 32 && code !== 9) return index + 1;
|
|
69
|
+
}
|
|
70
|
+
return min;
|
|
71
|
+
}
|
|
72
|
+
function serialize(name, val, opt) {
|
|
73
|
+
var enc = opt && opt.encode || encodeURIComponent;
|
|
74
|
+
if (typeof enc !== "function") {
|
|
75
|
+
throw new TypeError("option encode is invalid");
|
|
76
|
+
}
|
|
77
|
+
if (!cookieNameRegExp.test(name)) {
|
|
78
|
+
throw new TypeError("argument name is invalid");
|
|
79
|
+
}
|
|
80
|
+
var value = enc(val);
|
|
81
|
+
if (!cookieValueRegExp.test(value)) {
|
|
82
|
+
throw new TypeError("argument val is invalid");
|
|
83
|
+
}
|
|
84
|
+
var str = name + "=" + value;
|
|
85
|
+
if (!opt) return str;
|
|
86
|
+
if (null != opt.maxAge) {
|
|
87
|
+
var maxAge = Math.floor(opt.maxAge);
|
|
88
|
+
if (!isFinite(maxAge)) {
|
|
89
|
+
throw new TypeError("option maxAge is invalid");
|
|
90
|
+
}
|
|
91
|
+
str += "; Max-Age=" + maxAge;
|
|
92
|
+
}
|
|
93
|
+
if (opt.domain) {
|
|
94
|
+
if (!domainValueRegExp.test(opt.domain)) {
|
|
95
|
+
throw new TypeError("option domain is invalid");
|
|
96
|
+
}
|
|
97
|
+
str += "; Domain=" + opt.domain;
|
|
98
|
+
}
|
|
99
|
+
if (opt.path) {
|
|
100
|
+
if (!pathValueRegExp.test(opt.path)) {
|
|
101
|
+
throw new TypeError("option path is invalid");
|
|
102
|
+
}
|
|
103
|
+
str += "; Path=" + opt.path;
|
|
104
|
+
}
|
|
105
|
+
if (opt.expires) {
|
|
106
|
+
var expires = opt.expires;
|
|
107
|
+
if (!isDate(expires) || isNaN(expires.valueOf())) {
|
|
108
|
+
throw new TypeError("option expires is invalid");
|
|
109
|
+
}
|
|
110
|
+
str += "; Expires=" + expires.toUTCString();
|
|
111
|
+
}
|
|
112
|
+
if (opt.httpOnly) {
|
|
113
|
+
str += "; HttpOnly";
|
|
114
|
+
}
|
|
115
|
+
if (opt.secure) {
|
|
116
|
+
str += "; Secure";
|
|
117
|
+
}
|
|
118
|
+
if (opt.partitioned) {
|
|
119
|
+
str += "; Partitioned";
|
|
120
|
+
}
|
|
121
|
+
if (opt.priority) {
|
|
122
|
+
var priority = typeof opt.priority === "string" ? opt.priority.toLowerCase() : opt.priority;
|
|
123
|
+
switch (priority) {
|
|
124
|
+
case "low":
|
|
125
|
+
str += "; Priority=Low";
|
|
126
|
+
break;
|
|
127
|
+
case "medium":
|
|
128
|
+
str += "; Priority=Medium";
|
|
129
|
+
break;
|
|
130
|
+
case "high":
|
|
131
|
+
str += "; Priority=High";
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
throw new TypeError("option priority is invalid");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (opt.sameSite) {
|
|
138
|
+
var sameSite = typeof opt.sameSite === "string" ? opt.sameSite.toLowerCase() : opt.sameSite;
|
|
139
|
+
switch (sameSite) {
|
|
140
|
+
case true:
|
|
141
|
+
str += "; SameSite=Strict";
|
|
142
|
+
break;
|
|
143
|
+
case "lax":
|
|
144
|
+
str += "; SameSite=Lax";
|
|
145
|
+
break;
|
|
146
|
+
case "strict":
|
|
147
|
+
str += "; SameSite=Strict";
|
|
148
|
+
break;
|
|
149
|
+
case "none":
|
|
150
|
+
str += "; SameSite=None";
|
|
151
|
+
break;
|
|
152
|
+
default:
|
|
153
|
+
throw new TypeError("option sameSite is invalid");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return str;
|
|
157
|
+
}
|
|
158
|
+
function decode(str) {
|
|
159
|
+
return str.indexOf("%") !== -1 ? decodeURIComponent(str) : str;
|
|
160
|
+
}
|
|
161
|
+
function isDate(val) {
|
|
162
|
+
return __toString.call(val) === "[object Date]";
|
|
163
|
+
}
|
|
164
|
+
function tryDecode(str, decode2) {
|
|
165
|
+
try {
|
|
166
|
+
return decode2(str);
|
|
167
|
+
} catch (e) {
|
|
168
|
+
return str;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return cookie;
|
|
172
|
+
}
|
|
173
|
+
var cookieExports = requireCookie();
|
|
174
|
+
function hasDocumentCookie() {
|
|
175
|
+
const testingValue = typeof global === "undefined" ? void 0 : global.TEST_HAS_DOCUMENT_COOKIE;
|
|
176
|
+
if (typeof testingValue === "boolean") {
|
|
177
|
+
return testingValue;
|
|
178
|
+
}
|
|
179
|
+
return typeof document === "object" && typeof document.cookie === "string";
|
|
180
|
+
}
|
|
181
|
+
function parseCookies(cookies2) {
|
|
182
|
+
if (typeof cookies2 === "string") {
|
|
183
|
+
return cookieExports.parse(cookies2);
|
|
184
|
+
} else if (typeof cookies2 === "object" && cookies2 !== null) {
|
|
185
|
+
return cookies2;
|
|
186
|
+
} else {
|
|
187
|
+
return {};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function readCookie(value, options = {}) {
|
|
191
|
+
const cleanValue = cleanupCookieValue(value);
|
|
192
|
+
if (!options.doNotParse) {
|
|
193
|
+
try {
|
|
194
|
+
return JSON.parse(cleanValue);
|
|
195
|
+
} catch (e) {
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
function cleanupCookieValue(value) {
|
|
201
|
+
if (value && value[0] === "j" && value[1] === ":") {
|
|
202
|
+
return value.substr(2);
|
|
203
|
+
}
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
class Cookies {
|
|
207
|
+
constructor(cookies2, defaultSetOptions = {}) {
|
|
208
|
+
this.changeListeners = [];
|
|
209
|
+
this.HAS_DOCUMENT_COOKIE = false;
|
|
210
|
+
this.update = () => {
|
|
211
|
+
if (!this.HAS_DOCUMENT_COOKIE) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const previousCookies = this.cookies;
|
|
215
|
+
this.cookies = cookieExports.parse(document.cookie);
|
|
216
|
+
this._checkChanges(previousCookies);
|
|
217
|
+
};
|
|
218
|
+
const domCookies = typeof document === "undefined" ? "" : document.cookie;
|
|
219
|
+
this.cookies = parseCookies(cookies2 || domCookies);
|
|
220
|
+
this.defaultSetOptions = defaultSetOptions;
|
|
221
|
+
this.HAS_DOCUMENT_COOKIE = hasDocumentCookie();
|
|
222
|
+
}
|
|
223
|
+
_emitChange(params) {
|
|
224
|
+
for (let i = 0; i < this.changeListeners.length; ++i) {
|
|
225
|
+
this.changeListeners[i](params);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
_checkChanges(previousCookies) {
|
|
229
|
+
const names = new Set(Object.keys(previousCookies).concat(Object.keys(this.cookies)));
|
|
230
|
+
names.forEach((name) => {
|
|
231
|
+
if (previousCookies[name] !== this.cookies[name]) {
|
|
232
|
+
this._emitChange({
|
|
233
|
+
name,
|
|
234
|
+
value: readCookie(this.cookies[name])
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
_startPolling() {
|
|
240
|
+
this.pollingInterval = setInterval(this.update, 300);
|
|
241
|
+
}
|
|
242
|
+
_stopPolling() {
|
|
243
|
+
if (this.pollingInterval) {
|
|
244
|
+
clearInterval(this.pollingInterval);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
get(name, options = {}) {
|
|
248
|
+
if (!options.doNotUpdate) {
|
|
249
|
+
this.update();
|
|
250
|
+
}
|
|
251
|
+
return readCookie(this.cookies[name], options);
|
|
252
|
+
}
|
|
253
|
+
getAll(options = {}) {
|
|
254
|
+
if (!options.doNotUpdate) {
|
|
255
|
+
this.update();
|
|
256
|
+
}
|
|
257
|
+
const result = {};
|
|
258
|
+
for (let name in this.cookies) {
|
|
259
|
+
result[name] = readCookie(this.cookies[name], options);
|
|
260
|
+
}
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
263
|
+
set(name, value, options) {
|
|
264
|
+
if (options) {
|
|
265
|
+
options = Object.assign(Object.assign({}, this.defaultSetOptions), options);
|
|
266
|
+
} else {
|
|
267
|
+
options = this.defaultSetOptions;
|
|
268
|
+
}
|
|
269
|
+
const stringValue = typeof value === "string" ? value : JSON.stringify(value);
|
|
270
|
+
this.cookies = Object.assign(Object.assign({}, this.cookies), { [name]: stringValue });
|
|
271
|
+
if (this.HAS_DOCUMENT_COOKIE) {
|
|
272
|
+
document.cookie = cookieExports.serialize(name, stringValue, options);
|
|
273
|
+
}
|
|
274
|
+
this._emitChange({ name, value, options });
|
|
275
|
+
}
|
|
276
|
+
remove(name, options) {
|
|
277
|
+
const finalOptions = options = Object.assign(Object.assign(Object.assign({}, this.defaultSetOptions), options), { expires: new Date(1970, 1, 1, 0, 0, 1), maxAge: 0 });
|
|
278
|
+
this.cookies = Object.assign({}, this.cookies);
|
|
279
|
+
delete this.cookies[name];
|
|
280
|
+
if (this.HAS_DOCUMENT_COOKIE) {
|
|
281
|
+
document.cookie = cookieExports.serialize(name, "", finalOptions);
|
|
282
|
+
}
|
|
283
|
+
this._emitChange({ name, value: void 0, options });
|
|
284
|
+
}
|
|
285
|
+
addChangeListener(callback) {
|
|
286
|
+
this.changeListeners.push(callback);
|
|
287
|
+
if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 1) {
|
|
288
|
+
if (typeof window === "object" && "cookieStore" in window) {
|
|
289
|
+
window.cookieStore.addEventListener("change", this.update);
|
|
290
|
+
} else {
|
|
291
|
+
this._startPolling();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
removeChangeListener(callback) {
|
|
296
|
+
const idx = this.changeListeners.indexOf(callback);
|
|
297
|
+
if (idx >= 0) {
|
|
298
|
+
this.changeListeners.splice(idx, 1);
|
|
299
|
+
}
|
|
300
|
+
if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 0) {
|
|
301
|
+
if (typeof window === "object" && "cookieStore" in window) {
|
|
302
|
+
window.cookieStore.removeEventListener("change", this.update);
|
|
303
|
+
} else {
|
|
304
|
+
this._stopPolling();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const cookies = new Cookies();
|
|
310
|
+
const MAX_ATTEMPTS = 10;
|
|
311
|
+
const RATE_LIMIT_DURATION = 3 * 60 * 60 * 1e3;
|
|
312
|
+
const readStoredNumber = async (adapter, key) => {
|
|
313
|
+
const value = await adapter.getItem(key);
|
|
314
|
+
const parsed = parseInt((value ?? "0").toString(), 10);
|
|
315
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
316
|
+
};
|
|
317
|
+
const writeStoredNumber = async (adapter, key, value) => {
|
|
318
|
+
await adapter.setItem(key, value.toString());
|
|
319
|
+
};
|
|
320
|
+
const hasConnectedSocketId = (socket) => {
|
|
321
|
+
if (!socket || typeof socket !== "object") {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
const candidate = socket;
|
|
325
|
+
return typeof candidate.id === "string" && candidate.id.length > 0;
|
|
326
|
+
};
|
|
327
|
+
const checkLimitsAndMakeRequestWithStorage = async ({
|
|
328
|
+
apiUserName,
|
|
329
|
+
apiToken,
|
|
330
|
+
link,
|
|
331
|
+
apiKey = "",
|
|
332
|
+
userName,
|
|
333
|
+
parameters,
|
|
334
|
+
validate = true,
|
|
335
|
+
storageAdapter
|
|
336
|
+
}) => {
|
|
337
|
+
const TIMEOUT_DURATION = 1e4;
|
|
338
|
+
try {
|
|
339
|
+
let unsuccessfulAttempts = await readStoredNumber(storageAdapter, "unsuccessfulAttempts");
|
|
340
|
+
const lastRequestTimestamp = await readStoredNumber(storageAdapter, "lastRequestTimestamp");
|
|
341
|
+
if (unsuccessfulAttempts >= MAX_ATTEMPTS && Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {
|
|
342
|
+
parameters.showAlert?.({
|
|
343
|
+
message: "Too many unsuccessful attempts. Please try again later.",
|
|
344
|
+
type: "danger",
|
|
345
|
+
duration: 3e3
|
|
346
|
+
});
|
|
347
|
+
await writeStoredNumber(storageAdapter, "lastRequestTimestamp", Date.now());
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
|
|
351
|
+
unsuccessfulAttempts = 0;
|
|
352
|
+
await writeStoredNumber(storageAdapter, "unsuccessfulAttempts", unsuccessfulAttempts);
|
|
353
|
+
await writeStoredNumber(storageAdapter, "lastRequestTimestamp", Date.now());
|
|
354
|
+
}
|
|
355
|
+
parameters.updateIsLoadingModalVisible(true);
|
|
356
|
+
const socketPromise = parameters.connectSocket({
|
|
357
|
+
apiUserName,
|
|
358
|
+
apiKey,
|
|
359
|
+
apiToken,
|
|
360
|
+
link
|
|
361
|
+
});
|
|
362
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(
|
|
363
|
+
() => reject(new Error("Request timed out")),
|
|
364
|
+
TIMEOUT_DURATION
|
|
365
|
+
));
|
|
366
|
+
const socket = await Promise.race([socketPromise, timeoutPromise]);
|
|
367
|
+
if (hasConnectedSocketId(socket)) {
|
|
368
|
+
unsuccessfulAttempts = 0;
|
|
369
|
+
await writeStoredNumber(storageAdapter, "unsuccessfulAttempts", unsuccessfulAttempts);
|
|
370
|
+
await writeStoredNumber(storageAdapter, "lastRequestTimestamp", Date.now());
|
|
371
|
+
if (validate) {
|
|
372
|
+
parameters.updateSocket(socket);
|
|
373
|
+
} else {
|
|
374
|
+
parameters.updateLocalSocket?.(socket);
|
|
375
|
+
}
|
|
376
|
+
parameters.updateApiUserName(apiUserName);
|
|
377
|
+
parameters.updateApiToken(apiToken);
|
|
378
|
+
parameters.updateLink(link);
|
|
379
|
+
parameters.updateRoomName(apiUserName);
|
|
380
|
+
parameters.updateMember(userName);
|
|
381
|
+
if (validate) {
|
|
382
|
+
parameters.updateValidated(true);
|
|
383
|
+
}
|
|
384
|
+
} else {
|
|
385
|
+
unsuccessfulAttempts += 1;
|
|
386
|
+
await writeStoredNumber(storageAdapter, "unsuccessfulAttempts", unsuccessfulAttempts);
|
|
387
|
+
await writeStoredNumber(storageAdapter, "lastRequestTimestamp", Date.now());
|
|
388
|
+
parameters.updateIsLoadingModalVisible(false);
|
|
389
|
+
if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
|
|
390
|
+
parameters.showAlert?.({
|
|
391
|
+
message: "Too many unsuccessful attempts. Please try again later.",
|
|
392
|
+
type: "danger",
|
|
393
|
+
duration: 3e3
|
|
394
|
+
});
|
|
395
|
+
} else {
|
|
396
|
+
parameters.showAlert?.({
|
|
397
|
+
message: "Invalid credentials.",
|
|
398
|
+
type: "danger",
|
|
399
|
+
duration: 3e3
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
} catch (error) {
|
|
404
|
+
console.error("Error connecting to socket:", error);
|
|
405
|
+
parameters.showAlert?.({
|
|
406
|
+
message: "Unable to connect. Check your credentials and try again.",
|
|
407
|
+
type: "danger",
|
|
408
|
+
duration: 3e3
|
|
409
|
+
});
|
|
410
|
+
let unsuccessfulAttempts = await readStoredNumber(storageAdapter, "unsuccessfulAttempts");
|
|
411
|
+
unsuccessfulAttempts += 1;
|
|
412
|
+
await writeStoredNumber(storageAdapter, "unsuccessfulAttempts", unsuccessfulAttempts);
|
|
413
|
+
await writeStoredNumber(storageAdapter, "lastRequestTimestamp", Date.now());
|
|
414
|
+
parameters.updateIsLoadingModalVisible(false);
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
const checkLimitsAndMakeRequest = async ({
|
|
418
|
+
apiUserName,
|
|
419
|
+
apiToken,
|
|
420
|
+
link,
|
|
421
|
+
apiKey = "",
|
|
422
|
+
userName,
|
|
423
|
+
parameters,
|
|
424
|
+
validate = true
|
|
425
|
+
}) => {
|
|
426
|
+
const TIMEOUT_DURATION = 1e4;
|
|
427
|
+
let unsuccessfulAttempts = parseInt(cookies.get("unsuccessfulAttempts")) || 0;
|
|
428
|
+
let lastRequestTimestamp = parseInt(cookies.get("lastRequestTimestamp")) || 0;
|
|
429
|
+
if (unsuccessfulAttempts >= MAX_ATTEMPTS && Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {
|
|
430
|
+
parameters.showAlert?.({
|
|
431
|
+
message: "Too many unsuccessful attempts. Please try again later.",
|
|
432
|
+
type: "danger",
|
|
433
|
+
duration: 3e3
|
|
434
|
+
});
|
|
435
|
+
return;
|
|
436
|
+
} else {
|
|
437
|
+
unsuccessfulAttempts = 0;
|
|
438
|
+
cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
|
|
439
|
+
cookies.set("lastRequestTimestamp", Date.now().toString());
|
|
440
|
+
}
|
|
441
|
+
try {
|
|
442
|
+
parameters.updateIsLoadingModalVisible(true);
|
|
443
|
+
const socketPromise = await parameters.connectSocket({
|
|
444
|
+
apiUserName,
|
|
445
|
+
apiKey,
|
|
446
|
+
apiToken,
|
|
447
|
+
link
|
|
448
|
+
});
|
|
449
|
+
const timeoutPromise = new Promise(
|
|
450
|
+
(_, reject) => setTimeout(
|
|
451
|
+
() => reject(new Error("Request timed out")),
|
|
452
|
+
TIMEOUT_DURATION
|
|
453
|
+
)
|
|
454
|
+
);
|
|
455
|
+
const socket = await Promise.race([socketPromise, timeoutPromise]);
|
|
456
|
+
if (hasConnectedSocketId(socket)) {
|
|
457
|
+
unsuccessfulAttempts = 0;
|
|
458
|
+
cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
|
|
459
|
+
cookies.set("lastRequestTimestamp", Date.now().toString());
|
|
460
|
+
if (validate) {
|
|
461
|
+
parameters.updateSocket(socket);
|
|
462
|
+
} else {
|
|
463
|
+
parameters.updateLocalSocket?.(socket);
|
|
464
|
+
}
|
|
465
|
+
parameters.updateApiUserName(apiUserName);
|
|
466
|
+
parameters.updateApiToken(apiToken);
|
|
467
|
+
parameters.updateLink(link);
|
|
468
|
+
parameters.updateRoomName(apiUserName);
|
|
469
|
+
parameters.updateMember(userName);
|
|
470
|
+
if (validate) parameters.updateValidated(true);
|
|
471
|
+
} else {
|
|
472
|
+
unsuccessfulAttempts += 1;
|
|
473
|
+
cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
|
|
474
|
+
parameters.updateIsLoadingModalVisible(false);
|
|
475
|
+
parameters.showAlert?.({
|
|
476
|
+
message: "Invalid credentials.",
|
|
477
|
+
type: "danger",
|
|
478
|
+
duration: 3e3
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
} catch {
|
|
482
|
+
parameters.showAlert?.({
|
|
483
|
+
message: "Unable to connect. Check your credentials and try again.",
|
|
484
|
+
type: "danger",
|
|
485
|
+
duration: 3e3
|
|
486
|
+
});
|
|
487
|
+
unsuccessfulAttempts += 1;
|
|
488
|
+
cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
|
|
489
|
+
parameters.updateIsLoadingModalVisible(false);
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
const hostRequestResponse = async ({
|
|
493
|
+
requestResponse,
|
|
494
|
+
showAlert,
|
|
495
|
+
requestList,
|
|
496
|
+
updateRequestList,
|
|
497
|
+
updateMicAction,
|
|
498
|
+
updateVideoAction,
|
|
499
|
+
updateScreenAction,
|
|
500
|
+
updateChatAction,
|
|
501
|
+
updateAudioRequestState,
|
|
502
|
+
updateVideoRequestState,
|
|
503
|
+
updateScreenRequestState,
|
|
504
|
+
updateChatRequestState,
|
|
505
|
+
updateAudioRequestTime,
|
|
506
|
+
updateVideoRequestTime,
|
|
507
|
+
updateScreenRequestTime,
|
|
508
|
+
updateChatRequestTime,
|
|
509
|
+
updateRequestIntervalSeconds
|
|
510
|
+
}) => {
|
|
511
|
+
const requestType = requestResponse.type ?? requestResponse.icon;
|
|
512
|
+
const filteredRequests = requestList.filter(
|
|
513
|
+
(request) => {
|
|
514
|
+
const matchesId = request.id === requestResponse.id;
|
|
515
|
+
const matchesType = requestType == null || request.icon === requestType;
|
|
516
|
+
const matchesName = requestResponse.name == null || request.name === requestResponse.name;
|
|
517
|
+
const matchesUsername = requestResponse.username == null || request.username === requestResponse.username;
|
|
518
|
+
return !(matchesId && matchesType && matchesName && matchesUsername);
|
|
519
|
+
}
|
|
520
|
+
);
|
|
521
|
+
updateRequestList(filteredRequests);
|
|
522
|
+
if (requestResponse.action === "accepted") {
|
|
523
|
+
switch (requestType) {
|
|
524
|
+
case "fa-microphone":
|
|
525
|
+
showAlert?.({
|
|
526
|
+
message: "Unmute request was accepted; click the mic button again to begin.",
|
|
527
|
+
type: "success",
|
|
528
|
+
duration: 1e4
|
|
529
|
+
});
|
|
530
|
+
updateMicAction(true);
|
|
531
|
+
updateAudioRequestState("accepted");
|
|
532
|
+
break;
|
|
533
|
+
case "fa-video":
|
|
534
|
+
showAlert?.({
|
|
535
|
+
message: "Video request was accepted; click the video button again to begin.",
|
|
536
|
+
type: "success",
|
|
537
|
+
duration: 1e4
|
|
538
|
+
});
|
|
539
|
+
updateVideoAction(true);
|
|
540
|
+
updateVideoRequestState("accepted");
|
|
541
|
+
break;
|
|
542
|
+
case "fa-desktop":
|
|
543
|
+
showAlert?.({
|
|
544
|
+
message: "Screenshare request was accepted; click the screen button again to begin.",
|
|
545
|
+
type: "success",
|
|
546
|
+
duration: 1e4
|
|
547
|
+
});
|
|
548
|
+
updateScreenAction(true);
|
|
549
|
+
updateScreenRequestState("accepted");
|
|
550
|
+
break;
|
|
551
|
+
case "fa-comments":
|
|
552
|
+
showAlert?.({
|
|
553
|
+
message: "Chat request was accepted; click the chat button again to begin.",
|
|
554
|
+
type: "success",
|
|
555
|
+
duration: 1e4
|
|
556
|
+
});
|
|
557
|
+
updateChatAction(true);
|
|
558
|
+
updateChatRequestState("accepted");
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
} else {
|
|
562
|
+
let timerDate;
|
|
563
|
+
switch (requestType) {
|
|
564
|
+
case "fa-microphone":
|
|
565
|
+
showAlert?.({
|
|
566
|
+
message: "Unmute request was not accepted",
|
|
567
|
+
type: "danger",
|
|
568
|
+
duration: 1e4
|
|
569
|
+
});
|
|
570
|
+
updateAudioRequestState("rejected");
|
|
571
|
+
timerDate = /* @__PURE__ */ new Date();
|
|
572
|
+
timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);
|
|
573
|
+
updateAudioRequestTime(timerDate.getTime());
|
|
574
|
+
break;
|
|
575
|
+
case "fa-video":
|
|
576
|
+
showAlert?.({
|
|
577
|
+
message: "Video request was not accepted",
|
|
578
|
+
type: "danger",
|
|
579
|
+
duration: 1e4
|
|
580
|
+
});
|
|
581
|
+
updateVideoRequestState("rejected");
|
|
582
|
+
timerDate = /* @__PURE__ */ new Date();
|
|
583
|
+
timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);
|
|
584
|
+
updateVideoRequestTime(timerDate.getTime());
|
|
585
|
+
break;
|
|
586
|
+
case "fa-desktop":
|
|
587
|
+
showAlert?.({
|
|
588
|
+
message: "Screenshare request was not accepted",
|
|
589
|
+
type: "danger",
|
|
590
|
+
duration: 1e4
|
|
591
|
+
});
|
|
592
|
+
updateScreenRequestState("rejected");
|
|
593
|
+
timerDate = /* @__PURE__ */ new Date();
|
|
594
|
+
timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);
|
|
595
|
+
updateScreenRequestTime(timerDate.getTime());
|
|
596
|
+
break;
|
|
597
|
+
case "fa-comments":
|
|
598
|
+
showAlert?.({
|
|
599
|
+
message: "Chat request was not accepted",
|
|
600
|
+
type: "danger",
|
|
601
|
+
duration: 1e4
|
|
602
|
+
});
|
|
603
|
+
updateChatRequestState("rejected");
|
|
604
|
+
timerDate = /* @__PURE__ */ new Date();
|
|
605
|
+
timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);
|
|
606
|
+
updateChatRequestTime(timerDate.getTime());
|
|
607
|
+
break;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
};
|
|
611
|
+
const clickAudio = async ({ parameters }) => {
|
|
612
|
+
let {
|
|
613
|
+
checkMediaPermission,
|
|
614
|
+
hasAudioPermission,
|
|
615
|
+
audioPaused,
|
|
616
|
+
audioAlreadyOn,
|
|
617
|
+
audioOnlyRoom,
|
|
618
|
+
recordStarted,
|
|
619
|
+
recordResumed,
|
|
620
|
+
recordPaused,
|
|
621
|
+
recordStopped,
|
|
622
|
+
recordingMediaOptions,
|
|
623
|
+
islevel,
|
|
624
|
+
youAreCoHost,
|
|
625
|
+
adminRestrictSetting,
|
|
626
|
+
audioRequestState,
|
|
627
|
+
audioRequestTime,
|
|
628
|
+
member,
|
|
629
|
+
socket,
|
|
630
|
+
localSocket,
|
|
631
|
+
roomName,
|
|
632
|
+
userDefaultAudioInputDevice,
|
|
633
|
+
micAction,
|
|
634
|
+
localStream,
|
|
635
|
+
audioSetting,
|
|
636
|
+
videoSetting,
|
|
637
|
+
screenshareSetting,
|
|
638
|
+
chatSetting,
|
|
639
|
+
updateRequestIntervalSeconds,
|
|
640
|
+
participants,
|
|
641
|
+
mediaDevices,
|
|
642
|
+
showAlert,
|
|
643
|
+
transportCreated,
|
|
644
|
+
transportCreatedAudio,
|
|
645
|
+
updateAudioAlreadyOn,
|
|
646
|
+
updateAudioRequestState,
|
|
647
|
+
updateAudioPaused,
|
|
648
|
+
updateLocalStream,
|
|
649
|
+
updateParticipants,
|
|
650
|
+
updateTransportCreated,
|
|
651
|
+
updateTransportCreatedAudio,
|
|
652
|
+
updateMicAction,
|
|
653
|
+
checkPermission,
|
|
654
|
+
streamSuccessAudio,
|
|
655
|
+
requestPermissionAudio,
|
|
656
|
+
resumeSendTransportAudio,
|
|
657
|
+
disconnectSendTransportAudio
|
|
658
|
+
} = parameters;
|
|
659
|
+
if (audioOnlyRoom) {
|
|
660
|
+
showAlert?.({
|
|
661
|
+
message: "You cannot turn on your camera in an audio-only event.",
|
|
662
|
+
type: "danger",
|
|
663
|
+
duration: 3e3
|
|
664
|
+
});
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
if (audioAlreadyOn) {
|
|
668
|
+
if (islevel === "2" && (recordStarted || recordResumed)) {
|
|
669
|
+
if (!(recordPaused || recordStopped)) {
|
|
670
|
+
if (recordingMediaOptions === "audio") {
|
|
671
|
+
showAlert?.({
|
|
672
|
+
message: "You cannot turn off your audio while recording, please pause or stop recording first.",
|
|
673
|
+
type: "danger",
|
|
674
|
+
duration: 3e3
|
|
675
|
+
});
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
audioAlreadyOn = false;
|
|
681
|
+
updateAudioAlreadyOn(audioAlreadyOn);
|
|
682
|
+
if (localStream && localStream.getAudioTracks().length > 0) {
|
|
683
|
+
localStream.getAudioTracks()[0].enabled = false;
|
|
684
|
+
updateLocalStream(localStream);
|
|
685
|
+
}
|
|
686
|
+
await disconnectSendTransportAudio({ parameters });
|
|
687
|
+
audioPaused = true;
|
|
688
|
+
updateAudioPaused(audioPaused);
|
|
689
|
+
} else {
|
|
690
|
+
if (adminRestrictSetting) {
|
|
691
|
+
showAlert?.({
|
|
692
|
+
message: "You cannot turn on your microphone. Access denied by host.",
|
|
693
|
+
type: "danger",
|
|
694
|
+
duration: 3e3
|
|
695
|
+
});
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
const supportMaxRoom = parameters.supportMaxRoom;
|
|
699
|
+
const supportFlexRoom = parameters.supportFlexRoom;
|
|
700
|
+
if ((supportMaxRoom || supportFlexRoom) && islevel !== "2") {
|
|
701
|
+
try {
|
|
702
|
+
const checkResult = await new Promise((resolve) => {
|
|
703
|
+
socket.emit(
|
|
704
|
+
"checkProduce",
|
|
705
|
+
{ kind: "audio" },
|
|
706
|
+
(response2) => {
|
|
707
|
+
resolve(response2 || { allowed: false, reason: "No response from server" });
|
|
708
|
+
}
|
|
709
|
+
);
|
|
710
|
+
setTimeout(() => resolve({ allowed: true }), 5e3);
|
|
711
|
+
});
|
|
712
|
+
if (!checkResult.allowed) {
|
|
713
|
+
showAlert?.({
|
|
714
|
+
message: checkResult.reason || `Audio producer limit reached (${checkResult.producingCount}/${checkResult.producerLimit}).`,
|
|
715
|
+
type: "danger",
|
|
716
|
+
duration: 3e3
|
|
717
|
+
});
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
} catch (error) {
|
|
721
|
+
console.warn("Failed to check producer limit:", error);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
const panelistsFocused = parameters.panelistsFocused;
|
|
725
|
+
const muteOthersMic = parameters.muteOthersMic;
|
|
726
|
+
const panelists = parameters.panelists;
|
|
727
|
+
if (panelistsFocused && muteOthersMic && islevel !== "2") {
|
|
728
|
+
const isPanelist = panelists?.some((panelist) => panelist.name === member) || false;
|
|
729
|
+
if (!isPanelist) {
|
|
730
|
+
showAlert?.({
|
|
731
|
+
message: "You cannot turn on your microphone. Only panelists can unmute while focus mode is active.",
|
|
732
|
+
type: "danger",
|
|
733
|
+
duration: 3e3
|
|
734
|
+
});
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
let response = 2;
|
|
739
|
+
if (!micAction && islevel !== "2" && !youAreCoHost) {
|
|
740
|
+
response = await checkPermission({
|
|
741
|
+
permissionType: "audioSetting",
|
|
742
|
+
audioSetting,
|
|
743
|
+
videoSetting,
|
|
744
|
+
screenshareSetting,
|
|
745
|
+
chatSetting,
|
|
746
|
+
permissionConfig: parameters.permissionConfig,
|
|
747
|
+
participantLevel: islevel
|
|
748
|
+
});
|
|
749
|
+
} else {
|
|
750
|
+
response = 0;
|
|
751
|
+
}
|
|
752
|
+
switch (response) {
|
|
753
|
+
case 1: {
|
|
754
|
+
if (audioRequestState === "pending") {
|
|
755
|
+
showAlert?.({
|
|
756
|
+
message: "A request is pending. Please wait for the host to respond.",
|
|
757
|
+
type: "danger",
|
|
758
|
+
duration: 3e3
|
|
759
|
+
});
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
if (audioRequestState === "rejected" && Date.now() - audioRequestTime < updateRequestIntervalSeconds * 1e3) {
|
|
763
|
+
showAlert?.({
|
|
764
|
+
message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,
|
|
765
|
+
type: "danger",
|
|
766
|
+
duration: 3e3
|
|
767
|
+
});
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
showAlert?.({
|
|
771
|
+
message: "Request sent to host.",
|
|
772
|
+
type: "success",
|
|
773
|
+
duration: 3e3
|
|
774
|
+
});
|
|
775
|
+
audioRequestState = "pending";
|
|
776
|
+
updateAudioRequestState(audioRequestState);
|
|
777
|
+
const userRequest = {
|
|
778
|
+
id: socket.id,
|
|
779
|
+
name: member,
|
|
780
|
+
icon: "fa-microphone"
|
|
781
|
+
};
|
|
782
|
+
socket.emit("participantRequest", { userRequest, roomName });
|
|
783
|
+
break;
|
|
784
|
+
}
|
|
785
|
+
case 2:
|
|
786
|
+
showAlert?.({
|
|
787
|
+
message: "You cannot turn on your microphone. Access denied by host.",
|
|
788
|
+
type: "danger",
|
|
789
|
+
duration: 3e3
|
|
790
|
+
});
|
|
791
|
+
break;
|
|
792
|
+
case 0:
|
|
793
|
+
if (audioPaused) {
|
|
794
|
+
if (localStream && localStream.getAudioTracks().length > 0) {
|
|
795
|
+
localStream.getAudioTracks()[0].enabled = true;
|
|
796
|
+
}
|
|
797
|
+
updateAudioAlreadyOn(true);
|
|
798
|
+
await resumeSendTransportAudio({ parameters });
|
|
799
|
+
socket.emit("resumeProducerAudio", { mediaTag: "audio", roomName });
|
|
800
|
+
try {
|
|
801
|
+
if (localSocket && localSocket.id) {
|
|
802
|
+
localSocket.emit("resumeProducerAudio", { mediaTag: "audio", roomName });
|
|
803
|
+
}
|
|
804
|
+
} catch (error) {
|
|
805
|
+
console.log("Error in resumeProducerAudio", error);
|
|
806
|
+
}
|
|
807
|
+
updateLocalStream(localStream);
|
|
808
|
+
if (micAction === true) {
|
|
809
|
+
micAction = false;
|
|
810
|
+
updateMicAction(micAction);
|
|
811
|
+
}
|
|
812
|
+
participants.forEach((participant) => {
|
|
813
|
+
if (participant.socketId === socket.id && participant.name === member) {
|
|
814
|
+
participant.muted = false;
|
|
815
|
+
}
|
|
816
|
+
});
|
|
817
|
+
updateParticipants(participants);
|
|
818
|
+
transportCreated = true;
|
|
819
|
+
updateTransportCreated(transportCreated);
|
|
820
|
+
transportCreatedAudio = true;
|
|
821
|
+
updateTransportCreatedAudio(transportCreatedAudio);
|
|
822
|
+
} else {
|
|
823
|
+
if (!hasAudioPermission && checkMediaPermission) {
|
|
824
|
+
const statusMic = await requestPermissionAudio();
|
|
825
|
+
if (statusMic !== "granted") {
|
|
826
|
+
showAlert?.({
|
|
827
|
+
message: "Allow access to your microphone or check if your microphone is not being used by another application.",
|
|
828
|
+
type: "danger",
|
|
829
|
+
duration: 3e3
|
|
830
|
+
});
|
|
831
|
+
return;
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
const mediaConstraints = userDefaultAudioInputDevice ? { audio: { deviceId: userDefaultAudioInputDevice }, video: false } : { audio: true, video: false };
|
|
835
|
+
try {
|
|
836
|
+
const stream = await mediaDevices.getUserMedia(mediaConstraints);
|
|
837
|
+
await streamSuccessAudio({ stream, parameters });
|
|
838
|
+
} catch (error) {
|
|
839
|
+
console.error(error);
|
|
840
|
+
showAlert?.({
|
|
841
|
+
message: "Allow access to your microphone or check if your microphone is not being used by another application.",
|
|
842
|
+
type: "danger",
|
|
843
|
+
duration: 3e3
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
break;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
};
|
|
851
|
+
const clickScreenShare = async ({ parameters }) => {
|
|
852
|
+
let {
|
|
853
|
+
showAlert,
|
|
854
|
+
roomName,
|
|
855
|
+
member,
|
|
856
|
+
socket,
|
|
857
|
+
islevel,
|
|
858
|
+
youAreCoHost,
|
|
859
|
+
adminRestrictSetting,
|
|
860
|
+
audioSetting,
|
|
861
|
+
videoSetting,
|
|
862
|
+
screenshareSetting,
|
|
863
|
+
chatSetting,
|
|
864
|
+
screenAction,
|
|
865
|
+
screenAlreadyOn,
|
|
866
|
+
screenRequestState,
|
|
867
|
+
screenRequestTime,
|
|
868
|
+
audioOnlyRoom,
|
|
869
|
+
updateRequestIntervalSeconds,
|
|
870
|
+
updateScreenRequestState,
|
|
871
|
+
updateScreenAlreadyOn,
|
|
872
|
+
checkPermission,
|
|
873
|
+
checkScreenShare,
|
|
874
|
+
stopShareScreen
|
|
875
|
+
} = parameters;
|
|
876
|
+
if (audioOnlyRoom) {
|
|
877
|
+
showAlert?.({
|
|
878
|
+
message: "You cannot turn on your camera in an audio-only event.",
|
|
879
|
+
type: "danger",
|
|
880
|
+
duration: 3e3
|
|
881
|
+
});
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
if (screenAlreadyOn) {
|
|
885
|
+
screenAlreadyOn = false;
|
|
886
|
+
updateScreenAlreadyOn(screenAlreadyOn);
|
|
887
|
+
await stopShareScreen({ parameters });
|
|
888
|
+
} else {
|
|
889
|
+
if (adminRestrictSetting) {
|
|
890
|
+
showAlert?.({
|
|
891
|
+
message: "You cannot start screen share. Access denied by host.",
|
|
892
|
+
type: "danger",
|
|
893
|
+
duration: 3e3
|
|
894
|
+
});
|
|
895
|
+
return;
|
|
896
|
+
}
|
|
897
|
+
let response = 2;
|
|
898
|
+
if (!screenAction && islevel !== "2" && !youAreCoHost) {
|
|
899
|
+
response = await checkPermission({
|
|
900
|
+
permissionType: "screenshareSetting",
|
|
901
|
+
audioSetting,
|
|
902
|
+
videoSetting,
|
|
903
|
+
screenshareSetting,
|
|
904
|
+
chatSetting,
|
|
905
|
+
permissionConfig: parameters.permissionConfig,
|
|
906
|
+
participantLevel: islevel
|
|
907
|
+
});
|
|
908
|
+
} else {
|
|
909
|
+
response = 0;
|
|
910
|
+
}
|
|
911
|
+
switch (response) {
|
|
912
|
+
case 0:
|
|
913
|
+
checkScreenShare({ parameters });
|
|
914
|
+
break;
|
|
915
|
+
case 1: {
|
|
916
|
+
if (screenRequestState === "pending") {
|
|
917
|
+
showAlert?.({
|
|
918
|
+
message: "A request is already pending. Please wait for the host to respond.",
|
|
919
|
+
type: "danger",
|
|
920
|
+
duration: 3e3
|
|
921
|
+
});
|
|
922
|
+
return;
|
|
923
|
+
}
|
|
924
|
+
if (screenRequestState === "rejected" && Date.now() - screenRequestTime < updateRequestIntervalSeconds) {
|
|
925
|
+
showAlert?.({
|
|
926
|
+
message: "You cannot send another request at this time.",
|
|
927
|
+
type: "danger",
|
|
928
|
+
duration: 3e3
|
|
929
|
+
});
|
|
930
|
+
return;
|
|
931
|
+
}
|
|
932
|
+
showAlert?.({
|
|
933
|
+
message: "Your request has been sent to the host.",
|
|
934
|
+
type: "success",
|
|
935
|
+
duration: 3e3
|
|
936
|
+
});
|
|
937
|
+
screenRequestState = "pending";
|
|
938
|
+
updateScreenRequestState(screenRequestState);
|
|
939
|
+
const userRequest = { id: socket.id, name: member, icon: "fa-desktop" };
|
|
940
|
+
socket.emit("participantRequest", { userRequest, roomName });
|
|
941
|
+
break;
|
|
942
|
+
}
|
|
943
|
+
case 2:
|
|
944
|
+
showAlert?.({
|
|
945
|
+
message: "You are not allowed to start screen share.",
|
|
946
|
+
type: "danger",
|
|
947
|
+
duration: 3e3
|
|
948
|
+
});
|
|
949
|
+
break;
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
};
|
|
953
|
+
const timeLeftRecording = ({ timeLeft, showAlert }) => {
|
|
954
|
+
try {
|
|
955
|
+
showAlert?.({
|
|
956
|
+
message: `The recording will stop in less than ${timeLeft} seconds.`,
|
|
957
|
+
duration: 3e3,
|
|
958
|
+
type: "danger"
|
|
959
|
+
});
|
|
960
|
+
} catch (error) {
|
|
961
|
+
console.log("Error in timeLeftRecording: ", error);
|
|
962
|
+
}
|
|
963
|
+
};
|
|
964
|
+
const captureCanvasStream = async ({
|
|
965
|
+
parameters,
|
|
966
|
+
start = true
|
|
967
|
+
}) => {
|
|
968
|
+
try {
|
|
969
|
+
let {
|
|
970
|
+
canvasWhiteboard,
|
|
971
|
+
canvasStream,
|
|
972
|
+
updateCanvasStream,
|
|
973
|
+
screenProducer,
|
|
974
|
+
localScreenProducer,
|
|
975
|
+
transportCreated,
|
|
976
|
+
localTransportCreated,
|
|
977
|
+
updateScreenProducer,
|
|
978
|
+
updateLocalScreenProducer,
|
|
979
|
+
localSocket,
|
|
980
|
+
sleep,
|
|
981
|
+
createSendTransport,
|
|
982
|
+
connectSendTransportScreen,
|
|
983
|
+
disconnectSendTransportScreen
|
|
984
|
+
} = parameters;
|
|
985
|
+
if (start && !canvasStream) {
|
|
986
|
+
const stream = canvasWhiteboard.captureStream(30);
|
|
987
|
+
canvasStream = stream;
|
|
988
|
+
updateCanvasStream(stream);
|
|
989
|
+
if (localSocket && !localSocket.id) {
|
|
990
|
+
try {
|
|
991
|
+
if (!localTransportCreated) {
|
|
992
|
+
await createSendTransport({ option: "screen", parameters });
|
|
993
|
+
} else {
|
|
994
|
+
try {
|
|
995
|
+
if (localScreenProducer) {
|
|
996
|
+
localScreenProducer.close();
|
|
997
|
+
if (updateLocalScreenProducer) {
|
|
998
|
+
updateLocalScreenProducer(null);
|
|
999
|
+
}
|
|
1000
|
+
await sleep({ ms: 500 });
|
|
1001
|
+
}
|
|
1002
|
+
} catch (error) {
|
|
1003
|
+
console.error(error);
|
|
1004
|
+
}
|
|
1005
|
+
await connectSendTransportScreen({ stream, parameters });
|
|
1006
|
+
}
|
|
1007
|
+
} catch {
|
|
1008
|
+
}
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
if (!transportCreated) {
|
|
1012
|
+
await createSendTransport({ option: "screen", parameters });
|
|
1013
|
+
} else {
|
|
1014
|
+
try {
|
|
1015
|
+
if (screenProducer) {
|
|
1016
|
+
screenProducer.close();
|
|
1017
|
+
updateScreenProducer(null);
|
|
1018
|
+
await sleep({ ms: 500 });
|
|
1019
|
+
}
|
|
1020
|
+
} catch (error) {
|
|
1021
|
+
console.error(error);
|
|
1022
|
+
}
|
|
1023
|
+
await connectSendTransportScreen({ stream, parameters });
|
|
1024
|
+
}
|
|
1025
|
+
} else if (canvasStream && !start) {
|
|
1026
|
+
canvasStream.getTracks().forEach((track) => track.stop());
|
|
1027
|
+
canvasStream = null;
|
|
1028
|
+
updateCanvasStream(null);
|
|
1029
|
+
disconnectSendTransportScreen({ parameters });
|
|
1030
|
+
}
|
|
1031
|
+
} catch (error) {
|
|
1032
|
+
console.error(error, "error in captureCanvasStream");
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
const QnHDCons = { width: { ideal: 320 }, height: { ideal: 180 } };
|
|
1036
|
+
const sdCons = { width: { ideal: 640 }, height: { ideal: 360 } };
|
|
1037
|
+
const hdCons = { width: { ideal: 1280 }, height: { ideal: 720 } };
|
|
1038
|
+
const fhdCons = { width: { ideal: 1920 }, height: { ideal: 1080 } };
|
|
1039
|
+
const qhdCons = { width: { ideal: 2560 }, height: { ideal: 1440 } };
|
|
1040
|
+
const QnHDConsPort = { width: { ideal: 180 }, height: { ideal: 320 } };
|
|
1041
|
+
const sdConsPort = { width: { ideal: 360 }, height: { ideal: 640 } };
|
|
1042
|
+
const hdConsPort = { width: { ideal: 720 }, height: { ideal: 1280 } };
|
|
1043
|
+
const fhdConsPort = { width: { ideal: 1080 }, height: { ideal: 1920 } };
|
|
1044
|
+
const qhdConsPort = { width: { ideal: 1440 }, height: { ideal: 2560 } };
|
|
1045
|
+
const QnHDConsNeu = { width: { ideal: 240 }, height: { ideal: 240 } };
|
|
1046
|
+
const sdConsNeu = { width: { ideal: 480 }, height: { ideal: 480 } };
|
|
1047
|
+
const hdConsNeu = { width: { ideal: 960 }, height: { ideal: 960 } };
|
|
1048
|
+
const fhdConsNeu = { width: { ideal: 1440 }, height: { ideal: 1440 } };
|
|
1049
|
+
const qhdConsNeu = { width: { ideal: 1920 }, height: { ideal: 1920 } };
|
|
1050
|
+
const QnHDFrameRate = 5;
|
|
1051
|
+
const sdFrameRate = 10;
|
|
1052
|
+
const hdFrameRate = 15;
|
|
1053
|
+
const fhdFrameRate = 20;
|
|
1054
|
+
const qhdFrameRate = 30;
|
|
1055
|
+
const screenFrameRate = 30;
|
|
1056
|
+
const hParams = {
|
|
1057
|
+
encodings: [
|
|
1058
|
+
{
|
|
1059
|
+
rid: "r8",
|
|
1060
|
+
maxBitrate: 24e4,
|
|
1061
|
+
scalabilityMode: "L1T3",
|
|
1062
|
+
scaleResolutionDownBy: 4
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
rid: "r9",
|
|
1066
|
+
maxBitrate: 48e4,
|
|
1067
|
+
scalabilityMode: "L1T3",
|
|
1068
|
+
scaleResolutionDownBy: 2
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
rid: "r10",
|
|
1072
|
+
maxBitrate: 96e4,
|
|
1073
|
+
scalabilityMode: "L1T3"
|
|
1074
|
+
}
|
|
1075
|
+
],
|
|
1076
|
+
codecOptions: {
|
|
1077
|
+
videoGoogleStartBitrate: 384
|
|
1078
|
+
}
|
|
1079
|
+
};
|
|
1080
|
+
const vParams = {
|
|
1081
|
+
encodings: [
|
|
1082
|
+
{
|
|
1083
|
+
rid: "r3",
|
|
1084
|
+
maxBitrate: 2e5,
|
|
1085
|
+
scalabilityMode: "L1T3",
|
|
1086
|
+
scaleResolutionDownBy: 4
|
|
1087
|
+
},
|
|
1088
|
+
{
|
|
1089
|
+
rid: "r4",
|
|
1090
|
+
maxBitrate: 4e5,
|
|
1091
|
+
scalabilityMode: "L1T3",
|
|
1092
|
+
scaleResolutionDownBy: 2
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
rid: "r5",
|
|
1096
|
+
maxBitrate: 8e5,
|
|
1097
|
+
scalabilityMode: "L1T3"
|
|
1098
|
+
}
|
|
1099
|
+
],
|
|
1100
|
+
codecOptions: {
|
|
1101
|
+
videoGoogleStartBitrate: 320
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
const screenParams = {
|
|
1105
|
+
encodings: [
|
|
1106
|
+
{
|
|
1107
|
+
rid: "r7",
|
|
1108
|
+
maxBitrate: 3e6
|
|
1109
|
+
}
|
|
1110
|
+
],
|
|
1111
|
+
codecOptions: {
|
|
1112
|
+
videoGoogleStartBitrate: 1e3
|
|
1113
|
+
}
|
|
1114
|
+
};
|
|
1115
|
+
const aParams = {
|
|
1116
|
+
encodings: [
|
|
1117
|
+
{
|
|
1118
|
+
rid: "r0",
|
|
1119
|
+
maxBitrate: 64e3
|
|
1120
|
+
}
|
|
1121
|
+
]
|
|
1122
|
+
};
|
|
1123
|
+
const DEFAULT_MEDIA_SFU_ROOM_API_URL = "https://mediasfu.com/v1/rooms/";
|
|
1124
|
+
const getDefaultMediaSFURoomApiUrl = () => DEFAULT_MEDIA_SFU_ROOM_API_URL;
|
|
1125
|
+
const normalizeManagedRoomApi = (normalizedLink) => {
|
|
1126
|
+
if (normalizedLink.includes("/v1/rooms")) {
|
|
1127
|
+
return `${normalizedLink.replace(/\/$/, "")}/`;
|
|
1128
|
+
}
|
|
1129
|
+
return `${normalizedLink.replace(/\/$/, "")}/v1/rooms/`;
|
|
1130
|
+
};
|
|
1131
|
+
const resolveMediaSFURoomApi = (localLink, action) => {
|
|
1132
|
+
const normalizedLink = localLink?.trim();
|
|
1133
|
+
if (!normalizedLink) {
|
|
1134
|
+
return getDefaultMediaSFURoomApiUrl();
|
|
1135
|
+
}
|
|
1136
|
+
if (normalizedLink.includes("mediasfu.com")) {
|
|
1137
|
+
return normalizeManagedRoomApi(normalizedLink);
|
|
1138
|
+
}
|
|
1139
|
+
return `${normalizedLink.replace(/\/$/, "")}/${action}`;
|
|
1140
|
+
};
|
|
1141
|
+
const readResponseError = async (response) => {
|
|
1142
|
+
const fallbackMessage = `HTTP error! Status: ${response.status}`;
|
|
1143
|
+
try {
|
|
1144
|
+
const responseText = await response.text();
|
|
1145
|
+
if (!responseText) {
|
|
1146
|
+
return fallbackMessage;
|
|
1147
|
+
}
|
|
1148
|
+
const parsedResponse = JSON.parse(responseText);
|
|
1149
|
+
return parsedResponse.error || parsedResponse.message || responseText;
|
|
1150
|
+
} catch {
|
|
1151
|
+
return fallbackMessage;
|
|
1152
|
+
}
|
|
1153
|
+
};
|
|
1154
|
+
const joinRoomOnMediaSFU = async ({
|
|
1155
|
+
payload,
|
|
1156
|
+
apiUserName,
|
|
1157
|
+
apiKey,
|
|
1158
|
+
localLink = ""
|
|
1159
|
+
}) => {
|
|
1160
|
+
try {
|
|
1161
|
+
if (!apiUserName || !apiKey || apiUserName === "yourAPIUSERNAME" || apiKey === "yourAPIKEY" || apiKey.length !== 64 || apiUserName.length < 6) {
|
|
1162
|
+
return { data: { error: "Invalid credentials" }, success: false };
|
|
1163
|
+
}
|
|
1164
|
+
const finalLink = resolveMediaSFURoomApi(localLink, "joinRoom");
|
|
1165
|
+
const response = await fetch(finalLink, {
|
|
1166
|
+
method: "POST",
|
|
1167
|
+
headers: {
|
|
1168
|
+
"Content-Type": "application/json",
|
|
1169
|
+
Authorization: `Bearer ${apiUserName}:${apiKey}`
|
|
1170
|
+
},
|
|
1171
|
+
body: JSON.stringify(payload)
|
|
1172
|
+
});
|
|
1173
|
+
if (!response.ok) {
|
|
1174
|
+
throw new Error(await readResponseError(response));
|
|
1175
|
+
}
|
|
1176
|
+
const data = await response.json();
|
|
1177
|
+
return { data, success: true };
|
|
1178
|
+
} catch (error) {
|
|
1179
|
+
const errorMessage = error.reason || error.message || "unknown error";
|
|
1180
|
+
return {
|
|
1181
|
+
data: { error: `Unable to join room, ${errorMessage}` },
|
|
1182
|
+
success: false
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
};
|
|
1186
|
+
export {
|
|
1187
|
+
QnHDFrameRate as A,
|
|
1188
|
+
sdFrameRate as B,
|
|
1189
|
+
hdFrameRate as C,
|
|
1190
|
+
fhdFrameRate as D,
|
|
1191
|
+
qhdFrameRate as E,
|
|
1192
|
+
screenFrameRate as F,
|
|
1193
|
+
resolveMediaSFURoomApi as G,
|
|
1194
|
+
Cookies as H,
|
|
1195
|
+
QnHDCons as Q,
|
|
1196
|
+
checkLimitsAndMakeRequest as a,
|
|
1197
|
+
clickAudio as b,
|
|
1198
|
+
checkLimitsAndMakeRequestWithStorage as c,
|
|
1199
|
+
clickScreenShare as d,
|
|
1200
|
+
captureCanvasStream as e,
|
|
1201
|
+
aParams as f,
|
|
1202
|
+
hParams as g,
|
|
1203
|
+
hostRequestResponse as h,
|
|
1204
|
+
sdCons as i,
|
|
1205
|
+
joinRoomOnMediaSFU as j,
|
|
1206
|
+
hdCons as k,
|
|
1207
|
+
fhdCons as l,
|
|
1208
|
+
QnHDConsPort as m,
|
|
1209
|
+
sdConsPort as n,
|
|
1210
|
+
hdConsPort as o,
|
|
1211
|
+
fhdConsPort as p,
|
|
1212
|
+
qhdCons as q,
|
|
1213
|
+
qhdConsPort as r,
|
|
1214
|
+
screenParams as s,
|
|
1215
|
+
timeLeftRecording as t,
|
|
1216
|
+
QnHDConsNeu as u,
|
|
1217
|
+
vParams as v,
|
|
1218
|
+
sdConsNeu as w,
|
|
1219
|
+
hdConsNeu as x,
|
|
1220
|
+
fhdConsNeu as y,
|
|
1221
|
+
qhdConsNeu as z
|
|
1222
|
+
};
|
|
1223
|
+
//# sourceMappingURL=joinRoomOnMediaSFU-y6vJ1OBo.js.map
|