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.
Files changed (138) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +17 -0
  3. package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts +1 -1
  4. package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts.map +1 -1
  5. package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts +1 -1
  6. package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts.map +1 -1
  7. package/dist/consumers/connectIps.d.ts +1 -1
  8. package/dist/consumers/connectIps.d.ts.map +1 -1
  9. package/dist/consumers/connectRecvTransport.d.ts +1 -1
  10. package/dist/consumers/connectRecvTransport.d.ts.map +1 -1
  11. package/dist/consumers/connectSendTransport.d.ts +1 -1
  12. package/dist/consumers/connectSendTransport.d.ts.map +1 -1
  13. package/dist/consumers/connectSendTransportAudio.d.ts +1 -1
  14. package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -1
  15. package/dist/consumers/connectSendTransportScreen.d.ts +1 -1
  16. package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -1
  17. package/dist/consumers/connectSendTransportVideo.d.ts +1 -1
  18. package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -1
  19. package/dist/consumers/createSendTransport.d.ts +1 -1
  20. package/dist/consumers/createSendTransport.d.ts.map +1 -1
  21. package/dist/consumers/disconnectSendTransportAudio.d.ts +1 -1
  22. package/dist/consumers/disconnectSendTransportAudio.d.ts.map +1 -1
  23. package/dist/consumers/disconnectSendTransportScreen.d.ts +1 -1
  24. package/dist/consumers/disconnectSendTransportScreen.d.ts.map +1 -1
  25. package/dist/consumers/disconnectSendTransportVideo.d.ts +1 -1
  26. package/dist/consumers/disconnectSendTransportVideo.d.ts.map +1 -1
  27. package/dist/consumers/index.cjs +80 -0
  28. package/dist/consumers/index.cjs.map +1 -0
  29. package/dist/consumers/index.d.ts +62 -0
  30. package/dist/consumers/index.d.ts.map +1 -0
  31. package/dist/consumers/index.js +80 -0
  32. package/dist/consumers/index.js.map +1 -0
  33. package/dist/consumers/resumeSendTransportAudio.d.ts +1 -1
  34. package/dist/consumers/resumeSendTransportAudio.d.ts.map +1 -1
  35. package/dist/consumers/signalNewConsumerTransport.d.ts +1 -1
  36. package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -1
  37. package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts +1 -1
  38. package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts.map +1 -1
  39. package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts +1 -1
  40. package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts.map +1 -1
  41. package/dist/consumers/streamSuccessAudio.d.ts +1 -1
  42. package/dist/consumers/streamSuccessAudio.d.ts.map +1 -1
  43. package/dist/consumers/streamSuccessAudioSwitch.d.ts +1 -1
  44. package/dist/consumers/streamSuccessAudioSwitch.d.ts.map +1 -1
  45. package/dist/consumers/streamSuccessVideo.d.ts +1 -1
  46. package/dist/consumers/streamSuccessVideo.d.ts.map +1 -1
  47. package/dist/getParticipantMedia-Bu_aZlxe.js +3555 -0
  48. package/dist/getParticipantMedia-Bu_aZlxe.js.map +1 -0
  49. package/dist/getParticipantMedia-DC_Nca8S.cjs +3554 -0
  50. package/dist/getParticipantMedia-DC_Nca8S.cjs.map +1 -0
  51. package/dist/index.cjs +299 -252
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1994 -1947
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.native.cjs +230 -224
  58. package/dist/index.native.cjs.map +1 -1
  59. package/dist/index.native.js +349 -343
  60. package/dist/index.native.js.map +1 -1
  61. package/dist/joinLocalRoom-7ibqv7zZ.js +657 -0
  62. package/dist/joinLocalRoom-7ibqv7zZ.js.map +1 -0
  63. package/dist/joinLocalRoom-BJBDvTYh.cjs +673 -0
  64. package/dist/joinLocalRoom-BJBDvTYh.cjs.map +1 -0
  65. package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs +1222 -0
  66. package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +1 -0
  67. package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js +1223 -0
  68. package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +1 -0
  69. package/dist/methods/index.cjs +3975 -0
  70. package/dist/methods/index.cjs.map +1 -0
  71. package/dist/methods/index.js +3976 -0
  72. package/dist/methods/index.js.map +1 -0
  73. package/dist/methods/socketReceive/getDomains.d.ts +1 -1
  74. package/dist/methods/socketReceive/getDomains.d.ts.map +1 -1
  75. package/dist/methods/utils/headless/virtualBackground.d.ts +2 -2
  76. package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
  77. package/dist/methods/utils/virtualBackgroundCompositor.d.ts +21 -0
  78. package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -0
  79. package/dist/methods/whiteboard/captureCanvasStream.d.ts +1 -1
  80. package/dist/methods/whiteboard/captureCanvasStream.d.ts.map +1 -1
  81. package/dist/producers/producerEmits/joinConRoom.d.ts +1 -1
  82. package/dist/producers/producerEmits/joinConRoom.d.ts.map +1 -1
  83. package/dist/producers/producerEmits/joinRoom.d.ts +1 -1
  84. package/dist/producers/producerEmits/joinRoom.d.ts.map +1 -1
  85. package/dist/translationConsumerSwitch-C20MfNNq.cjs +509 -0
  86. package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +1 -0
  87. package/dist/translationConsumerSwitch-zKuS5wgH.js +510 -0
  88. package/dist/translationConsumerSwitch-zKuS5wgH.js.map +1 -0
  89. package/dist/types/index.cjs +85 -0
  90. package/dist/types/index.cjs.map +1 -0
  91. package/dist/types/index.d.ts +2 -0
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/index.js +85 -0
  94. package/dist/types/index.js.map +1 -0
  95. package/dist/types/shared-base-types.d.ts +1 -1
  96. package/dist/types/shared-base-types.d.ts.map +1 -1
  97. package/dist/updateParticipantAudioDecibels-C_MygF6q.js +5432 -0
  98. package/dist/updateParticipantAudioDecibels-C_MygF6q.js.map +1 -0
  99. package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs +5431 -0
  100. package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs.map +1 -0
  101. package/dist/validateAlphanumeric-DKn5BsUP.cjs +15 -0
  102. package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +1 -0
  103. package/dist/validateAlphanumeric-Dk1JB80W.js +16 -0
  104. package/dist/validateAlphanumeric-Dk1JB80W.js.map +1 -0
  105. package/package.json +2 -1
  106. package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +1 -2
  107. package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +1 -1
  108. package/src/consumers/connectIps.ts +69 -9
  109. package/src/consumers/connectRecvTransport.ts +1 -1
  110. package/src/consumers/connectSendTransport.ts +1 -1
  111. package/src/consumers/connectSendTransportAudio.ts +1 -1
  112. package/src/consumers/connectSendTransportScreen.ts +1 -1
  113. package/src/consumers/connectSendTransportVideo.ts +1 -1
  114. package/src/consumers/createSendTransport.ts +1 -1
  115. package/src/consumers/disconnectSendTransportAudio.ts +1 -1
  116. package/src/consumers/disconnectSendTransportScreen.ts +1 -1
  117. package/src/consumers/disconnectSendTransportVideo.ts +1 -1
  118. package/src/consumers/index.ts +61 -0
  119. package/src/consumers/resumeSendTransportAudio.ts +1 -1
  120. package/src/consumers/signalNewConsumerTransport.ts +1 -2
  121. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +1 -1
  122. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +1 -1
  123. package/src/consumers/streamSuccessAudio.ts +1 -2
  124. package/src/consumers/streamSuccessAudioSwitch.ts +1 -2
  125. package/src/consumers/streamSuccessVideo.ts +1 -1
  126. package/src/index.ts +2 -0
  127. package/src/methods/socketReceive/getDomains.ts +1 -1
  128. package/src/methods/utils/headless/virtualBackground.ts +45 -30
  129. package/src/methods/utils/virtualBackgroundCompositor.ts +53 -0
  130. package/src/methods/whiteboard/captureCanvasStream.ts +2 -2
  131. package/src/producers/producerEmits/joinConRoom.ts +1 -1
  132. package/src/producers/producerEmits/joinRoom.ts +1 -1
  133. package/src/types/index.ts +1 -0
  134. package/src/types/shared-base-types.ts +2 -3
  135. package/dist/getParticipantMedia-D9ChmEqq.js +0 -15265
  136. package/dist/getParticipantMedia-D9ChmEqq.js.map +0 -1
  137. package/dist/getParticipantMedia-DWvIhPPY.cjs +0 -15281
  138. 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