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 @@
|
|
|
1
|
+
{"version":3,"file":"joinRoomOnMediaSFU-CC8RVJgr.cjs","sources":["../node_modules/universal-cookie/esm/index.mjs","../src/methods/utils/checkLimitsAndMakeRequest.ts","../src/methods/requests/hostRequestResponse.ts","../src/methods/stream/clickAudio.ts","../src/methods/stream/clickScreenShare.ts","../src/methods/recording/timeLeftRecording.ts","../src/methods/whiteboard/captureCanvasStream.ts","../src/methods/utils/producer/videoCaptureConstraints.ts","../src/methods/utils/producer/hParams.ts","../src/methods/utils/producer/vParams.ts","../src/methods/utils/producer/screenParams.ts","../src/methods/utils/producer/aParams.ts","../src/methods/utils/resolveMediaSFURoomApi.ts","../src/methods/utils/joinRoomOnMediaSFU.ts"],"sourcesContent":["var cookie = {};\n\n/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\nvar hasRequiredCookie;\n\nfunction requireCookie () {\n\tif (hasRequiredCookie) return cookie;\n\thasRequiredCookie = 1;\n\n\t/**\n\t * Module exports.\n\t * @public\n\t */\n\n\tcookie.parse = parse;\n\tcookie.serialize = serialize;\n\n\t/**\n\t * Module variables.\n\t * @private\n\t */\n\n\tvar __toString = Object.prototype.toString;\n\tvar __hasOwnProperty = Object.prototype.hasOwnProperty;\n\n\t/**\n\t * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n\t * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n\t * which has been replaced by the token definition in RFC 7230 appendix B.\n\t *\n\t * cookie-name = token\n\t * token = 1*tchar\n\t * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n\t * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n\t * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n\t */\n\n\tvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n\t/**\n\t * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n\t *\n\t * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n\t * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n\t * ; US-ASCII characters excluding CTLs,\n\t * ; whitespace DQUOTE, comma, semicolon,\n\t * ; and backslash\n\t */\n\n\tvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n\t/**\n\t * RegExp to match domain-value in RFC 6265 sec 4.1.1\n\t *\n\t * domain-value = <subdomain>\n\t * ; defined in [RFC1034], Section 3.5, as\n\t * ; enhanced by [RFC1123], Section 2.1\n\t * <subdomain> = <label> | <subdomain> \".\" <label>\n\t * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n\t * Labels must be 63 characters or less.\n\t * 'let-dig' not 'letter' in the first char, per RFC1123\n\t * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n\t * <let-dig-hyp> = <let-dig> | \"-\"\n\t * <let-dig> = <letter> | <digit>\n\t * <letter> = any one of the 52 alphabetic characters A through Z in\n\t * upper case and a through z in lower case\n\t * <digit> = any one of the ten digits 0 through 9\n\t *\n\t * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n\t *\n\t * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n\t * character is not permitted, but a trailing %x2E (\".\"), if present, will\n\t * cause the user agent to ignore the attribute.)\n\t */\n\n\tvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n\t/**\n\t * RegExp to match path-value in RFC 6265 sec 4.1.1\n\t *\n\t * path-value = <any CHAR except CTLs or \";\">\n\t * CHAR = %x01-7F\n\t * ; defined in RFC 5234 appendix B.1\n\t */\n\n\tvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n\t/**\n\t * Parse a cookie header.\n\t *\n\t * Parse the given cookie header string into an object\n\t * The object has the various cookies as keys(names) => values\n\t *\n\t * @param {string} str\n\t * @param {object} [opt]\n\t * @return {object}\n\t * @public\n\t */\n\n\tfunction parse(str, opt) {\n\t if (typeof str !== 'string') {\n\t throw new TypeError('argument str must be a string');\n\t }\n\n\t var obj = {};\n\t var len = str.length;\n\t // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n\t if (len < 2) return obj;\n\n\t var dec = (opt && opt.decode) || decode;\n\t var index = 0;\n\t var eqIdx = 0;\n\t var endIdx = 0;\n\n\t do {\n\t eqIdx = str.indexOf('=', index);\n\t if (eqIdx === -1) break; // No more cookie pairs.\n\n\t endIdx = str.indexOf(';', index);\n\n\t if (endIdx === -1) {\n\t endIdx = len;\n\t } else if (eqIdx > endIdx) {\n\t // backtrack on prior semicolon\n\t index = str.lastIndexOf(';', eqIdx - 1) + 1;\n\t continue;\n\t }\n\n\t var keyStartIdx = startIndex(str, index, eqIdx);\n\t var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n\t var key = str.slice(keyStartIdx, keyEndIdx);\n\n\t // only assign once\n\t if (!__hasOwnProperty.call(obj, key)) {\n\t var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n\t var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n\t if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n\t valStartIdx++;\n\t valEndIdx--;\n\t }\n\n\t var val = str.slice(valStartIdx, valEndIdx);\n\t obj[key] = tryDecode(val, dec);\n\t }\n\n\t index = endIdx + 1;\n\t } while (index < len);\n\n\t return obj;\n\t}\n\n\tfunction startIndex(str, index, max) {\n\t do {\n\t var code = str.charCodeAt(index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n\t } while (++index < max);\n\t return max;\n\t}\n\n\tfunction endIndex(str, index, min) {\n\t while (index > min) {\n\t var code = str.charCodeAt(--index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n\t }\n\t return min;\n\t}\n\n\t/**\n\t * Serialize data into a cookie header.\n\t *\n\t * Serialize a name value pair into a cookie string suitable for\n\t * http headers. An optional options object specifies cookie parameters.\n\t *\n\t * serialize('foo', 'bar', { httpOnly: true })\n\t * => \"foo=bar; httpOnly\"\n\t *\n\t * @param {string} name\n\t * @param {string} val\n\t * @param {object} [opt]\n\t * @return {string}\n\t * @public\n\t */\n\n\tfunction serialize(name, val, opt) {\n\t var enc = (opt && opt.encode) || encodeURIComponent;\n\n\t if (typeof enc !== 'function') {\n\t throw new TypeError('option encode is invalid');\n\t }\n\n\t if (!cookieNameRegExp.test(name)) {\n\t throw new TypeError('argument name is invalid');\n\t }\n\n\t var value = enc(val);\n\n\t if (!cookieValueRegExp.test(value)) {\n\t throw new TypeError('argument val is invalid');\n\t }\n\n\t var str = name + '=' + value;\n\t if (!opt) return str;\n\n\t if (null != opt.maxAge) {\n\t var maxAge = Math.floor(opt.maxAge);\n\n\t if (!isFinite(maxAge)) {\n\t throw new TypeError('option maxAge is invalid')\n\t }\n\n\t str += '; Max-Age=' + maxAge;\n\t }\n\n\t if (opt.domain) {\n\t if (!domainValueRegExp.test(opt.domain)) {\n\t throw new TypeError('option domain is invalid');\n\t }\n\n\t str += '; Domain=' + opt.domain;\n\t }\n\n\t if (opt.path) {\n\t if (!pathValueRegExp.test(opt.path)) {\n\t throw new TypeError('option path is invalid');\n\t }\n\n\t str += '; Path=' + opt.path;\n\t }\n\n\t if (opt.expires) {\n\t var expires = opt.expires;\n\n\t if (!isDate(expires) || isNaN(expires.valueOf())) {\n\t throw new TypeError('option expires is invalid');\n\t }\n\n\t str += '; Expires=' + expires.toUTCString();\n\t }\n\n\t if (opt.httpOnly) {\n\t str += '; HttpOnly';\n\t }\n\n\t if (opt.secure) {\n\t str += '; Secure';\n\t }\n\n\t if (opt.partitioned) {\n\t str += '; Partitioned';\n\t }\n\n\t if (opt.priority) {\n\t var priority = typeof opt.priority === 'string'\n\t ? opt.priority.toLowerCase() : opt.priority;\n\n\t switch (priority) {\n\t case 'low':\n\t str += '; Priority=Low';\n\t break\n\t case 'medium':\n\t str += '; Priority=Medium';\n\t break\n\t case 'high':\n\t str += '; Priority=High';\n\t break\n\t default:\n\t throw new TypeError('option priority is invalid')\n\t }\n\t }\n\n\t if (opt.sameSite) {\n\t var sameSite = typeof opt.sameSite === 'string'\n\t ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n\t switch (sameSite) {\n\t case true:\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'lax':\n\t str += '; SameSite=Lax';\n\t break;\n\t case 'strict':\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'none':\n\t str += '; SameSite=None';\n\t break;\n\t default:\n\t throw new TypeError('option sameSite is invalid');\n\t }\n\t }\n\n\t return str;\n\t}\n\n\t/**\n\t * URL-decode string value. Optimized to skip native call when no %.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\n\tfunction decode (str) {\n\t return str.indexOf('%') !== -1\n\t ? decodeURIComponent(str)\n\t : str\n\t}\n\n\t/**\n\t * Determine if value is a Date.\n\t *\n\t * @param {*} val\n\t * @private\n\t */\n\n\tfunction isDate (val) {\n\t return __toString.call(val) === '[object Date]';\n\t}\n\n\t/**\n\t * Try decoding a string using a decoding function.\n\t *\n\t * @param {string} str\n\t * @param {function} decode\n\t * @private\n\t */\n\n\tfunction tryDecode(str, decode) {\n\t try {\n\t return decode(str);\n\t } catch (e) {\n\t return str;\n\t }\n\t}\n\treturn cookie;\n}\n\nvar cookieExports = requireCookie();\n\nfunction hasDocumentCookie() {\n const testingValue = typeof global === 'undefined'\n ? undefined\n : global.TEST_HAS_DOCUMENT_COOKIE;\n if (typeof testingValue === 'boolean') {\n return testingValue;\n }\n // Can we get/set cookies on document.cookie?\n return typeof document === 'object' && typeof document.cookie === 'string';\n}\nfunction parseCookies(cookies) {\n if (typeof cookies === 'string') {\n return cookieExports.parse(cookies);\n }\n else if (typeof cookies === 'object' && cookies !== null) {\n return cookies;\n }\n else {\n return {};\n }\n}\nfunction readCookie(value, options = {}) {\n const cleanValue = cleanupCookieValue(value);\n if (!options.doNotParse) {\n try {\n return JSON.parse(cleanValue);\n }\n catch (e) {\n // At least we tried\n }\n }\n // Ignore clean value if we failed the deserialization\n // It is not relevant anymore to trim those values\n return value;\n}\nfunction cleanupCookieValue(value) {\n // express prepend j: before serializing a cookie\n if (value && value[0] === 'j' && value[1] === ':') {\n return value.substr(2);\n }\n return value;\n}\n\nclass Cookies {\n constructor(cookies, defaultSetOptions = {}) {\n this.changeListeners = [];\n this.HAS_DOCUMENT_COOKIE = false;\n this.update = () => {\n if (!this.HAS_DOCUMENT_COOKIE) {\n return;\n }\n const previousCookies = this.cookies;\n this.cookies = cookieExports.parse(document.cookie);\n this._checkChanges(previousCookies);\n };\n const domCookies = typeof document === 'undefined' ? '' : document.cookie;\n this.cookies = parseCookies(cookies || domCookies);\n this.defaultSetOptions = defaultSetOptions;\n this.HAS_DOCUMENT_COOKIE = hasDocumentCookie();\n }\n _emitChange(params) {\n for (let i = 0; i < this.changeListeners.length; ++i) {\n this.changeListeners[i](params);\n }\n }\n _checkChanges(previousCookies) {\n const names = new Set(Object.keys(previousCookies).concat(Object.keys(this.cookies)));\n names.forEach((name) => {\n if (previousCookies[name] !== this.cookies[name]) {\n this._emitChange({\n name,\n value: readCookie(this.cookies[name]),\n });\n }\n });\n }\n _startPolling() {\n this.pollingInterval = setInterval(this.update, 300);\n }\n _stopPolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n }\n get(name, options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n return readCookie(this.cookies[name], options);\n }\n getAll(options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n const result = {};\n for (let name in this.cookies) {\n result[name] = readCookie(this.cookies[name], options);\n }\n return result;\n }\n set(name, value, options) {\n if (options) {\n options = Object.assign(Object.assign({}, this.defaultSetOptions), options);\n }\n else {\n options = this.defaultSetOptions;\n }\n const stringValue = typeof value === 'string' ? value : JSON.stringify(value);\n this.cookies = Object.assign(Object.assign({}, this.cookies), { [name]: stringValue });\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, stringValue, options);\n }\n this._emitChange({ name, value, options });\n }\n remove(name, options) {\n const finalOptions = (options = Object.assign(Object.assign(Object.assign({}, this.defaultSetOptions), options), { expires: new Date(1970, 1, 1, 0, 0, 1), maxAge: 0 }));\n this.cookies = Object.assign({}, this.cookies);\n delete this.cookies[name];\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, '', finalOptions);\n }\n this._emitChange({ name, value: undefined, options });\n }\n addChangeListener(callback) {\n this.changeListeners.push(callback);\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 1) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.addEventListener('change', this.update);\n }\n else {\n this._startPolling();\n }\n }\n }\n removeChangeListener(callback) {\n const idx = this.changeListeners.indexOf(callback);\n if (idx >= 0) {\n this.changeListeners.splice(idx, 1);\n }\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 0) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.removeEventListener('change', this.update);\n }\n else {\n this._stopPolling();\n }\n }\n }\n}\n\nexport { Cookies as default };\n","import { PreJoinPageParameters } from \"../../types/types\";\nimport type { Socket } from \"socket.io-client\";\nimport Cookies from \"universal-cookie\";\n\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10; // Maximum number of unsuccessful attempts before rate limiting\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds\n\nexport interface CheckLimitsStorageAdapter {\n getItem: (key: string) => Promise<string | null | undefined> | string | null | undefined;\n setItem: (key: string, value: string) => Promise<void> | void;\n}\n\nexport interface CheckLimitsAndMakeRequestWithStorageOptions {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n storageAdapter: CheckLimitsStorageAdapter;\n}\n\nexport type CheckLimitsAndMakeRequestWithStorageType = (\n options: CheckLimitsAndMakeRequestWithStorageOptions,\n) => Promise<void>;\n\nconst readStoredNumber = async (\n adapter: CheckLimitsStorageAdapter,\n key: string,\n): Promise<number> => {\n const value = await adapter.getItem(key);\n const parsed = parseInt((value ?? '0').toString(), 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n};\n\nconst writeStoredNumber = async (\n adapter: CheckLimitsStorageAdapter,\n key: string,\n value: number,\n): Promise<void> => {\n await adapter.setItem(key, value.toString());\n};\n\nconst hasConnectedSocketId = (socket: unknown): socket is Socket & { id: string } => {\n if (!socket || typeof socket !== 'object') {\n return false;\n }\n\n const candidate = socket as { id?: unknown };\n return typeof candidate.id === 'string' && candidate.id.length > 0;\n};\n\n/**\n * Mobile/storage-adapter variant used by RN/Expo wrappers to share one canonical implementation.\n */\nexport const checkLimitsAndMakeRequestWithStorage: CheckLimitsAndMakeRequestWithStorageType = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = '',\n userName,\n parameters,\n validate = true,\n storageAdapter,\n}) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n\n try {\n let unsuccessfulAttempts = await readStoredNumber(storageAdapter, 'unsuccessfulAttempts');\n const lastRequestTimestamp = await readStoredNumber(storageAdapter, 'lastRequestTimestamp');\n\n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS\n && Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n return;\n }\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n unsuccessfulAttempts = 0;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n }\n\n parameters.updateIsLoadingModalVisible(true);\n\n const socketPromise = parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<never>((_, reject) => setTimeout(\n () => reject(new Error('Request timed out')),\n TIMEOUT_DURATION,\n ));\n\n const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n\n if (validate) {\n parameters.updateSocket(socket);\n } else {\n parameters.updateLocalSocket?.(socket);\n }\n\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) {\n parameters.updateValidated(true);\n }\n } else {\n unsuccessfulAttempts += 1;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n parameters.updateIsLoadingModalVisible(false);\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n parameters.showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n } else {\n parameters.showAlert?.({\n message: 'Invalid credentials.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.error('Error connecting to socket:', error);\n parameters.showAlert?.({\n message: 'Unable to connect. Check your credentials and try again.',\n type: 'danger',\n duration: 3000,\n });\n\n let unsuccessfulAttempts = await readStoredNumber(storageAdapter, 'unsuccessfulAttempts');\n unsuccessfulAttempts += 1;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n parameters.updateIsLoadingModalVisible(false);\n }\n};\n\n\nexport const checkLimitsAndMakeRequest = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = \"\",\n userName,\n parameters,\n validate = true,\n }: {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n }) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n let unsuccessfulAttempts =\n parseInt(cookies.get(\"unsuccessfulAttempts\")) || 0;\n let lastRequestTimestamp =\n parseInt(cookies.get(\"lastRequestTimestamp\")) || 0;\n \n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS &&\n Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: \"Too many unsuccessful attempts. Please try again later.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n }\n \n try {\n parameters.updateIsLoadingModalVisible(true);\n const socketPromise = await parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<null>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Request timed out\")),\n TIMEOUT_DURATION\n )\n );\n \n const socket = await Promise.race([socketPromise, timeoutPromise]);\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n if (validate){\n // only one connection is established, no local socket\n parameters.updateSocket(socket);\n }else{\n // local socket is also established, mediaSFU connection is now the local socket\n parameters.updateLocalSocket?.(socket);\n }\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) parameters.updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n parameters.showAlert?.({\n message: \"Invalid credentials.\",\n type: \"danger\",\n duration: 3000,\n });\n }\n } catch {\n parameters.showAlert?.({\n message: \"Unable to connect. Check your credentials and try again.\",\n type: \"danger\",\n duration: 3000,\n });\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n }\n };","import type { Request, RequestResponse, ShowAlert } from '../../types/types';\n\nexport interface HostRequestResponseOptions {\n requestResponse: RequestResponse;\n showAlert?: ShowAlert;\n requestList: Request[];\n updateRequestList: (requestList: Request[]) => void;\n updateMicAction: (action: boolean) => void;\n updateVideoAction: (action: boolean) => void;\n updateScreenAction: (action: boolean) => void;\n updateChatAction: (action: boolean) => void;\n updateAudioRequestState: (state: string | null) => void;\n updateVideoRequestState: (state: string | null) => void;\n updateScreenRequestState: (state: string | null) => void;\n updateChatRequestState: (state: string | null) => void;\n updateAudioRequestTime: (time: number) => void;\n updateVideoRequestTime: (time: number) => void;\n updateScreenRequestTime: (time: number) => void;\n updateChatRequestTime: (time: number) => void;\n updateRequestIntervalSeconds: number;\n}\n\nexport type HostRequestResponseType = (options: HostRequestResponseOptions) => Promise<void>;\n\n/**\n * Applies a host's response to a pending participant request.\n *\n * This helper removes the resolved request from the pending list, updates the\n * caller's relevant request state, and triggers acceptance or rejection alerts\n * with the correct retry cooldown timestamps.\n *\n * @param options Function options for processing the host response.\n * @returns A promise that resolves after request state has been updated.\n */\nexport const hostRequestResponse = async ({\n requestResponse,\n showAlert,\n requestList,\n updateRequestList,\n updateMicAction,\n updateVideoAction,\n updateScreenAction,\n updateChatAction,\n updateAudioRequestState,\n updateVideoRequestState,\n updateScreenRequestState,\n updateChatRequestState,\n updateAudioRequestTime,\n updateVideoRequestTime,\n updateScreenRequestTime,\n updateChatRequestTime,\n updateRequestIntervalSeconds,\n}: HostRequestResponseOptions): Promise<void> => {\n const requestType = requestResponse.type ?? requestResponse.icon;\n\n // Remove only the specific request that received a host response.\n const filteredRequests = requestList.filter(\n (request) => {\n const matchesId = request.id === requestResponse.id;\n const matchesType = requestType == null || request.icon === requestType;\n const matchesName = requestResponse.name == null || request.name === requestResponse.name;\n const matchesUsername =\n requestResponse.username == null || request.username === requestResponse.username;\n\n return !(matchesId && matchesType && matchesName && matchesUsername);\n }\n );\n updateRequestList(filteredRequests);\n\n if (requestResponse.action === 'accepted') {\n switch (requestType) {\n case 'fa-microphone':\n showAlert?.({\n message: 'Unmute request was accepted; click the mic button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateMicAction(true);\n updateAudioRequestState('accepted');\n break;\n case 'fa-video':\n showAlert?.({\n message: 'Video request was accepted; click the video button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateVideoAction(true);\n updateVideoRequestState('accepted');\n break;\n case 'fa-desktop':\n showAlert?.({\n message: 'Screenshare request was accepted; click the screen button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateScreenAction(true);\n updateScreenRequestState('accepted');\n break;\n case 'fa-comments':\n showAlert?.({\n message: 'Chat request was accepted; click the chat button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateChatAction(true);\n updateChatRequestState('accepted');\n break;\n }\n } else {\n let timerDate: Date;\n switch (requestType) {\n case 'fa-microphone':\n showAlert?.({\n message: 'Unmute request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateAudioRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateAudioRequestTime(timerDate.getTime());\n break;\n case 'fa-video':\n showAlert?.({\n message: 'Video request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateVideoRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateVideoRequestTime(timerDate.getTime());\n break;\n case 'fa-desktop':\n showAlert?.({\n message: 'Screenshare request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateScreenRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateScreenRequestTime(timerDate.getTime());\n break;\n case 'fa-comments':\n showAlert?.({\n message: 'Chat request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateChatRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateChatRequestTime(timerDate.getTime());\n break;\n }\n }\n};","import { Socket } from 'socket.io-client';\nimport {\n CheckPermissionType,\n DisconnectSendTransportAudioParameters,\n DisconnectSendTransportAudioType,\n Participant,\n RequestPermissionAudioType,\n ResumeSendTransportAudioParameters,\n ResumeSendTransportAudioType,\n ShowAlert,\n StreamSuccessAudioParameters,\n StreamSuccessAudioType,\n} from '../../types/types';\nimport type { PermissionConfig } from '../permissions/updatePermissionConfig';\n\nexport interface ClickAudioParameters\n extends DisconnectSendTransportAudioParameters,\n ResumeSendTransportAudioParameters,\n StreamSuccessAudioParameters {\n checkMediaPermission: boolean;\n hasAudioPermission: boolean;\n audioPaused: boolean;\n audioAlreadyOn: boolean;\n audioOnlyRoom: boolean;\n recordStarted: boolean;\n recordResumed: boolean;\n recordPaused: boolean;\n recordStopped: boolean;\n recordingMediaOptions: string;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n audioRequestState: string | null;\n audioRequestTime: number;\n member: string;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n userDefaultAudioInputDevice: string;\n micAction: boolean;\n localStream: MediaStream | null;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionConfig?: PermissionConfig | null;\n updateRequestIntervalSeconds: number;\n participants: Participant[];\n mediaDevices: MediaDevices;\n transportCreated: boolean;\n transportCreatedAudio: boolean;\n supportFlexRoom?: boolean;\n supportMaxRoom?: boolean;\n\n updateAudioAlreadyOn: (status: boolean) => void;\n updateAudioRequestState: (state: string | null) => void;\n updateAudioPaused: (status: boolean) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n updateParticipants: (participants: Participant[]) => void;\n updateTransportCreated: (status: boolean) => void;\n updateTransportCreatedAudio: (status: boolean) => void;\n updateMicAction: (action: boolean) => void;\n showAlert?: ShowAlert;\n\n checkPermission: CheckPermissionType;\n streamSuccessAudio: StreamSuccessAudioType;\n disconnectSendTransportAudio: DisconnectSendTransportAudioType;\n requestPermissionAudio: RequestPermissionAudioType;\n resumeSendTransportAudio: ResumeSendTransportAudioType;\n\n getUpdatedAllParams: () => ClickAudioParameters;\n [key: string]: any;\n}\n\nexport interface ClickAudioOptions {\n parameters: ClickAudioParameters;\n}\n\nexport type ClickAudioType = (options: ClickAudioOptions) => Promise<void>;\n\n/**\n * Handles microphone toggle flow for a participant.\n *\n * This helper enforces host permission rules, request cooldowns, recording\n * constraints, and transport resume/disconnect behavior before updating the\n * caller's local media state.\n *\n * @param options Function options containing the full runtime parameter bag.\n * @returns A promise that resolves after the microphone action has been processed.\n */\nexport const clickAudio = async ({ parameters }: ClickAudioOptions): Promise<void> => {\n let {\n checkMediaPermission,\n hasAudioPermission,\n audioPaused,\n audioAlreadyOn,\n audioOnlyRoom,\n recordStarted,\n recordResumed,\n recordPaused,\n recordStopped,\n recordingMediaOptions,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n audioRequestState,\n audioRequestTime,\n member,\n socket,\n localSocket,\n roomName,\n userDefaultAudioInputDevice,\n micAction,\n localStream,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n updateRequestIntervalSeconds,\n participants,\n mediaDevices,\n showAlert,\n transportCreated,\n transportCreatedAudio,\n\n updateAudioAlreadyOn,\n updateAudioRequestState,\n updateAudioPaused,\n updateLocalStream,\n updateParticipants,\n updateTransportCreated,\n updateTransportCreatedAudio,\n updateMicAction,\n\n checkPermission,\n streamSuccessAudio,\n requestPermissionAudio,\n resumeSendTransportAudio,\n disconnectSendTransportAudio,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (audioAlreadyOn) {\n if (islevel === '2' && (recordStarted || recordResumed)) {\n if (!(recordPaused || recordStopped)) {\n if (recordingMediaOptions === 'audio') {\n showAlert?.({\n message: 'You cannot turn off your audio while recording, please pause or stop recording first.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n }\n\n audioAlreadyOn = false;\n updateAudioAlreadyOn(audioAlreadyOn);\n if (localStream && localStream.getAudioTracks().length > 0) {\n localStream.getAudioTracks()[0].enabled = false;\n updateLocalStream(localStream);\n }\n await disconnectSendTransportAudio({ parameters });\n audioPaused = true;\n updateAudioPaused(audioPaused);\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: 'You cannot turn on your microphone. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n const supportMaxRoom = parameters.supportMaxRoom;\n const supportFlexRoom = parameters.supportFlexRoom;\n if ((supportMaxRoom || supportFlexRoom) && islevel !== '2') {\n try {\n const checkResult = await new Promise<{\n allowed: boolean;\n reason?: string;\n producingCount?: number;\n producerLimit?: number;\n }>((resolve) => {\n socket.emit(\n 'checkProduce',\n { kind: 'audio' },\n (response: {\n allowed: boolean;\n reason?: string;\n producingCount?: number;\n producerLimit?: number;\n }) => {\n resolve(response || { allowed: false, reason: 'No response from server' });\n },\n );\n\n setTimeout(() => resolve({ allowed: true }), 5000);\n });\n\n if (!checkResult.allowed) {\n showAlert?.({\n message:\n checkResult.reason ||\n `Audio producer limit reached (${checkResult.producingCount}/${checkResult.producerLimit}).`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n } catch (error) {\n console.warn('Failed to check producer limit:', error);\n }\n }\n\n const panelistsFocused = parameters.panelistsFocused;\n const muteOthersMic = parameters.muteOthersMic;\n const panelists = parameters.panelists;\n\n if (panelistsFocused && muteOthersMic && islevel !== '2') {\n const isPanelist =\n panelists?.some((panelist: { name: string }) => panelist.name === member) || false;\n\n if (!isPanelist) {\n showAlert?.({\n message:\n 'You cannot turn on your microphone. Only panelists can unmute while focus mode is active.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n\n let response = 2;\n if (!micAction && islevel !== '2' && !youAreCoHost) {\n response = await checkPermission({\n permissionType: 'audioSetting',\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig: parameters.permissionConfig,\n participantLevel: islevel,\n });\n } else {\n response = 0;\n }\n\n switch (response) {\n case 1: {\n if (audioRequestState === 'pending') {\n showAlert?.({\n message: 'A request is pending. Please wait for the host to respond.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (\n audioRequestState === 'rejected' &&\n Date.now() - audioRequestTime < updateRequestIntervalSeconds * 1000\n ) {\n showAlert?.({\n message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n showAlert?.({\n message: 'Request sent to host.',\n type: 'success',\n duration: 3000,\n });\n\n audioRequestState = 'pending';\n updateAudioRequestState(audioRequestState);\n\n const userRequest = {\n id: socket.id,\n name: member,\n icon: 'fa-microphone',\n };\n socket.emit('participantRequest', { userRequest, roomName });\n break;\n }\n\n case 2:\n showAlert?.({\n message: 'You cannot turn on your microphone. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n break;\n\n case 0:\n if (audioPaused) {\n if (localStream && localStream.getAudioTracks().length > 0) {\n localStream.getAudioTracks()[0].enabled = true;\n }\n updateAudioAlreadyOn(true);\n await resumeSendTransportAudio({ parameters });\n socket.emit('resumeProducerAudio', { mediaTag: 'audio', roomName });\n\n try {\n if (localSocket && localSocket.id) {\n localSocket.emit('resumeProducerAudio', { mediaTag: 'audio', roomName });\n }\n } catch (error) {\n console.log('Error in resumeProducerAudio', error);\n }\n\n updateLocalStream(localStream);\n\n if (micAction === true) {\n micAction = false;\n updateMicAction(micAction);\n }\n\n participants.forEach((participant) => {\n if (participant.socketId === socket.id && participant.name === member) {\n participant.muted = false;\n }\n });\n updateParticipants(participants);\n\n transportCreated = true;\n updateTransportCreated(transportCreated);\n\n transportCreatedAudio = true;\n updateTransportCreatedAudio(transportCreatedAudio);\n } else {\n if (!hasAudioPermission && checkMediaPermission) {\n const statusMic = await requestPermissionAudio();\n if (statusMic !== 'granted') {\n showAlert?.({\n message:\n 'Allow access to your microphone or check if your microphone is not being used by another application.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n\n const mediaConstraints = userDefaultAudioInputDevice\n ? { audio: { deviceId: userDefaultAudioInputDevice }, video: false }\n : { audio: true, video: false };\n\n try {\n const stream = await mediaDevices.getUserMedia(mediaConstraints);\n await streamSuccessAudio({ stream, parameters });\n } catch (error) {\n console.error(error);\n showAlert?.({\n message:\n 'Allow access to your microphone or check if your microphone is not being used by another application.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n break;\n\n default:\n }\n }\n};","import { Socket } from 'socket.io-client';\nimport type {\n CheckPermissionType,\n CheckScreenShareParameters,\n CheckScreenShareType,\n ShowAlert,\n StopShareScreenParameters,\n StopShareScreenType,\n} from '../../types/types';\nimport type { PermissionConfig } from '../permissions/updatePermissionConfig';\n\nexport interface ClickScreenShareParameters\n extends CheckScreenShareParameters,\n StopShareScreenParameters {\n showAlert?: ShowAlert;\n roomName: string;\n member: string;\n socket: Socket;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionConfig?: PermissionConfig | null;\n screenAction: boolean;\n screenAlreadyOn: boolean;\n screenRequestState: string | null;\n screenRequestTime: number;\n audioOnlyRoom: boolean;\n updateRequestIntervalSeconds: number;\n updateScreenRequestState: (state: string | null) => void;\n updateScreenAlreadyOn: (status: boolean) => void;\n\n checkPermission: CheckPermissionType;\n checkScreenShare: CheckScreenShareType;\n stopShareScreen: StopShareScreenType;\n\n getUpdatedAllParams: () => ClickScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface ClickScreenShareOptions {\n parameters: ClickScreenShareParameters;\n}\n\nexport type ClickScreenShareType = (options: ClickScreenShareOptions) => Promise<void>;\n\n/**\n * Handles screen-share toggle flow for a participant.\n *\n * This helper checks room restrictions, host permission policies, request\n * cooldowns, and then delegates to the supplied start/stop share helpers.\n *\n * @param options Function options containing the full runtime parameter bag.\n * @returns A promise that resolves after the screen-share action has been processed.\n */\nexport const clickScreenShare = async ({ parameters }: ClickScreenShareOptions): Promise<void> => {\n let {\n showAlert,\n roomName,\n member,\n socket,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n screenAction,\n screenAlreadyOn,\n screenRequestState,\n screenRequestTime,\n audioOnlyRoom,\n updateRequestIntervalSeconds,\n updateScreenRequestState,\n updateScreenAlreadyOn,\n checkPermission,\n checkScreenShare,\n stopShareScreen,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (screenAlreadyOn) {\n screenAlreadyOn = false;\n updateScreenAlreadyOn(screenAlreadyOn);\n await stopShareScreen({ parameters });\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: 'You cannot start screen share. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n let response = 2;\n if (!screenAction && islevel !== '2' && !youAreCoHost) {\n response = await checkPermission({\n permissionType: 'screenshareSetting',\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig: parameters.permissionConfig,\n participantLevel: islevel,\n });\n } else {\n response = 0;\n }\n\n switch (response) {\n case 0:\n checkScreenShare({ parameters });\n break;\n case 1: {\n if (screenRequestState === 'pending') {\n showAlert?.({\n message: 'A request is already pending. Please wait for the host to respond.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (\n screenRequestState === 'rejected' &&\n Date.now() - screenRequestTime < updateRequestIntervalSeconds\n ) {\n showAlert?.({\n message: 'You cannot send another request at this time.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n showAlert?.({\n message: 'Your request has been sent to the host.',\n type: 'success',\n duration: 3000,\n });\n\n screenRequestState = 'pending';\n updateScreenRequestState(screenRequestState);\n\n const userRequest = { id: socket.id, name: member, icon: 'fa-desktop' };\n socket.emit('participantRequest', { userRequest, roomName });\n break;\n }\n case 2:\n showAlert?.({\n message: 'You are not allowed to start screen share.',\n type: 'danger',\n duration: 3000,\n });\n break;\n default:\n break;\n }\n }\n};","import type { ShowAlert } from '../../types/types';\n\nexport interface TimeLeftRecordingOptions {\n timeLeft: number;\n showAlert?: ShowAlert;\n}\n\nexport type TimeLeftRecordingType = (options: TimeLeftRecordingOptions) => void;\n\n/**\n * Shows a short warning that the current recording session is about to end.\n *\n * @param options Function options including the remaining recording time in seconds.\n */\nexport const timeLeftRecording = ({ timeLeft, showAlert }: TimeLeftRecordingOptions): void => {\n try {\n showAlert?.({\n message: `The recording will stop in less than ${timeLeft} seconds.`,\n duration: 3000,\n type: 'danger',\n });\n } catch (error) {\n console.log('Error in timeLeftRecording: ', error);\n }\n};","import type { Producer } from 'mediasoup-client/types';\nimport type {\n ConnectSendTransportScreenParameters,\n ConnectSendTransportScreenType,\n CreateSendTransportParameters,\n CreateSendTransportType,\n DisconnectSendTransportScreenParameters,\n DisconnectSendTransportScreenType,\n SleepType,\n} from '../../types/types';\nimport type { Socket } from 'socket.io-client';\n\nexport interface CaptureCanvasStreamParameters\n extends CreateSendTransportParameters,\n DisconnectSendTransportScreenParameters,\n ConnectSendTransportScreenParameters {\n canvasWhiteboard: HTMLCanvasElement | null;\n canvasStream: MediaStream | null;\n updateCanvasStream: (stream: MediaStream | null) => void;\n screenProducer: Producer | null;\n localScreenProducer?: Producer | null;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n localSocket?: Socket;\n updateScreenProducer: (producer: Producer | null) => void;\n updateLocalScreenProducer?: (localProducer: Producer | null) => void;\n\n sleep: SleepType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n\n getUpdatedAllParams: () => CaptureCanvasStreamParameters;\n [key: string]: any;\n}\n\nexport interface CaptureCanvasStreamOptions {\n parameters: CaptureCanvasStreamParameters;\n start?: boolean;\n}\n\nexport type CaptureCanvasStreamType = (options: CaptureCanvasStreamOptions) => Promise<void>;\n\n/**\n * Captures or tears down a whiteboard canvas stream used for screen-style sharing.\n *\n * When starting, this helper captures the canvas at 30 FPS and ensures the\n * correct screen transport is created or reconnected. When stopping, it ends all\n * canvas tracks and disconnects the corresponding transport.\n *\n * @param options Function options for starting or stopping the captured canvas stream.\n * @returns A promise that resolves after the whiteboard stream lifecycle step completes.\n */\nexport const captureCanvasStream = async ({\n parameters,\n start = true,\n}: CaptureCanvasStreamOptions): Promise<void> => {\n try {\n let {\n canvasWhiteboard,\n canvasStream,\n updateCanvasStream,\n screenProducer,\n localScreenProducer,\n transportCreated,\n localTransportCreated,\n updateScreenProducer,\n updateLocalScreenProducer,\n localSocket,\n sleep,\n createSendTransport,\n connectSendTransportScreen,\n disconnectSendTransportScreen,\n } = parameters;\n\n if (start && !canvasStream) {\n const stream = canvasWhiteboard!.captureStream(30);\n canvasStream = stream;\n updateCanvasStream(stream);\n\n if (localSocket && !localSocket.id) {\n try {\n if (!localTransportCreated) {\n await createSendTransport({ option: 'screen', parameters });\n } else {\n try {\n if (localScreenProducer) {\n localScreenProducer.close();\n if (updateLocalScreenProducer) {\n updateLocalScreenProducer(null);\n }\n await sleep({ ms: 500 });\n }\n } catch (error) {\n console.error(error);\n }\n await connectSendTransportScreen({ stream, parameters });\n }\n } catch {\n }\n\n return;\n }\n\n if (!transportCreated) {\n await createSendTransport({ option: 'screen', parameters });\n } else {\n try {\n if (screenProducer) {\n screenProducer.close();\n updateScreenProducer(null);\n await sleep({ ms: 500 });\n }\n } catch (error) {\n console.error(error);\n }\n await connectSendTransportScreen({ stream, parameters });\n }\n } else if (canvasStream && !start) {\n canvasStream.getTracks().forEach((track) => track.stop());\n canvasStream = null;\n updateCanvasStream(null);\n disconnectSendTransportScreen({ parameters });\n }\n } catch (error) {\n console.error(error, 'error in captureCanvasStream');\n }\n};\n","const QnHDCons = { width: { ideal: 320 }, height: { ideal: 180 } };\nconst sdCons = { width: { ideal: 640 }, height: { ideal: 360 } };\nconst hdCons = { width: { ideal: 1280 }, height: { ideal: 720 } };\nconst fhdCons = { width: { ideal: 1920 }, height: { ideal: 1080 } };\nconst qhdCons = { width: { ideal: 2560 }, height: { ideal: 1440 } };\n\nconst QnHDConsPort = { width: { ideal: 180 }, height: { ideal: 320 } };\nconst sdConsPort = { width: { ideal: 360 }, height: { ideal: 640 } };\nconst hdConsPort = { width: { ideal: 720 }, height: { ideal: 1280 } };\nconst fhdConsPort = { width: { ideal: 1080 }, height: { ideal: 1920 } };\nconst qhdConsPort = { width: { ideal: 1440 }, height: { ideal: 2560 } };\n\nconst QnHDConsNeu = { width: { ideal: 240 }, height: { ideal: 240 } };\nconst sdConsNeu = { width: { ideal: 480 }, height: { ideal: 480 } };\nconst hdConsNeu = { width: { ideal: 960 }, height: { ideal: 960 } };\nconst fhdConsNeu = { width: { ideal: 1440 }, height: { ideal: 1440 } };\nconst qhdConsNeu = { width: { ideal: 1920 }, height: { ideal: 1920 } };\n\nconst QnHDFrameRate = 5;\nconst sdFrameRate = 10;\nconst hdFrameRate = 15;\nconst fhdFrameRate = 20;\nconst qhdFrameRate = 30;\nconst screenFrameRate = 30;\n\n/**\n * Preset video capture constraints and frame-rate defaults used by MediaSFU.\n *\n * These exports provide standard landscape, portrait, and neutral constraint\n * presets along with recommended frame-rate values for each quality tier.\n *\n * @example\n * ```typescript\n * const constraints = {\n * video: {\n * ...hdCons,\n * frameRate: { ideal: hdFrameRate },\n * },\n * audio: false,\n * };\n * ```\n */\nexport {\n QnHDCons,\n sdCons,\n hdCons,\n fhdCons,\n qhdCons,\n QnHDConsPort,\n sdConsPort,\n hdConsPort,\n fhdConsPort,\n qhdConsPort,\n QnHDConsNeu,\n sdConsNeu,\n hdConsNeu,\n fhdConsNeu,\n qhdConsNeu,\n QnHDFrameRate,\n sdFrameRate,\n hdFrameRate,\n fhdFrameRate,\n qhdFrameRate,\n screenFrameRate,\n};","import type { HParamsType } from '../../../types/types';\n\nexport const hParams: HParamsType = {\n encodings: [\n {\n rid: 'r8',\n maxBitrate: 240000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 4.0,\n },\n {\n rid: 'r9',\n maxBitrate: 480000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 2.0,\n },\n {\n rid: 'r10',\n maxBitrate: 960000,\n scalabilityMode: 'L1T3',\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 384,\n },\n};","import type { VParamsType } from '../../../types/types';\n\nexport const vParams: VParamsType = {\n encodings: [\n {\n rid: 'r3',\n maxBitrate: 200000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 4.0,\n },\n {\n rid: 'r4',\n maxBitrate: 400000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 2.0,\n },\n {\n rid: 'r5',\n maxBitrate: 800000,\n scalabilityMode: 'L1T3',\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 320,\n },\n};","import type { ScreenParamsType } from '../../../types/types';\n\nexport const screenParams: ScreenParamsType = {\n encodings: [\n {\n rid: 'r7',\n maxBitrate: 3000000,\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 1000,\n },\n};","import type { AParamsType } from '../../../types/types';\n\nexport const aParams: AParamsType = {\n encodings: [\n {\n rid: 'r0',\n maxBitrate: 64000,\n },\n ],\n};","const DEFAULT_MEDIA_SFU_ROOM_API_URL = 'https://mediasfu.com/v1/rooms/';\n\r\ntype MediaSFURoomApiAction = 'createRoom' | 'joinRoom';\r\n\r\nconst getDefaultMediaSFURoomApiUrl = (): string =>\r\n DEFAULT_MEDIA_SFU_ROOM_API_URL;\r\n\r\nconst normalizeManagedRoomApi = (normalizedLink: string): string => {\r\n if (normalizedLink.includes('/v1/rooms')) {\r\n return `${normalizedLink.replace(/\\/$/, '')}/`;\r\n }\r\n\r\n return `${normalizedLink.replace(/\\/$/, '')}/v1/rooms/`;\r\n};\r\n\r\nexport const resolveMediaSFURoomApi = (\r\n localLink: string | undefined,\r\n action: MediaSFURoomApiAction,\r\n): string => {\r\n const normalizedLink = localLink?.trim();\r\n\r\n if (!normalizedLink) {\r\n return getDefaultMediaSFURoomApiUrl();\r\n }\r\n\r\n if (normalizedLink.includes('mediasfu.com')) {\r\n return normalizeManagedRoomApi(normalizedLink);\r\n }\r\n\r\n return `${normalizedLink.replace(/\\/$/, '')}/${action}`;\r\n};\n","import type { CreateMediaSFURoomOptions, JoinMediaSFURoomOptions } from '../../types/types';\nimport { resolveMediaSFURoomApi } from './resolveMediaSFURoomApi';\n\nexport type CreateJoinRoomType = (options: {\n payload: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n localLink?: string;\n}) => Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}>;\n\nexport interface CreateJoinRoomResponse {\n message: string;\n roomName: string;\n secureCode?: string;\n publicURL: string;\n link: string;\n secret: string;\n success: boolean;\n}\n\nexport interface CreateJoinRoomError {\n error: string;\n success?: boolean;\n}\n\nexport type JoinRoomOnMediaSFUType = (options: {\n payload: JoinMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n localLink?: string;\n}) => Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}>;\n\nconst readResponseError = async (response: Response): Promise<string> => {\n const fallbackMessage = `HTTP error! Status: ${response.status}`;\n\n try {\n const responseText = await response.text();\n\n if (!responseText) {\n return fallbackMessage;\n }\n\n const parsedResponse = JSON.parse(responseText) as { error?: string; message?: string };\n return parsedResponse.error || parsedResponse.message || responseText;\n } catch {\n return fallbackMessage;\n }\n};\n\n/**\n * Calls the MediaSFU join-room API and returns a normalized success/error result.\n *\n * This helper supports both cloud and self-hosted deployments through the\n * optional `localLink` override.\n *\n * @param options API request options including credentials and join payload.\n * @returns A result object containing either parsed response data or an error payload.\n *\n * @example\n * ```typescript\n * const result = await joinRoomOnMediaSFU({\n * payload: { action: 'join', meetingID: 'room123', userName: 'Ada' },\n * apiUserName: 'sampleuser',\n * apiKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n * });\n *\n * if (result.success) {\n * console.log(result.data?.roomName);\n * }\n * ```\n */\nexport const joinRoomOnMediaSFU: CreateJoinRoomType = async ({\n payload,\n apiUserName,\n apiKey,\n localLink = '',\n}) => {\n try {\n if (\n !apiUserName ||\n !apiKey ||\n apiUserName === 'yourAPIUSERNAME' ||\n apiKey === 'yourAPIKEY' ||\n apiKey.length !== 64 ||\n apiUserName.length < 6\n ) {\n return { data: { error: 'Invalid credentials' }, success: false };\n }\n\n const finalLink = resolveMediaSFURoomApi(localLink, 'joinRoom');\n\n const response = await fetch(finalLink, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiUserName}:${apiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(await readResponseError(response));\n }\n\n const data = await response.json();\n return { data, success: true };\n } catch (error) {\n const errorMessage = (\n error as { reason?: string; message?: string }\n ).reason || (\n error as { reason?: string; message?: string }\n ).message || 'unknown error';\n return {\n data: { error: `Unable to join room, ${errorMessage}` },\n success: false,\n };\n }\n};"],"names":["decode","cookies","response"],"mappings":"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","x_google_ignoreList":[0]}
|