@signalwire/js 3.23.4 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../../../node_modules/loglevel/lib/loglevel.js","../../core/node_modules/uuid/dist/esm-browser/rng.js","../../core/node_modules/uuid/dist/esm-browser/regex.js","../../core/node_modules/uuid/dist/esm-browser/stringify.js","../../core/node_modules/uuid/dist/esm-browser/v35.js","../../core/node_modules/uuid/dist/esm-browser/parse.js","../../core/node_modules/uuid/dist/esm-browser/validate.js","../../core/node_modules/uuid/dist/esm-browser/md5.js","../../core/node_modules/uuid/dist/esm-browser/v3.js","../../core/node_modules/uuid/dist/esm-browser/native.js","../../core/node_modules/uuid/dist/esm-browser/v4.js","../../core/node_modules/uuid/dist/esm-browser/sha1.js","../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../node_modules/redux/es/redux.js","../../core/node_modules/uuid/dist/esm-browser/v5.js","../../../node_modules/@redux-saga/symbols/dist/redux-saga-symbols.esm.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@redux-saga/is/dist/redux-saga-is.esm.js","../../../node_modules/@redux-saga/core/dist/io-c3792963.js","../../../node_modules/@redux-saga/core/dist/redux-saga-core.esm.js","../../../node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/eventemitter3/index.js","../../core/dist/index.esm.js","../src/fabric/createHttpClient.ts","../../webrtc/dist/mjs/webrtc/src/utils/primitives.js","../../webrtc/dist/mjs/webrtc/src/utils/enumerateDevices.js","../../webrtc/dist/mjs/webrtc/src/utils/permissions.js","../../webrtc/dist/mjs/webrtc/src/utils/getUserMedia.js","../../webrtc/dist/mjs/webrtc/src/utils/getDisplayMedia.js","../../webrtc/dist/mjs/webrtc/src/utils/deviceHelpers.js","../../webrtc/dist/mjs/webrtc/src/utils/helpers.js","../../../node_modules/sdp/sdp.js","../../webrtc/dist/mjs/webrtc/src/utils/sdpHelpers.js","../../webrtc/dist/mjs/webrtc/src/RTCPeer.js","../../webrtc/dist/mjs/webrtc/src/utils/watchRTCPeerMediaPackets.js","../../webrtc/dist/mjs/webrtc/src/workers/vertoEventWorker.js","../../../node_modules/tslib/tslib.es6.js","../../webrtc/dist/mjs/webrtc/src/workers/roomSubscribedWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/promoteDemoteWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/sessionAuthWorker.js","../../webrtc/dist/mjs/webrtc/src/BaseConnection.js","../src/utils/videoElement.ts","../src/utils/audioElement.ts","../src/features/actions.ts","../src/features/mediaElements/mediaElementsSagas.ts","../src/utils/constants.ts","../src/RoomSessionScreenShare.ts","../src/RoomSessionDevice.ts","../src/video/memberListUpdatedWorker.ts","../src/video/childMemberJoinedWorker.ts","../src/video/videoStreamWorker.ts","../src/video/videoRecordWorker.ts","../src/video/videoPlaybackWorker.ts","../src/video/videoWorker.ts","../src/BaseRoomSession.ts","../src/cantina/workers/videoManagerRoomsWorker.ts","../src/cantina/workers/videoManagerRoomWorker.ts","../src/cantina/workers/videoManagerWorker.ts","../src/cantina/VideoManager.ts","../src/Client.ts","../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../src/utils/storage.ts","../src/utils/CloseEvent.ts","../src/JWTSession.ts","../src/createClient.ts","../src/createRoomObject.ts","../src/RoomSession.ts","../src/utils/roomSession.ts","../src/joinRoom.ts","../src/fabric/SWClient.ts","../src/fabric/WSClientWorker.ts","../src/fabric/WSClient.ts","../src/fabric/HTTPClient.ts","../src/fabric/SignalWire.ts","../src/fabric/Client.ts","../src/fabric/buildCall.ts","../src/chat/Client.ts","../src/chat/index.ts","../src/pubSub/Client.ts","../src/pubSub/index.ts","../../webrtc/dist/mjs/webrtc/src/utils/requestPermissions.js"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = level;\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n self.setLevel(defaultLevel, false);\n clearPersistedLevel();\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import { unsafeStringify } from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n var _namespace;\n\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (let i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n const output = [];\n const length32 = input.length * 32;\n const hexTab = '0123456789abcdef';\n\n for (let i = 0; i < length32; i += 8) {\n const x = input[i >> 5] >>> i % 32 & 0xff;\n const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a;\n const oldb = b;\n const oldc = c;\n const oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n const length8 = input.length * 8;\n const output = new Uint32Array(getOutputLength(length8));\n\n for (let i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n const lsw = (x & 0xffff) + (y & 0xffff);\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nconst v3 = v35('v3', 0x30, md5);\nexport default v3;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (let i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n const l = bytes.length / 4 + 2;\n const N = Math.ceil(l / 16);\n const M = new Array(N);\n\n for (let i = 0; i < N; ++i) {\n const arr = new Uint32Array(16);\n\n for (let j = 0; j < 16; ++j) {\n arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];\n }\n\n M[i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (let i = 0; i < N; ++i) {\n const W = new Uint32Array(80);\n\n for (let t = 0; t < 16; ++t) {\n W[t] = M[i][t];\n }\n\n for (let t = 16; t < 80; ++t) {\n W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n }\n\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n let e = H[4];\n\n for (let t = 0; t < 80; ++t) {\n const s = Math.floor(t / 20);\n const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n INIT: \"@@redux/INIT\" + randomString(),\n REPLACE: \"@@redux/REPLACE\" + randomString(),\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n var proto = obj;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n var type = typeof val;\n\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n var constructorName = ctorName(val);\n\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n } // other\n\n\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n var typeOfVal = typeof val;\n\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n\n return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\n\n function getState() {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\n\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n var isSubscribed = true;\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n isSubscribed = false;\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n currentListeners = null;\n };\n }\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\n\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\n\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n }\n\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n\n dispatch({\n type: ActionTypes.REPLACE\n });\n }\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\n\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n } // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n\n\n dispatch({\n type: ActionTypes.INIT\n });\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n\n\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n }\n\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n }\n });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n // keys multiple times.\n\n var unexpectedKeyCache;\n\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError;\n\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination(state, action) {\n if (state === void 0) {\n state = {};\n }\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n\n if (typeof nextStateForKey === 'undefined') {\n var actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n }\n\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n }\n\n var boundActionCreators = {};\n\n for (var key in actionCreators) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n var store = createStore.apply(void 0, arguments);\n\n var _dispatch = function dispatch() {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(void 0, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\n return _objectSpread(_objectSpread({}, store), {}, {\n dispatch: _dispatch\n });\n };\n };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nconst v5 = v35('v5', 0x50, sha1);\nexport default v5;","var createSymbol = function createSymbol(name) {\n return \"@@redux-saga/\" + name;\n};\n\nvar CANCEL =\n/*#__PURE__*/\ncreateSymbol('CANCEL_PROMISE');\nvar CHANNEL_END_TYPE =\n/*#__PURE__*/\ncreateSymbol('CHANNEL_END');\nvar IO =\n/*#__PURE__*/\ncreateSymbol('IO');\nvar MATCH =\n/*#__PURE__*/\ncreateSymbol('MATCH');\nvar MULTICAST =\n/*#__PURE__*/\ncreateSymbol('MULTICAST');\nvar SAGA_ACTION =\n/*#__PURE__*/\ncreateSymbol('SAGA_ACTION');\nvar SELF_CANCELLATION =\n/*#__PURE__*/\ncreateSymbol('SELF_CANCELLATION');\nvar TASK =\n/*#__PURE__*/\ncreateSymbol('TASK');\nvar TASK_CANCEL =\n/*#__PURE__*/\ncreateSymbol('TASK_CANCEL');\nvar TERMINATE =\n/*#__PURE__*/\ncreateSymbol('TERMINATE');\nvar SAGA_LOCATION =\n/*#__PURE__*/\ncreateSymbol('LOCATION');\n\nexport { CANCEL, CHANNEL_END_TYPE, IO, MATCH, MULTICAST, SAGA_ACTION, SAGA_LOCATION, SELF_CANCELLATION, TASK, TASK_CANCEL, TERMINATE };\n","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import { TASK, SAGA_ACTION, MULTICAST, IO } from '@redux-saga/symbols';\n\nvar undef = function undef(v) {\n return v === null || v === undefined;\n};\nvar notUndef = function notUndef(v) {\n return v !== null && v !== undefined;\n};\nvar func = function func(f) {\n return typeof f === 'function';\n};\nvar number = function number(n) {\n return typeof n === 'number';\n};\nvar string = function string(s) {\n return typeof s === 'string';\n};\nvar array = Array.isArray;\nvar object = function object(obj) {\n return obj && !array(obj) && typeof obj === 'object';\n};\nvar promise = function promise(p) {\n return p && func(p.then);\n};\nvar iterator = function iterator(it) {\n return it && func(it.next) && func(it.throw);\n};\nvar iterable = function iterable(it) {\n return it && func(Symbol) ? func(it[Symbol.iterator]) : array(it);\n};\nvar task = function task(t) {\n return t && t[TASK];\n};\nvar sagaAction = function sagaAction(a) {\n return Boolean(a && a[SAGA_ACTION]);\n};\nvar observable = function observable(ob) {\n return ob && func(ob.subscribe);\n};\nvar buffer = function buffer(buf) {\n return buf && func(buf.isEmpty) && func(buf.take) && func(buf.put);\n};\nvar pattern = function pattern(pat) {\n return pat && (string(pat) || symbol(pat) || func(pat) || array(pat) && pat.every(pattern));\n};\nvar channel = function channel(ch) {\n return ch && func(ch.take) && func(ch.close);\n};\nvar stringableFunc = function stringableFunc(f) {\n return func(f) && f.hasOwnProperty('toString');\n};\nvar symbol = function symbol(sym) {\n return Boolean(sym) && typeof Symbol === 'function' && sym.constructor === Symbol && sym !== Symbol.prototype;\n};\nvar multicast = function multicast(ch) {\n return channel(ch) && ch[MULTICAST];\n};\nvar effect = function effect(eff) {\n return eff && eff[IO];\n};\n\nexport { array, buffer, channel, effect, func, iterable, iterator, multicast, notUndef, number, object, observable, pattern, promise, sagaAction, string, stringableFunc, symbol, task, undef };\n","import { TASK_CANCEL, TERMINATE, SAGA_LOCATION, SAGA_ACTION, IO, SELF_CANCELLATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport { array, notUndef, pattern, multicast, channel, undef, effect, task, func, buffer, string, object } from '@redux-saga/is';\nimport delayP from '@redux-saga/delay-p';\n\nvar konst = function konst(v) {\n return function () {\n return v;\n };\n};\nvar kTrue =\n/*#__PURE__*/\nkonst(true);\n\nvar noop = function noop() {};\n\nif (process.env.NODE_ENV !== 'production' && typeof Proxy !== 'undefined') {\n noop =\n /*#__PURE__*/\n new Proxy(noop, {\n set: function set() {\n throw internalErr('There was an attempt to assign a property to internal `noop` function.');\n }\n });\n}\nvar identity = function identity(v) {\n return v;\n};\nvar hasSymbol = typeof Symbol === 'function';\nvar asyncIteratorSymbol = hasSymbol && Symbol.asyncIterator ? Symbol.asyncIterator : '@@asyncIterator';\nfunction check(value, predicate, error) {\n if (!predicate(value)) {\n throw new Error(error);\n }\n}\nvar assignWithSymbols = function assignWithSymbols(target, source) {\n _extends(target, source);\n\n if (Object.getOwnPropertySymbols) {\n Object.getOwnPropertySymbols(source).forEach(function (s) {\n target[s] = source[s];\n });\n }\n};\nvar flatMap = function flatMap(mapper, arr) {\n var _ref;\n\n return (_ref = []).concat.apply(_ref, arr.map(mapper));\n};\nfunction remove(array, item) {\n var index = array.indexOf(item);\n\n if (index >= 0) {\n array.splice(index, 1);\n }\n}\nfunction once(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n\n called = true;\n fn();\n };\n}\n\nvar kThrow = function kThrow(err) {\n throw err;\n};\n\nvar kReturn = function kReturn(value) {\n return {\n value: value,\n done: true\n };\n};\n\nfunction makeIterator(next, thro, name) {\n if (thro === void 0) {\n thro = kThrow;\n }\n\n if (name === void 0) {\n name = 'iterator';\n }\n\n var iterator = {\n meta: {\n name: name\n },\n next: next,\n throw: thro,\n return: kReturn,\n isSagaIterator: true\n };\n\n if (typeof Symbol !== 'undefined') {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n}\nfunction logError(error, _ref2) {\n var sagaStack = _ref2.sagaStack;\n\n /*eslint-disable no-console*/\n console.error(error);\n console.error(sagaStack);\n}\nvar internalErr = function internalErr(err) {\n return new Error(\"\\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\\n Error: \" + err + \"\\n\");\n};\nvar createSetContextWarning = function createSetContextWarning(ctx, props) {\n return (ctx ? ctx + '.' : '') + \"setContext(props): argument \" + props + \" is not a plain object\";\n};\nvar FROZEN_ACTION_ERROR = \"You can't put (a.k.a. dispatch from saga) frozen actions.\\nWe have to define a special non-enumerable property on those actions for scheduling purposes.\\nOtherwise you wouldn't be able to communicate properly between sagas & other subscribers (action ordering would become far less predictable).\\nIf you are using redux and you care about this behaviour (frozen actions),\\nthen you might want to switch to freezing actions in a middleware rather than in action creator.\\nExample implementation:\\n\\nconst freezeActions = store => next => action => next(Object.freeze(action))\\n\"; // creates empty, but not-holey array\n\nvar createEmptyArray = function createEmptyArray(n) {\n return Array.apply(null, new Array(n));\n};\nvar wrapSagaDispatch = function wrapSagaDispatch(dispatch) {\n return function (action) {\n if (process.env.NODE_ENV !== 'production') {\n check(action, function (ac) {\n return !Object.isFrozen(ac);\n }, FROZEN_ACTION_ERROR);\n }\n\n return dispatch(Object.defineProperty(action, SAGA_ACTION, {\n value: true\n }));\n };\n};\nvar shouldTerminate = function shouldTerminate(res) {\n return res === TERMINATE;\n};\nvar shouldCancel = function shouldCancel(res) {\n return res === TASK_CANCEL;\n};\nvar shouldComplete = function shouldComplete(res) {\n return shouldTerminate(res) || shouldCancel(res);\n};\nfunction createAllStyleChildCallbacks(shape, parentCallback) {\n var keys = Object.keys(shape);\n var totalCount = keys.length;\n\n if (process.env.NODE_ENV !== 'production') {\n check(totalCount, function (c) {\n return c > 0;\n }, 'createAllStyleChildCallbacks: get an empty array or object');\n }\n\n var completedCount = 0;\n var completed;\n var results = array(shape) ? createEmptyArray(totalCount) : {};\n var childCallbacks = {};\n\n function checkEnd() {\n if (completedCount === totalCount) {\n completed = true;\n parentCallback(results);\n }\n }\n\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n parentCallback.cancel();\n parentCallback(res, isErr);\n } else {\n results[key] = res;\n completedCount++;\n checkEnd();\n }\n };\n\n chCbAtKey.cancel = noop;\n childCallbacks[key] = chCbAtKey;\n });\n\n parentCallback.cancel = function () {\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCallbacks[key].cancel();\n });\n }\n };\n\n return childCallbacks;\n}\nfunction getMetaInfo(fn) {\n return {\n name: fn.name || 'anonymous',\n location: getLocation(fn)\n };\n}\nfunction getLocation(instrumented) {\n return instrumented[SAGA_LOCATION];\n}\n\nvar BUFFER_OVERFLOW = \"Channel's Buffer overflow!\";\nvar ON_OVERFLOW_THROW = 1;\nvar ON_OVERFLOW_DROP = 2;\nvar ON_OVERFLOW_SLIDE = 3;\nvar ON_OVERFLOW_EXPAND = 4;\nvar zeroBuffer = {\n isEmpty: kTrue,\n put: noop,\n take: noop\n};\n\nfunction ringBuffer(limit, overflowAction) {\n if (limit === void 0) {\n limit = 10;\n }\n\n var arr = new Array(limit);\n var length = 0;\n var pushIndex = 0;\n var popIndex = 0;\n\n var push = function push(it) {\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n length++;\n };\n\n var take = function take() {\n if (length != 0) {\n var it = arr[popIndex];\n arr[popIndex] = null;\n length--;\n popIndex = (popIndex + 1) % limit;\n return it;\n }\n };\n\n var flush = function flush() {\n var items = [];\n\n while (length) {\n items.push(take());\n }\n\n return items;\n };\n\n return {\n isEmpty: function isEmpty() {\n return length == 0;\n },\n put: function put(it) {\n if (length < limit) {\n push(it);\n } else {\n var doubledLimit;\n\n switch (overflowAction) {\n case ON_OVERFLOW_THROW:\n throw new Error(BUFFER_OVERFLOW);\n\n case ON_OVERFLOW_SLIDE:\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n popIndex = pushIndex;\n break;\n\n case ON_OVERFLOW_EXPAND:\n doubledLimit = 2 * limit;\n arr = flush();\n length = arr.length;\n pushIndex = arr.length;\n popIndex = 0;\n arr.length = doubledLimit;\n limit = doubledLimit;\n push(it);\n break;\n\n default: // DROP\n\n }\n }\n },\n take: take,\n flush: flush\n };\n}\n\nvar none = function none() {\n return zeroBuffer;\n};\nvar fixed = function fixed(limit) {\n return ringBuffer(limit, ON_OVERFLOW_THROW);\n};\nvar dropping = function dropping(limit) {\n return ringBuffer(limit, ON_OVERFLOW_DROP);\n};\nvar sliding = function sliding(limit) {\n return ringBuffer(limit, ON_OVERFLOW_SLIDE);\n};\nvar expanding = function expanding(initialSize) {\n return ringBuffer(initialSize, ON_OVERFLOW_EXPAND);\n};\n\nvar buffers = /*#__PURE__*/Object.freeze({\n __proto__: null,\n none: none,\n fixed: fixed,\n dropping: dropping,\n sliding: sliding,\n expanding: expanding\n});\n\nvar TAKE = 'TAKE';\nvar PUT = 'PUT';\nvar ALL = 'ALL';\nvar RACE = 'RACE';\nvar CALL = 'CALL';\nvar CPS = 'CPS';\nvar FORK = 'FORK';\nvar JOIN = 'JOIN';\nvar CANCEL = 'CANCEL';\nvar SELECT = 'SELECT';\nvar ACTION_CHANNEL = 'ACTION_CHANNEL';\nvar CANCELLED = 'CANCELLED';\nvar FLUSH = 'FLUSH';\nvar GET_CONTEXT = 'GET_CONTEXT';\nvar SET_CONTEXT = 'SET_CONTEXT';\n\nvar effectTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n TAKE: TAKE,\n PUT: PUT,\n ALL: ALL,\n RACE: RACE,\n CALL: CALL,\n CPS: CPS,\n FORK: FORK,\n JOIN: JOIN,\n CANCEL: CANCEL,\n SELECT: SELECT,\n ACTION_CHANNEL: ACTION_CHANNEL,\n CANCELLED: CANCELLED,\n FLUSH: FLUSH,\n GET_CONTEXT: GET_CONTEXT,\n SET_CONTEXT: SET_CONTEXT\n});\n\nvar TEST_HINT = '\\n(HINT: if you are getting these errors in tests, consider using createMockTask from @redux-saga/testing-utils)';\n\nvar makeEffect = function makeEffect(type, payload) {\n var _ref;\n\n return _ref = {}, _ref[IO] = true, _ref.combinator = false, _ref.type = type, _ref.payload = payload, _ref;\n};\n\nvar isForkEffect = function isForkEffect(eff) {\n return effect(eff) && eff.type === FORK;\n};\n\nvar detach = function detach(eff) {\n if (process.env.NODE_ENV !== 'production') {\n check(eff, isForkEffect, 'detach(eff): argument must be a fork effect');\n }\n\n return makeEffect(FORK, _extends({}, eff.payload, {\n detached: true\n }));\n};\nfunction take(patternOrChannel, multicastPattern) {\n if (patternOrChannel === void 0) {\n patternOrChannel = '*';\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'take(patternOrChannel): patternOrChannel is undefined');\n }\n\n if (pattern(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(pattern) takes one argument but two were provided. Consider passing an array for listening to several action types\");\n }\n\n return makeEffect(TAKE, {\n pattern: patternOrChannel\n });\n }\n\n if (multicast(patternOrChannel) && notUndef(multicastPattern) && pattern(multicastPattern)) {\n return makeEffect(TAKE, {\n channel: patternOrChannel,\n pattern: multicastPattern\n });\n }\n\n if (channel(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(channel) takes one argument but two were provided. Second argument is ignored.\");\n }\n\n return makeEffect(TAKE, {\n channel: patternOrChannel\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\"take(patternOrChannel): argument \" + patternOrChannel + \" is not valid channel or a valid pattern\");\n }\n}\nvar takeMaybe = function takeMaybe() {\n var eff = take.apply(void 0, arguments);\n eff.payload.maybe = true;\n return eff;\n};\nfunction put(channel$1, action) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n check(channel$1, notUndef, 'put(channel, action): argument channel is undefined');\n check(channel$1, channel, \"put(channel, action): argument \" + channel$1 + \" is not a valid channel\");\n check(action, notUndef, 'put(channel, action): argument action is undefined');\n } else {\n check(channel$1, notUndef, 'put(action): argument action is undefined');\n }\n }\n\n if (undef(action)) {\n action = channel$1; // `undefined` instead of `null` to make default parameter work\n\n channel$1 = undefined;\n }\n\n return makeEffect(PUT, {\n channel: channel$1,\n action: action\n });\n}\nvar putResolve = function putResolve() {\n var eff = put.apply(void 0, arguments);\n eff.payload.resolve = true;\n return eff;\n};\nfunction all(effects) {\n var eff = makeEffect(ALL, effects);\n eff.combinator = true;\n return eff;\n}\nfunction race(effects) {\n var eff = makeEffect(RACE, effects);\n eff.combinator = true;\n return eff;\n} // this match getFnCallDescriptor logic\n\nvar validateFnDescriptor = function validateFnDescriptor(effectName, fnDescriptor) {\n check(fnDescriptor, notUndef, effectName + \": argument fn is undefined or null\");\n\n if (func(fnDescriptor)) {\n return;\n }\n\n var context = null;\n var fn;\n\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n check(fn, notUndef, effectName + \": argument of type [context, fn] has undefined or null `fn`\");\n } else if (object(fnDescriptor)) {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n check(fn, notUndef, effectName + \": argument of type {context, fn} has undefined or null `fn`\");\n } else {\n check(fnDescriptor, func, effectName + \": argument fn is not function\");\n return;\n }\n\n if (context && string(fn)) {\n check(context[fn], func, effectName + \": context arguments has no such method - \\\"\" + fn + \"\\\"\");\n return;\n }\n\n check(fn, func, effectName + \": unpacked fn argument (from [context, fn] or {context, fn}) is not a function\");\n};\n\nfunction getFnCallDescriptor(fnDescriptor, args) {\n var context = null;\n var fn;\n\n if (func(fnDescriptor)) {\n fn = fnDescriptor;\n } else {\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n } else {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n }\n\n if (context && string(fn) && func(context[fn])) {\n fn = context[fn];\n }\n }\n\n return {\n context: context,\n fn: fn,\n args: args\n };\n}\n\nvar isNotDelayEffect = function isNotDelayEffect(fn) {\n return fn !== delay;\n};\n\nfunction call(fnDescriptor) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var arg0 = typeof args[0] === 'number' ? args[0] : 'ms';\n check(fnDescriptor, isNotDelayEffect, \"instead of writing `yield call(delay, \" + arg0 + \")` where delay is an effect from `redux-saga/effects` you should write `yield delay(\" + arg0 + \")`\");\n validateFnDescriptor('call', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction apply(context, fn, args) {\n if (args === void 0) {\n args = [];\n }\n\n var fnDescriptor = [context, fn];\n\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('apply', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor([context, fn], args));\n}\nfunction cps(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('cps', fnDescriptor);\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return makeEffect(CPS, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction fork(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('fork', fnDescriptor);\n check(fnDescriptor, function (arg) {\n return !effect(arg);\n }, 'fork: argument must not be an effect');\n }\n\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return makeEffect(FORK, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction spawn(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('spawn', fnDescriptor);\n }\n\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n\n return detach(fork.apply(void 0, [fnDescriptor].concat(args)));\n}\nfunction join(taskOrTasks) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('join(...tasks) is not supported any more. Please use join([...tasks]) to join multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"join([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else {\n check(taskOrTasks, task, \"join(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(JOIN, taskOrTasks);\n}\nfunction cancel(taskOrTasks) {\n if (taskOrTasks === void 0) {\n taskOrTasks = SELF_CANCELLATION;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('cancel(...tasks) is not supported any more. Please use cancel([...tasks]) to cancel multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"cancel([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else if (taskOrTasks !== SELF_CANCELLATION && notUndef(taskOrTasks)) {\n check(taskOrTasks, task, \"cancel(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(CANCEL, taskOrTasks);\n}\nfunction select(selector) {\n if (selector === void 0) {\n selector = identity;\n }\n\n for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n args[_key5 - 1] = arguments[_key5];\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'select(selector, [...]): argument selector is undefined');\n check(selector, func, \"select(selector, [...]): argument \" + selector + \" is not a function\");\n }\n\n return makeEffect(SELECT, {\n selector: selector,\n args: args\n });\n}\n/**\n channel(pattern, [buffer]) => creates a proxy channel for store actions\n**/\n\nfunction actionChannel(pattern$1, buffer$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(pattern$1, pattern, 'actionChannel(pattern,...): argument pattern is not valid');\n\n if (arguments.length > 1) {\n check(buffer$1, notUndef, 'actionChannel(pattern, buffer): argument buffer is undefined');\n check(buffer$1, buffer, \"actionChannel(pattern, buffer): argument \" + buffer$1 + \" is not a valid buffer\");\n }\n }\n\n return makeEffect(ACTION_CHANNEL, {\n pattern: pattern$1,\n buffer: buffer$1\n });\n}\nfunction cancelled() {\n return makeEffect(CANCELLED, {});\n}\nfunction flush(channel$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(channel$1, channel, \"flush(channel): argument \" + channel$1 + \" is not valid channel\");\n }\n\n return makeEffect(FLUSH, channel$1);\n}\nfunction getContext(prop) {\n if (process.env.NODE_ENV !== 'production') {\n check(prop, string, \"getContext(prop): argument \" + prop + \" is not a string\");\n }\n\n return makeEffect(GET_CONTEXT, prop);\n}\nfunction setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning(null, props));\n }\n\n return makeEffect(SET_CONTEXT, props);\n}\nvar delay =\n/*#__PURE__*/\ncall.bind(null, delayP);\n\nexport { apply as $, ALL as A, logError as B, CALL as C, wrapSagaDispatch as D, identity as E, FORK as F, GET_CONTEXT as G, buffers as H, detach as I, JOIN as J, take as K, fork as L, cancel as M, call as N, delay as O, PUT as P, actionChannel as Q, RACE as R, SELECT as S, TAKE as T, sliding as U, race as V, effectTypes as W, takeMaybe as X, put as Y, putResolve as Z, all as _, CPS as a, cps as a0, spawn as a1, join as a2, select as a3, cancelled as a4, flush as a5, getContext as a6, setContext as a7, CANCEL as b, check as c, ACTION_CHANNEL as d, expanding as e, CANCELLED as f, FLUSH as g, SET_CONTEXT as h, internalErr as i, getMetaInfo as j, kTrue as k, createAllStyleChildCallbacks as l, createEmptyArray as m, none as n, once as o, assignWithSymbols as p, makeIterator as q, remove as r, shouldComplete as s, noop as t, flatMap as u, getLocation as v, createSetContextWarning as w, asyncIteratorSymbol as x, shouldCancel as y, shouldTerminate as z };\n","import { CHANNEL_END_TYPE, MULTICAST, MATCH, SAGA_ACTION, CANCEL, SELF_CANCELLATION, TERMINATE, TASK, TASK_CANCEL, IO } from '@redux-saga/symbols';\nexport { CANCEL, SAGA_LOCATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport { string as string$1, array as array$1, stringableFunc, func, symbol as symbol$1, buffer, notUndef, promise, iterator, undef, object, channel as channel$1 } from '@redux-saga/is';\nimport { k as kTrue, e as expanding, c as check, o as once, r as remove, n as none, i as internalErr, T as TAKE, P as PUT, A as ALL, R as RACE, C as CALL, a as CPS, F as FORK, J as JOIN, b as CANCEL$1, S as SELECT, d as ACTION_CHANNEL, f as CANCELLED$1, g as FLUSH, G as GET_CONTEXT, h as SET_CONTEXT, j as getMetaInfo, l as createAllStyleChildCallbacks, m as createEmptyArray, p as assignWithSymbols, q as makeIterator, s as shouldComplete, t as noop, u as flatMap, v as getLocation, w as createSetContextWarning, x as asyncIteratorSymbol, y as shouldCancel, z as shouldTerminate, B as logError, D as wrapSagaDispatch, E as identity } from './io-c3792963.js';\nexport { H as buffers, I as detach } from './io-c3792963.js';\nimport { compose } from 'redux';\nimport deferred from '@redux-saga/deferred';\nimport '@redux-saga/delay-p';\n\nvar queue = [];\n/**\n Variable to hold a counting semaphore\n - Incrementing adds a lock and puts the scheduler in a `suspended` state (if it's not\n already suspended)\n - Decrementing releases a lock. Zero locks puts the scheduler in a `released` state. This\n triggers flushing the queued tasks.\n**/\n\nvar semaphore = 0;\n/**\n Executes a task 'atomically'. Tasks scheduled during this execution will be queued\n and flushed after this task has finished (assuming the scheduler endup in a released\n state).\n**/\n\nfunction exec(task) {\n try {\n suspend();\n task();\n } finally {\n release();\n }\n}\n/**\n Executes or queues a task depending on the state of the scheduler (`suspended` or `released`)\n**/\n\n\nfunction asap(task) {\n queue.push(task);\n\n if (!semaphore) {\n suspend();\n flush();\n }\n}\n/**\n * Puts the scheduler in a `suspended` state and executes a task immediately.\n */\n\nfunction immediately(task) {\n try {\n suspend();\n return task();\n } finally {\n flush();\n }\n}\n/**\n Puts the scheduler in a `suspended` state. Scheduled tasks will be queued until the\n scheduler is released.\n**/\n\nfunction suspend() {\n semaphore++;\n}\n/**\n Puts the scheduler in a `released` state.\n**/\n\n\nfunction release() {\n semaphore--;\n}\n/**\n Releases the current lock. Executes all queued tasks if the scheduler is in the released state.\n**/\n\n\nfunction flush() {\n release();\n var task;\n\n while (!semaphore && (task = queue.shift()) !== undefined) {\n exec(task);\n }\n}\n\nvar array = function array(patterns) {\n return function (input) {\n return patterns.some(function (p) {\n return matcher(p)(input);\n });\n };\n};\nvar predicate = function predicate(_predicate) {\n return function (input) {\n return _predicate(input);\n };\n};\nvar string = function string(pattern) {\n return function (input) {\n return input.type === String(pattern);\n };\n};\nvar symbol = function symbol(pattern) {\n return function (input) {\n return input.type === pattern;\n };\n};\nvar wildcard = function wildcard() {\n return kTrue;\n};\nfunction matcher(pattern) {\n // prettier-ignore\n var matcherCreator = pattern === '*' ? wildcard : string$1(pattern) ? string : array$1(pattern) ? array : stringableFunc(pattern) ? string : func(pattern) ? predicate : symbol$1(pattern) ? symbol : null;\n\n if (matcherCreator === null) {\n throw new Error(\"invalid pattern: \" + pattern);\n }\n\n return matcherCreator(pattern);\n}\n\nvar END = {\n type: CHANNEL_END_TYPE\n};\nvar isEnd = function isEnd(a) {\n return a && a.type === CHANNEL_END_TYPE;\n};\nvar CLOSED_CHANNEL_WITH_TAKERS = 'Cannot have a closed channel with pending takers';\nvar INVALID_BUFFER = 'invalid buffer passed to channel factory function';\nvar UNDEFINED_INPUT_ERROR = \"Saga or channel was provided with an undefined action\\nHints:\\n - check that your Action Creator returns a non-undefined value\\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners\";\nfunction channel(buffer$1) {\n if (buffer$1 === void 0) {\n buffer$1 = expanding();\n }\n\n var closed = false;\n var takers = [];\n\n if (process.env.NODE_ENV !== 'production') {\n check(buffer$1, buffer, INVALID_BUFFER);\n }\n\n function checkForbiddenStates() {\n if (closed && takers.length) {\n throw internalErr(CLOSED_CHANNEL_WITH_TAKERS);\n }\n\n if (takers.length && !buffer$1.isEmpty()) {\n throw internalErr('Cannot have pending takers with non empty buffer');\n }\n }\n\n function put(input) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(input, notUndef, UNDEFINED_INPUT_ERROR);\n }\n\n if (closed) {\n return;\n }\n\n if (takers.length === 0) {\n return buffer$1.put(input);\n }\n\n var cb = takers.shift();\n cb(input);\n }\n\n function take(cb) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(cb, func, \"channel.take's callback must be a function\");\n }\n\n if (closed && buffer$1.isEmpty()) {\n cb(END);\n } else if (!buffer$1.isEmpty()) {\n cb(buffer$1.take());\n } else {\n takers.push(cb);\n\n cb.cancel = function () {\n remove(takers, cb);\n };\n }\n }\n\n function flush(cb) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(cb, func, \"channel.flush' callback must be a function\");\n }\n\n if (closed && buffer$1.isEmpty()) {\n cb(END);\n return;\n }\n\n cb(buffer$1.flush());\n }\n\n function close() {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n if (closed) {\n return;\n }\n\n closed = true;\n var arr = takers;\n takers = [];\n\n for (var i = 0, len = arr.length; i < len; i++) {\n var taker = arr[i];\n taker(END);\n }\n }\n\n return {\n take: take,\n put: put,\n flush: flush,\n close: close\n };\n}\nfunction eventChannel(subscribe, buffer) {\n if (buffer === void 0) {\n buffer = none();\n }\n\n var closed = false;\n var unsubscribe;\n var chan = channel(buffer);\n\n var close = function close() {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (func(unsubscribe)) {\n unsubscribe();\n }\n\n chan.close();\n };\n\n unsubscribe = subscribe(function (input) {\n if (isEnd(input)) {\n close();\n return;\n }\n\n chan.put(input);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n check(unsubscribe, func, 'in eventChannel: subscribe should return a function to unsubscribe');\n }\n\n unsubscribe = once(unsubscribe);\n\n if (closed) {\n unsubscribe();\n }\n\n return {\n take: chan.take,\n flush: chan.flush,\n close: close\n };\n}\nfunction multicastChannel() {\n var _ref;\n\n var closed = false;\n var currentTakers = [];\n var nextTakers = currentTakers;\n\n function checkForbiddenStates() {\n if (closed && nextTakers.length) {\n throw internalErr(CLOSED_CHANNEL_WITH_TAKERS);\n }\n }\n\n var ensureCanMutateNextTakers = function ensureCanMutateNextTakers() {\n if (nextTakers !== currentTakers) {\n return;\n }\n\n nextTakers = currentTakers.slice();\n };\n\n var close = function close() {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n closed = true;\n var takers = currentTakers = nextTakers;\n nextTakers = [];\n takers.forEach(function (taker) {\n taker(END);\n });\n };\n\n return _ref = {}, _ref[MULTICAST] = true, _ref.put = function put(input) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(input, notUndef, UNDEFINED_INPUT_ERROR);\n }\n\n if (closed) {\n return;\n }\n\n if (isEnd(input)) {\n close();\n return;\n }\n\n var takers = currentTakers = nextTakers;\n\n for (var i = 0, len = takers.length; i < len; i++) {\n var taker = takers[i];\n\n if (taker[MATCH](input)) {\n taker.cancel();\n taker(input);\n }\n }\n }, _ref.take = function take(cb, matcher) {\n if (matcher === void 0) {\n matcher = wildcard;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n if (closed) {\n cb(END);\n return;\n }\n\n cb[MATCH] = matcher;\n ensureCanMutateNextTakers();\n nextTakers.push(cb);\n cb.cancel = once(function () {\n ensureCanMutateNextTakers();\n remove(nextTakers, cb);\n });\n }, _ref.close = close, _ref;\n}\nfunction stdChannel() {\n var chan = multicastChannel();\n var put = chan.put;\n\n chan.put = function (input) {\n if (input[SAGA_ACTION]) {\n put(input);\n return;\n }\n\n asap(function () {\n put(input);\n });\n };\n\n return chan;\n}\n\nvar RUNNING = 0;\nvar CANCELLED = 1;\nvar ABORTED = 2;\nvar DONE = 3;\n\nfunction resolvePromise(promise, cb) {\n var cancelPromise = promise[CANCEL];\n\n if (func(cancelPromise)) {\n cb.cancel = cancelPromise;\n }\n\n promise.then(cb, function (error) {\n cb(error, true);\n });\n}\n\nvar current = 0;\nvar nextSagaId = (function () {\n return ++current;\n});\n\nvar _effectRunnerMap;\n\nfunction getIteratorMetaInfo(iterator, fn) {\n if (iterator.isSagaIterator) {\n return {\n name: iterator.meta.name\n };\n }\n\n return getMetaInfo(fn);\n}\n\nfunction createTaskIterator(_ref) {\n var context = _ref.context,\n fn = _ref.fn,\n args = _ref.args;\n\n // catch synchronous failures; see #152 and #441\n try {\n var result = fn.apply(context, args); // i.e. a generator function returns an iterator\n\n if (iterator(result)) {\n return result;\n }\n\n var resolved = false;\n\n var next = function next(arg) {\n if (!resolved) {\n resolved = true; // Only promises returned from fork will be interpreted. See #1573\n\n return {\n value: result,\n done: !promise(result)\n };\n } else {\n return {\n value: arg,\n done: true\n };\n }\n };\n\n return makeIterator(next);\n } catch (err) {\n // do not bubble up synchronous failures for detached forks\n // instead create a failed task. See #152 and #441\n return makeIterator(function () {\n throw err;\n });\n }\n}\n\nfunction runPutEffect(env, _ref2, cb) {\n var channel = _ref2.channel,\n action = _ref2.action,\n resolve = _ref2.resolve;\n\n /**\n Schedule the put in case another saga is holding a lock.\n The put will be executed atomically. ie nested puts will execute after\n this put has terminated.\n **/\n asap(function () {\n var result;\n\n try {\n result = (channel ? channel.put : env.dispatch)(action);\n } catch (error) {\n cb(error, true);\n return;\n }\n\n if (resolve && promise(result)) {\n resolvePromise(result, cb);\n } else {\n cb(result);\n }\n }); // Put effects are non cancellables\n}\n\nfunction runTakeEffect(env, _ref3, cb) {\n var _ref3$channel = _ref3.channel,\n channel = _ref3$channel === void 0 ? env.channel : _ref3$channel,\n pattern = _ref3.pattern,\n maybe = _ref3.maybe;\n\n var takeCb = function takeCb(input) {\n if (input instanceof Error) {\n cb(input, true);\n return;\n }\n\n if (isEnd(input) && !maybe) {\n cb(TERMINATE);\n return;\n }\n\n cb(input);\n };\n\n try {\n channel.take(takeCb, notUndef(pattern) ? matcher(pattern) : null);\n } catch (err) {\n cb(err, true);\n return;\n }\n\n cb.cancel = takeCb.cancel;\n}\n\nfunction runCallEffect(env, _ref4, cb, _ref5) {\n var context = _ref4.context,\n fn = _ref4.fn,\n args = _ref4.args;\n var task = _ref5.task;\n\n // catch synchronous failures; see #152\n try {\n var result = fn.apply(context, args);\n\n if (promise(result)) {\n resolvePromise(result, cb);\n return;\n }\n\n if (iterator(result)) {\n // resolve iterator\n proc(env, result, task.context, current, getMetaInfo(fn),\n /* isRoot */\n false, cb);\n return;\n }\n\n cb(result);\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runCPSEffect(env, _ref6, cb) {\n var context = _ref6.context,\n fn = _ref6.fn,\n args = _ref6.args;\n\n // CPS (ie node style functions) can define their own cancellation logic\n // by setting cancel field on the cb\n // catch synchronous failures; see #152\n try {\n var cpsCb = function cpsCb(err, res) {\n if (undef(err)) {\n cb(res);\n } else {\n cb(err, true);\n }\n };\n\n fn.apply(context, args.concat(cpsCb));\n\n if (cpsCb.cancel) {\n cb.cancel = cpsCb.cancel;\n }\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runForkEffect(env, _ref7, cb, _ref8) {\n var context = _ref7.context,\n fn = _ref7.fn,\n args = _ref7.args,\n detached = _ref7.detached;\n var parent = _ref8.task;\n var taskIterator = createTaskIterator({\n context: context,\n fn: fn,\n args: args\n });\n var meta = getIteratorMetaInfo(taskIterator, fn);\n immediately(function () {\n var child = proc(env, taskIterator, parent.context, current, meta, detached, undefined);\n\n if (detached) {\n cb(child);\n } else {\n if (child.isRunning()) {\n parent.queue.addTask(child);\n cb(child);\n } else if (child.isAborted()) {\n parent.queue.abort(child.error());\n } else {\n cb(child);\n }\n }\n }); // Fork effects are non cancellables\n}\n\nfunction runJoinEffect(env, taskOrTasks, cb, _ref9) {\n var task = _ref9.task;\n\n var joinSingleTask = function joinSingleTask(taskToJoin, cb) {\n if (taskToJoin.isRunning()) {\n var joiner = {\n task: task,\n cb: cb\n };\n\n cb.cancel = function () {\n if (taskToJoin.isRunning()) remove(taskToJoin.joiners, joiner);\n };\n\n taskToJoin.joiners.push(joiner);\n } else {\n if (taskToJoin.isAborted()) {\n cb(taskToJoin.error(), true);\n } else {\n cb(taskToJoin.result());\n }\n }\n };\n\n if (array$1(taskOrTasks)) {\n if (taskOrTasks.length === 0) {\n cb([]);\n return;\n }\n\n var childCallbacks = createAllStyleChildCallbacks(taskOrTasks, cb);\n taskOrTasks.forEach(function (t, i) {\n joinSingleTask(t, childCallbacks[i]);\n });\n } else {\n joinSingleTask(taskOrTasks, cb);\n }\n}\n\nfunction cancelSingleTask(taskToCancel) {\n if (taskToCancel.isRunning()) {\n taskToCancel.cancel();\n }\n}\n\nfunction runCancelEffect(env, taskOrTasks, cb, _ref10) {\n var task = _ref10.task;\n\n if (taskOrTasks === SELF_CANCELLATION) {\n cancelSingleTask(task);\n } else if (array$1(taskOrTasks)) {\n taskOrTasks.forEach(cancelSingleTask);\n } else {\n cancelSingleTask(taskOrTasks);\n }\n\n cb(); // cancel effects are non cancellables\n}\n\nfunction runAllEffect(env, effects, cb, _ref11) {\n var digestEffect = _ref11.digestEffect;\n var effectId = current;\n var keys = Object.keys(effects);\n\n if (keys.length === 0) {\n cb(array$1(effects) ? [] : {});\n return;\n }\n\n var childCallbacks = createAllStyleChildCallbacks(effects, cb);\n keys.forEach(function (key) {\n digestEffect(effects[key], effectId, childCallbacks[key], key);\n });\n}\n\nfunction runRaceEffect(env, effects, cb, _ref12) {\n var digestEffect = _ref12.digestEffect;\n var effectId = current;\n var keys = Object.keys(effects);\n var response = array$1(effects) ? createEmptyArray(keys.length) : {};\n var childCbs = {};\n var completed = false;\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n // Race Auto cancellation\n cb.cancel();\n cb(res, isErr);\n } else {\n cb.cancel();\n completed = true;\n response[key] = res;\n cb(response);\n }\n };\n\n chCbAtKey.cancel = noop;\n childCbs[key] = chCbAtKey;\n });\n\n cb.cancel = function () {\n // prevents unnecessary cancellation\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCbs[key].cancel();\n });\n }\n };\n\n keys.forEach(function (key) {\n if (completed) {\n return;\n }\n\n digestEffect(effects[key], effectId, childCbs[key], key);\n });\n}\n\nfunction runSelectEffect(env, _ref13, cb) {\n var selector = _ref13.selector,\n args = _ref13.args;\n\n try {\n var state = selector.apply(void 0, [env.getState()].concat(args));\n cb(state);\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runChannelEffect(env, _ref14, cb) {\n var pattern = _ref14.pattern,\n buffer = _ref14.buffer;\n var chan = channel(buffer);\n var match = matcher(pattern);\n\n var taker = function taker(action) {\n if (!isEnd(action)) {\n env.channel.take(taker, match);\n }\n\n chan.put(action);\n };\n\n var close = chan.close;\n\n chan.close = function () {\n taker.cancel();\n close();\n };\n\n env.channel.take(taker, match);\n cb(chan);\n}\n\nfunction runCancelledEffect(env, data, cb, _ref15) {\n var task = _ref15.task;\n cb(task.isCancelled());\n}\n\nfunction runFlushEffect(env, channel, cb) {\n channel.flush(cb);\n}\n\nfunction runGetContextEffect(env, prop, cb, _ref16) {\n var task = _ref16.task;\n cb(task.context[prop]);\n}\n\nfunction runSetContextEffect(env, props, cb, _ref17) {\n var task = _ref17.task;\n assignWithSymbols(task.context, props);\n cb();\n}\n\nvar effectRunnerMap = (_effectRunnerMap = {}, _effectRunnerMap[TAKE] = runTakeEffect, _effectRunnerMap[PUT] = runPutEffect, _effectRunnerMap[ALL] = runAllEffect, _effectRunnerMap[RACE] = runRaceEffect, _effectRunnerMap[CALL] = runCallEffect, _effectRunnerMap[CPS] = runCPSEffect, _effectRunnerMap[FORK] = runForkEffect, _effectRunnerMap[JOIN] = runJoinEffect, _effectRunnerMap[CANCEL$1] = runCancelEffect, _effectRunnerMap[SELECT] = runSelectEffect, _effectRunnerMap[ACTION_CHANNEL] = runChannelEffect, _effectRunnerMap[CANCELLED$1] = runCancelledEffect, _effectRunnerMap[FLUSH] = runFlushEffect, _effectRunnerMap[GET_CONTEXT] = runGetContextEffect, _effectRunnerMap[SET_CONTEXT] = runSetContextEffect, _effectRunnerMap);\n\n/**\n Used to track a parent task and its forks\n In the fork model, forked tasks are attached by default to their parent\n We model this using the concept of Parent task && main Task\n main task is the main flow of the current Generator, the parent tasks is the\n aggregation of the main tasks + all its forked tasks.\n Thus the whole model represents an execution tree with multiple branches (vs the\n linear execution tree in sequential (non parallel) programming)\n\n A parent tasks has the following semantics\n - It completes if all its forks either complete or all cancelled\n - If it's cancelled, all forks are cancelled as well\n - It aborts if any uncaught error bubbles up from forks\n - If it completes, the return value is the one returned by the main task\n **/\n\nfunction forkQueue(mainTask, onAbort, cont) {\n var tasks = [];\n var result;\n var completed = false;\n addTask(mainTask);\n\n var getTasks = function getTasks() {\n return tasks;\n };\n\n function abort(err) {\n onAbort();\n cancelAll();\n cont(err, true);\n }\n\n function addTask(task) {\n tasks.push(task);\n\n task.cont = function (res, isErr) {\n if (completed) {\n return;\n }\n\n remove(tasks, task);\n task.cont = noop;\n\n if (isErr) {\n abort(res);\n } else {\n if (task === mainTask) {\n result = res;\n }\n\n if (!tasks.length) {\n completed = true;\n cont(result);\n }\n }\n };\n }\n\n function cancelAll() {\n if (completed) {\n return;\n }\n\n completed = true;\n tasks.forEach(function (t) {\n t.cont = noop;\n t.cancel();\n });\n tasks = [];\n }\n\n return {\n addTask: addTask,\n cancelAll: cancelAll,\n abort: abort,\n getTasks: getTasks\n };\n}\n\n// there can be only a single saga error created at any given moment\n\nfunction formatLocation(fileName, lineNumber) {\n return fileName + \"?\" + lineNumber;\n}\n\nfunction effectLocationAsString(effect) {\n var location = getLocation(effect);\n\n if (location) {\n var code = location.code,\n fileName = location.fileName,\n lineNumber = location.lineNumber;\n var source = code + \" \" + formatLocation(fileName, lineNumber);\n return source;\n }\n\n return '';\n}\n\nfunction sagaLocationAsString(sagaMeta) {\n var name = sagaMeta.name,\n location = sagaMeta.location;\n\n if (location) {\n return name + \" \" + formatLocation(location.fileName, location.lineNumber);\n }\n\n return name;\n}\n\nfunction cancelledTasksAsString(sagaStack) {\n var cancelledTasks = flatMap(function (i) {\n return i.cancelledTasks;\n }, sagaStack);\n\n if (!cancelledTasks.length) {\n return '';\n }\n\n return ['Tasks cancelled due to error:'].concat(cancelledTasks).join('\\n');\n}\n\nvar crashedEffect = null;\nvar sagaStack = [];\nvar addSagaFrame = function addSagaFrame(frame) {\n frame.crashedEffect = crashedEffect;\n sagaStack.push(frame);\n};\nvar clear = function clear() {\n crashedEffect = null;\n sagaStack.length = 0;\n}; // this sets crashed effect for the soon-to-be-reported saga frame\n// this slightly streatches the singleton nature of this module into wrong direction\n// as it's even less obvious what's the data flow here, but it is what it is for now\n\nvar setCrashedEffect = function setCrashedEffect(effect) {\n crashedEffect = effect;\n};\n/**\n @returns {string}\n\n @example\n The above error occurred in task errorInPutSaga {pathToFile}\n when executing effect put({type: 'REDUCER_ACTION_ERROR_IN_PUT'}) {pathToFile}\n created by fetchSaga {pathToFile}\n created by rootSaga {pathToFile}\n*/\n\nvar toString = function toString() {\n var firstSaga = sagaStack[0],\n otherSagas = sagaStack.slice(1);\n var crashedEffectLocation = firstSaga.crashedEffect ? effectLocationAsString(firstSaga.crashedEffect) : null;\n var errorMessage = \"The above error occurred in task \" + sagaLocationAsString(firstSaga.meta) + (crashedEffectLocation ? \" \\n when executing effect \" + crashedEffectLocation : '');\n return [errorMessage].concat(otherSagas.map(function (s) {\n return \" created by \" + sagaLocationAsString(s.meta);\n }), [cancelledTasksAsString(sagaStack)]).join('\\n');\n};\n\nfunction newTask(env, mainTask, parentContext, parentEffectId, meta, isRoot, cont) {\n var _task;\n\n if (cont === void 0) {\n cont = noop;\n }\n\n var status = RUNNING;\n var taskResult;\n var taskError;\n var deferredEnd = null;\n var cancelledDueToErrorTasks = [];\n var context = Object.create(parentContext);\n var queue = forkQueue(mainTask, function onAbort() {\n cancelledDueToErrorTasks.push.apply(cancelledDueToErrorTasks, queue.getTasks().map(function (t) {\n return t.meta.name;\n }));\n }, end);\n /**\n This may be called by a parent generator to trigger/propagate cancellation\n cancel all pending tasks (including the main task), then end the current task.\n Cancellation propagates down to the whole execution tree held by this Parent task\n It's also propagated to all joiners of this task and their execution tree/joiners\n Cancellation is noop for terminated/Cancelled tasks tasks\n **/\n\n function cancel() {\n if (status === RUNNING) {\n // Setting status to CANCELLED does not necessarily mean that the task/iterators are stopped\n // effects in the iterator's finally block will still be executed\n status = CANCELLED;\n queue.cancelAll(); // Ending with a TASK_CANCEL will propagate the Cancellation to all joiners\n\n end(TASK_CANCEL, false);\n }\n }\n\n function end(result, isErr) {\n if (!isErr) {\n // The status here may be RUNNING or CANCELLED\n // If the status is CANCELLED, then we do not need to change it here\n if (result === TASK_CANCEL) {\n status = CANCELLED;\n } else if (status !== CANCELLED) {\n status = DONE;\n }\n\n taskResult = result;\n deferredEnd && deferredEnd.resolve(result);\n } else {\n status = ABORTED;\n addSagaFrame({\n meta: meta,\n cancelledTasks: cancelledDueToErrorTasks\n });\n\n if (task.isRoot) {\n var sagaStack = toString(); // we've dumped the saga stack to string and are passing it to user's code\n // we know that it won't be needed anymore and we need to clear it\n\n clear();\n env.onError(result, {\n sagaStack: sagaStack\n });\n }\n\n taskError = result;\n deferredEnd && deferredEnd.reject(result);\n }\n\n task.cont(result, isErr);\n task.joiners.forEach(function (joiner) {\n joiner.cb(result, isErr);\n });\n task.joiners = null;\n }\n\n function setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning('task', props));\n }\n\n assignWithSymbols(context, props);\n }\n\n function toPromise() {\n if (deferredEnd) {\n return deferredEnd.promise;\n }\n\n deferredEnd = deferred();\n\n if (status === ABORTED) {\n deferredEnd.reject(taskError);\n } else if (status !== RUNNING) {\n deferredEnd.resolve(taskResult);\n }\n\n return deferredEnd.promise;\n }\n\n var task = (_task = {}, _task[TASK] = true, _task.id = parentEffectId, _task.meta = meta, _task.isRoot = isRoot, _task.context = context, _task.joiners = [], _task.queue = queue, _task.cancel = cancel, _task.cont = cont, _task.end = end, _task.setContext = setContext, _task.toPromise = toPromise, _task.isRunning = function isRunning() {\n return status === RUNNING;\n }, _task.isCancelled = function isCancelled() {\n return status === CANCELLED || status === RUNNING && mainTask.status === CANCELLED;\n }, _task.isAborted = function isAborted() {\n return status === ABORTED;\n }, _task.result = function result() {\n return taskResult;\n }, _task.error = function error() {\n return taskError;\n }, _task);\n return task;\n}\n\nfunction proc(env, iterator$1, parentContext, parentEffectId, meta, isRoot, cont) {\n if (process.env.NODE_ENV !== 'production' && iterator$1[asyncIteratorSymbol]) {\n throw new Error(\"redux-saga doesn't support async generators, please use only regular ones\");\n }\n\n var finalRunEffect = env.finalizeRunEffect(runEffect);\n /**\n Tracks the current effect cancellation\n Each time the generator progresses. calling runEffect will set a new value\n on it. It allows propagating cancellation to child effects\n **/\n\n next.cancel = noop;\n /** Creates a main task to track the main flow */\n\n var mainTask = {\n meta: meta,\n cancel: cancelMain,\n status: RUNNING\n };\n /**\n Creates a new task descriptor for this generator.\n A task is the aggregation of it's mainTask and all it's forked tasks.\n **/\n\n var task = newTask(env, mainTask, parentContext, parentEffectId, meta, isRoot, cont);\n var executingContext = {\n task: task,\n digestEffect: digestEffect\n };\n /**\n cancellation of the main task. We'll simply resume the Generator with a TASK_CANCEL\n **/\n\n function cancelMain() {\n if (mainTask.status === RUNNING) {\n mainTask.status = CANCELLED;\n next(TASK_CANCEL);\n }\n }\n /**\n attaches cancellation logic to this task's continuation\n this will permit cancellation to propagate down the call chain\n **/\n\n\n if (cont) {\n cont.cancel = task.cancel;\n } // kicks up the generator\n\n\n next(); // then return the task descriptor to the caller\n\n return task;\n /**\n * This is the generator driver\n * It's a recursive async/continuation function which calls itself\n * until the generator terminates or throws\n * @param {internal commands(TASK_CANCEL | TERMINATE) | any} arg - value, generator will be resumed with.\n * @param {boolean} isErr - the flag shows if effect finished with an error\n *\n * receives either (command | effect result, false) or (any thrown thing, true)\n */\n\n function next(arg, isErr) {\n try {\n var result;\n\n if (isErr) {\n result = iterator$1.throw(arg); // user handled the error, we can clear bookkept values\n\n clear();\n } else if (shouldCancel(arg)) {\n /**\n getting TASK_CANCEL automatically cancels the main task\n We can get this value here\n - By cancelling the parent task manually\n - By joining a Cancelled task\n **/\n mainTask.status = CANCELLED;\n /**\n Cancels the current effect; this will propagate the cancellation down to any called tasks\n **/\n\n next.cancel();\n /**\n If this Generator has a `return` method then invokes it\n This will jump to the finally block\n **/\n\n result = func(iterator$1.return) ? iterator$1.return(TASK_CANCEL) : {\n done: true,\n value: TASK_CANCEL\n };\n } else if (shouldTerminate(arg)) {\n // We get TERMINATE flag, i.e. by taking from a channel that ended using `take` (and not `takem` used to trap End of channels)\n result = func(iterator$1.return) ? iterator$1.return() : {\n done: true\n };\n } else {\n result = iterator$1.next(arg);\n }\n\n if (!result.done) {\n digestEffect(result.value, parentEffectId, next);\n } else {\n /**\n This Generator has ended, terminate the main task and notify the fork queue\n **/\n if (mainTask.status !== CANCELLED) {\n mainTask.status = DONE;\n }\n\n mainTask.cont(result.value);\n }\n } catch (error) {\n if (mainTask.status === CANCELLED) {\n throw error;\n }\n\n mainTask.status = ABORTED;\n mainTask.cont(error, true);\n }\n }\n\n function runEffect(effect, effectId, currCb) {\n /**\n each effect runner must attach its own logic of cancellation to the provided callback\n it allows this generator to propagate cancellation downward.\n ATTENTION! effect runners must setup the cancel logic by setting cb.cancel = [cancelMethod]\n And the setup must occur before calling the callback\n This is a sort of inversion of control: called async functions are responsible\n of completing the flow by calling the provided continuation; while caller functions\n are responsible for aborting the current flow by calling the attached cancel function\n Library users can attach their own cancellation logic to promises by defining a\n promise[CANCEL] method in their returned promises\n ATTENTION! calling cancel must have no effect on an already completed or cancelled effect\n **/\n if (promise(effect)) {\n resolvePromise(effect, currCb);\n } else if (iterator(effect)) {\n // resolve iterator\n proc(env, effect, task.context, effectId, meta,\n /* isRoot */\n false, currCb);\n } else if (effect && effect[IO]) {\n var effectRunner = effectRunnerMap[effect.type];\n effectRunner(env, effect.payload, currCb, executingContext);\n } else {\n // anything else returned as is\n currCb(effect);\n }\n }\n\n function digestEffect(effect, parentEffectId, cb, label) {\n if (label === void 0) {\n label = '';\n }\n\n var effectId = nextSagaId();\n env.sagaMonitor && env.sagaMonitor.effectTriggered({\n effectId: effectId,\n parentEffectId: parentEffectId,\n label: label,\n effect: effect\n });\n /**\n completion callback and cancel callback are mutually exclusive\n We can't cancel an already completed effect\n And We can't complete an already cancelled effectId\n **/\n\n var effectSettled; // Completion callback passed to the appropriate effect runner\n\n function currCb(res, isErr) {\n if (effectSettled) {\n return;\n }\n\n effectSettled = true;\n cb.cancel = noop; // defensive measure\n\n if (env.sagaMonitor) {\n if (isErr) {\n env.sagaMonitor.effectRejected(effectId, res);\n } else {\n env.sagaMonitor.effectResolved(effectId, res);\n }\n }\n\n if (isErr) {\n setCrashedEffect(effect);\n }\n\n cb(res, isErr);\n } // tracks down the current cancel\n\n\n currCb.cancel = noop; // setup cancellation logic on the parent cb\n\n cb.cancel = function () {\n // prevents cancelling an already completed effect\n if (effectSettled) {\n return;\n }\n\n effectSettled = true;\n currCb.cancel(); // propagates cancel downward\n\n currCb.cancel = noop; // defensive measure\n\n env.sagaMonitor && env.sagaMonitor.effectCancelled(effectId);\n };\n\n finalRunEffect(effect, effectId, currCb);\n }\n}\n\nvar RUN_SAGA_SIGNATURE = 'runSaga(options, saga, ...args)';\nvar NON_GENERATOR_ERR = RUN_SAGA_SIGNATURE + \": saga argument must be a Generator function!\";\nfunction runSaga(_ref, saga) {\n var _ref$channel = _ref.channel,\n channel = _ref$channel === void 0 ? stdChannel() : _ref$channel,\n dispatch = _ref.dispatch,\n getState = _ref.getState,\n _ref$context = _ref.context,\n context = _ref$context === void 0 ? {} : _ref$context,\n sagaMonitor = _ref.sagaMonitor,\n effectMiddlewares = _ref.effectMiddlewares,\n _ref$onError = _ref.onError,\n onError = _ref$onError === void 0 ? logError : _ref$onError;\n\n if (process.env.NODE_ENV !== 'production') {\n check(saga, func, NON_GENERATOR_ERR);\n }\n\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n var iterator$1 = saga.apply(void 0, args);\n\n if (process.env.NODE_ENV !== 'production') {\n check(iterator$1, iterator, NON_GENERATOR_ERR);\n }\n\n var effectId = nextSagaId();\n\n if (sagaMonitor) {\n // monitors are expected to have a certain interface, let's fill-in any missing ones\n sagaMonitor.rootSagaStarted = sagaMonitor.rootSagaStarted || noop;\n sagaMonitor.effectTriggered = sagaMonitor.effectTriggered || noop;\n sagaMonitor.effectResolved = sagaMonitor.effectResolved || noop;\n sagaMonitor.effectRejected = sagaMonitor.effectRejected || noop;\n sagaMonitor.effectCancelled = sagaMonitor.effectCancelled || noop;\n sagaMonitor.actionDispatched = sagaMonitor.actionDispatched || noop;\n sagaMonitor.rootSagaStarted({\n effectId: effectId,\n saga: saga,\n args: args\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (notUndef(dispatch)) {\n check(dispatch, func, 'dispatch must be a function');\n }\n\n if (notUndef(getState)) {\n check(getState, func, 'getState must be a function');\n }\n\n if (notUndef(effectMiddlewares)) {\n var MIDDLEWARE_TYPE_ERROR = 'effectMiddlewares must be an array of functions';\n check(effectMiddlewares, array$1, MIDDLEWARE_TYPE_ERROR);\n effectMiddlewares.forEach(function (effectMiddleware) {\n return check(effectMiddleware, func, MIDDLEWARE_TYPE_ERROR);\n });\n }\n\n check(onError, func, 'onError passed to the redux-saga is not a function!');\n }\n\n var finalizeRunEffect;\n\n if (effectMiddlewares) {\n var middleware = compose.apply(void 0, effectMiddlewares);\n\n finalizeRunEffect = function finalizeRunEffect(runEffect) {\n return function (effect, effectId, currCb) {\n var plainRunEffect = function plainRunEffect(eff) {\n return runEffect(eff, effectId, currCb);\n };\n\n return middleware(plainRunEffect)(effect);\n };\n };\n } else {\n finalizeRunEffect = identity;\n }\n\n var env = {\n channel: channel,\n dispatch: wrapSagaDispatch(dispatch),\n getState: getState,\n sagaMonitor: sagaMonitor,\n onError: onError,\n finalizeRunEffect: finalizeRunEffect\n };\n return immediately(function () {\n var task = proc(env, iterator$1, context, effectId, getMetaInfo(saga),\n /* isRoot */\n true, undefined);\n\n if (sagaMonitor) {\n sagaMonitor.effectResolved(effectId, task);\n }\n\n return task;\n });\n}\n\nfunction sagaMiddlewareFactory(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$context = _ref.context,\n context = _ref$context === void 0 ? {} : _ref$context,\n _ref$channel = _ref.channel,\n channel = _ref$channel === void 0 ? stdChannel() : _ref$channel,\n sagaMonitor = _ref.sagaMonitor,\n options = _objectWithoutPropertiesLoose(_ref, [\"context\", \"channel\", \"sagaMonitor\"]);\n\n var boundRunSaga;\n\n if (process.env.NODE_ENV !== 'production') {\n check(channel, channel$1, 'options.channel passed to the Saga middleware is not a channel');\n }\n\n function sagaMiddleware(_ref2) {\n var getState = _ref2.getState,\n dispatch = _ref2.dispatch;\n boundRunSaga = runSaga.bind(null, _extends({}, options, {\n context: context,\n channel: channel,\n dispatch: dispatch,\n getState: getState,\n sagaMonitor: sagaMonitor\n }));\n return function (next) {\n return function (action) {\n if (sagaMonitor && sagaMonitor.actionDispatched) {\n sagaMonitor.actionDispatched(action);\n }\n\n var result = next(action); // hit reducers\n\n channel.put(action);\n return result;\n };\n };\n }\n\n sagaMiddleware.run = function () {\n if (process.env.NODE_ENV !== 'production' && !boundRunSaga) {\n throw new Error('Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware');\n }\n\n return boundRunSaga.apply(void 0, arguments);\n };\n\n sagaMiddleware.setContext = function (props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning('sagaMiddleware', props));\n }\n\n assignWithSymbols(context, props);\n };\n\n return sagaMiddleware;\n}\n\nexport default sagaMiddlewareFactory;\nexport { END, channel, eventChannel, isEnd, multicastChannel, runSaga, stdChannel };\n","function deferred() {\n var def = {};\n def.promise = new Promise(function (resolve, reject) {\n def.resolve = resolve;\n def.reject = reject;\n });\n return def;\n}\nfunction arrayOfDeferred(length) {\n var arr = [];\n\n for (var i = 0; i < length; i++) {\n arr.push(deferred());\n }\n\n return arr;\n}\n\nexport default deferred;\nexport { arrayOfDeferred };\n","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nvar __export = (target, all2) => {\n for (var name in all2)\n __defProp(target, name, { get: all2[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, \"default\"), secondTarget && __copyProps(secondTarget, mod, \"default\"));\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/utils/constants.ts\nvar DEFAULT_HOST = \"wss://relay.signalwire.com\";\nvar EVENT_NAMESPACE_DIVIDER = \":\";\nvar LOCAL_EVENT_PREFIX = \"__local__\";\nvar SYNTHETIC_EVENT_PREFIX = \"__synthetic__\";\nvar PRODUCT_PREFIX_VIDEO = \"video\";\nvar PRODUCT_PREFIX_CHAT = \"chat\";\nvar PRODUCT_PREFIX_PUBSUB = \"chat\";\nvar GLOBAL_VIDEO_EVENTS = [\"room.started\", \"room.ended\"];\nvar INTERNAL_GLOBAL_VIDEO_EVENTS = GLOBAL_VIDEO_EVENTS.map((event) => `${PRODUCT_PREFIX_VIDEO}.${event}`);\n\n// src/utils/logger.ts\nimport log from \"loglevel\";\nvar datetime = () => new Date().toISOString();\nvar defaultLogger = log.getLogger(\"signalwire\");\nvar originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return function(...args) {\n args.unshift(datetime(), \"-\");\n rawMethod.apply(void 0, args);\n };\n};\nvar defaultLoggerLevel = process.env.NODE_ENV === \"development\" ? defaultLogger.levels.DEBUG : defaultLogger.getLevel();\ndefaultLogger.setLevel(defaultLoggerLevel);\nvar userLogger;\nvar setLogger = (logger) => {\n userLogger = logger;\n};\nvar debugOptions = {};\nvar setDebugOptions = (options) => {\n if (options == null) {\n debugOptions = {};\n return;\n }\n Object.assign(debugOptions, options);\n};\nvar getLoggerInstance = () => {\n return userLogger != null ? userLogger : defaultLogger;\n};\nvar shouldStringify = (payload) => {\n if (\"method\" in payload && payload.method === \"signalwire.ping\") {\n return false;\n }\n return true;\n};\nvar wsTraffic = ({ type, payload }) => {\n const logger = getLoggerInstance();\n const { logWsTraffic } = debugOptions || {};\n if (!logWsTraffic) {\n return void 0;\n }\n const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;\n return logger.info(`${type.toUpperCase()}: \n`, msg, \"\\n\");\n};\nvar getLogger = () => {\n const logger = getLoggerInstance();\n return new Proxy(logger, {\n get(target, prop, receiver) {\n if (prop === \"wsTraffic\") {\n return wsTraffic;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n};\n\n// src/utils/common.ts\nvar UPPERCASE_REGEX = /[A-Z]/g;\nvar fromCamelToSnakeCase = (event) => {\n return event.replace(UPPERCASE_REGEX, (letter) => {\n return `_${letter.toLowerCase()}`;\n });\n};\nvar WEBRTC_EVENT_TYPES = [\n \"webrtc.message\"\n];\nvar isWebrtcEventType = (eventType) => {\n return WEBRTC_EVENT_TYPES.includes(eventType);\n};\n\n// src/utils/index.ts\nimport { v4 } from \"uuid\";\n\n// src/utils/parseRPCResponse.ts\nvar parseRPCResponse = ({\n response,\n request\n}) => {\n const { result = {}, error } = response;\n if (error) {\n return {\n error\n };\n }\n switch (request.method) {\n case \"signalwire.connect\":\n return { result };\n default:\n return parseResponse(response);\n }\n};\nvar whitelistCodeRegex = /^2[0-9][0-9]$/;\nvar parseResponse = (response, nodeId) => {\n const { result = {}, error } = response;\n if (error) {\n return { error };\n }\n const { code, node_id, result: nestedResult = null } = result;\n if (code && !whitelistCodeRegex.test(code)) {\n return { error: result };\n }\n if (nestedResult === null) {\n if (nodeId) {\n result.node_id = nodeId;\n }\n return { result };\n }\n if (nestedResult) {\n if (nestedResult.jsonrpc) {\n return parseResponse(nestedResult, node_id);\n }\n return { result: nestedResult };\n }\n return { result };\n};\n\n// src/utils/toExternalJSON.ts\nvar toDateObject = (timestamp) => {\n if (typeof timestamp === \"undefined\") {\n return timestamp;\n }\n const date = new Date(timestamp * 1e3);\n if (isNaN(date.getTime())) {\n return timestamp;\n }\n return date;\n};\nvar DEFAULT_OPTIONS = {\n propsToUpdateValue: [\n \"updated\",\n \"layers\",\n \"members\",\n \"recordings\",\n \"playbacks\"\n ]\n};\nvar isTimestampProperty = (prop) => {\n return prop.endsWith(\"At\");\n};\nvar toExternalJSON = (input, options = DEFAULT_OPTIONS) => {\n if ((input == null ? void 0 : input.__sw_symbol) || (input == null ? void 0 : input.__sw_proxy)) {\n return input;\n }\n return Object.entries(input).reduce((reducer, [key, value]) => {\n const prop = fromSnakeToCamelCase(key);\n const propType = typeof value;\n if (propType === \"object\" && value) {\n if (Array.isArray(value)) {\n if (options.propsToUpdateValue.includes(key)) {\n reducer[prop] = value.map((v) => {\n if (typeof v === \"string\") {\n return fromSnakeToCamelCase(v);\n }\n return toExternalJSON(v);\n });\n } else {\n reducer[prop] = value;\n }\n } else {\n reducer[prop] = toExternalJSON(value);\n }\n } else {\n if (isTimestampProperty(prop)) {\n reducer[prop] = toDateObject(value);\n } else {\n reducer[prop] = value;\n }\n }\n return reducer;\n }, {});\n};\nvar fromSnakeToCamelCase = (input) => {\n if (!input.includes(\"_\")) {\n return input;\n }\n return input.split(\"_\").reduce((reducer, part, index) => {\n const fc = part.trim().charAt(0);\n const remainingChars = part.substr(1).toLowerCase();\n return `${reducer}${index === 0 ? fc.toLowerCase() : fc.toUpperCase()}${remainingChars}`;\n }, \"\");\n};\n\n// src/utils/toInternalEventName.ts\nvar toInternalEventName = ({\n event,\n namespace\n}) => {\n if (typeof event === \"string\") {\n event = getNamespacedEvent({\n event,\n namespace\n });\n event = fromCamelToSnakeCase(event);\n }\n return event;\n};\nvar getNamespacedEvent = ({\n namespace,\n event\n}) => {\n if (!namespace || event.startsWith(namespace)) {\n return event;\n }\n return `${namespace}${EVENT_NAMESPACE_DIVIDER}${event}`;\n};\n\n// src/utils/toInternalAction.ts\nvar toInternalAction = (event) => {\n const { event_type, params, node_id } = event;\n if (event_type === \"queuing.relay.tasks\") {\n return {\n type: event_type,\n payload: event\n };\n }\n if (isWebrtcEventType(event_type) && (params == null ? void 0 : params.jsonrpc)) {\n const vertoRPC = params;\n if (vertoRPC.params) {\n vertoRPC.params.nodeId = node_id;\n }\n return {\n type: event_type,\n payload: vertoRPC\n };\n }\n return {\n type: event_type,\n payload: params\n };\n};\n\n// src/utils/toSnakeCaseKeys.ts\nvar toSnakeCaseKeys = (obj, transform = (value) => value, result = {}) => {\n if (Array.isArray(obj)) {\n result = obj.map((item, index) => {\n if (typeof item === \"object\") {\n return toSnakeCaseKeys(item, transform, result[index]);\n }\n return item;\n });\n } else {\n Object.keys(obj).forEach((key) => {\n const newKey = fromCamelToSnakeCase(key);\n if (obj[key] && typeof obj[key] === \"object\") {\n result[newKey] = toSnakeCaseKeys(obj[key], transform, result[newKey]);\n } else {\n result[newKey] = transform(obj[key]);\n }\n });\n }\n return result;\n};\n\n// src/utils/extendComponent.ts\nvar extendComponent = (klass, methods) => {\n Object.keys(methods).forEach((methodName) => {\n if (klass.prototype.hasOwnProperty(methodName)) {\n throw new Error(`[extendComponent] Duplicated method name: ${methodName}`);\n }\n });\n Object.defineProperties(klass.prototype, methods);\n return klass;\n};\n\n// src/utils/debounce.ts\nfunction debounce(fn, wait2 = 0, callFirst) {\n let timeout = null;\n let debouncedFn = null;\n const clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n debouncedFn = null;\n timeout = null;\n }\n };\n const flush = function() {\n const call4 = debouncedFn;\n clear();\n if (call4) {\n call4();\n }\n };\n const debounceWrapper = function() {\n if (!wait2) {\n return fn.apply(this, arguments);\n }\n const context = this;\n const args = arguments;\n const callNow = callFirst && !timeout;\n clear();\n debouncedFn = function() {\n fn.apply(context, args);\n };\n timeout = setTimeout(function() {\n timeout = null;\n if (!callNow) {\n const call4 = debouncedFn;\n debouncedFn = null;\n return call4 == null ? void 0 : call4();\n }\n }, wait2);\n if (callNow && debouncedFn) {\n return debouncedFn();\n }\n };\n debounceWrapper.cancel = clear;\n debounceWrapper.flush = flush;\n return debounceWrapper;\n}\n\n// src/utils/SWCloseEvent.ts\nvar SWCloseEvent = class {\n constructor(type, options = {}) {\n this.type = type;\n __publicField(this, \"code\");\n __publicField(this, \"reason\");\n __publicField(this, \"wasClean\");\n this.code = options.code === void 0 ? 0 : options.code;\n this.reason = options.reason === void 0 ? \"\" : options.reason;\n this.wasClean = options.wasClean === void 0 ? false : options.wasClean;\n }\n};\n\n// src/utils/eventUtils.ts\nvar stripNamespacePrefix = (event, namespace) => {\n if (namespace && typeof namespace === \"string\") {\n const regex = new RegExp(`^${namespace}.`);\n return event.replace(regex, \"\");\n }\n const items = event.split(\".\");\n if (items.length > 1) {\n items.shift();\n return items.join(\".\");\n }\n return event;\n};\n\n// src/utils/index.ts\nvar safeParseJson = (value) => {\n if (typeof value !== \"string\") {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch (error) {\n return value;\n }\n};\nvar PROTOCOL_PATTERN = /^(ws|wss):\\/\\//;\nvar checkWebSocketHost = (host) => {\n const protocol = PROTOCOL_PATTERN.test(host) ? \"\" : \"wss://\";\n return `${protocol}${host}`;\n};\nvar timeoutPromise = (promise, time, exception) => {\n let timer = null;\n return Promise.race([\n promise,\n new Promise((_resolve, reject) => timer = setTimeout(reject, time, exception))\n ]).finally(() => clearTimeout(timer));\n};\nvar isGlobalEvent = (event) => {\n return GLOBAL_VIDEO_EVENTS.includes(event);\n};\nvar isSyntheticEvent = (event) => {\n return event.includes(SYNTHETIC_EVENT_PREFIX);\n};\nvar isSessionEvent = (event) => {\n return event.includes(\"session.\");\n};\nvar cleanupEventNamespace = (event) => {\n const eventParts = event.split(EVENT_NAMESPACE_DIVIDER);\n return eventParts[eventParts.length - 1];\n};\nvar WITH_CUSTOM_EVENT_NAMES = [\n \"video.member.updated\",\n \"video.member.talking\"\n];\nvar CLIENT_SIDE_EVENT_NAMES = [\n \"video.room.joined\",\n \"video.track\",\n \"video.active\",\n \"video.answering\",\n \"video.destroy\",\n \"video.early\",\n \"video.hangup\",\n \"video.held\",\n \"video.new\",\n \"video.purge\",\n \"video.recovering\",\n \"video.requesting\",\n \"video.ringing\",\n \"video.trying\",\n \"video.media.connected\",\n \"video.media.reconnecting\",\n \"video.media.disconnected\",\n \"video.microphone.updated\",\n \"video.camera.updated\",\n \"video.speaker.updated\",\n \"video.microphone.disconnected\",\n \"video.camera.disconnected\",\n \"video.speaker.disconnected\"\n];\nvar validateEventsToSubscribe = (events) => {\n const valid = events.map((internalEvent) => {\n if (typeof internalEvent === \"string\") {\n const event = cleanupEventNamespace(internalEvent);\n if (CLIENT_SIDE_EVENT_NAMES.includes(event) || isSyntheticEvent(event) || isLocalEvent(event) || isSessionEvent(event)) {\n return null;\n }\n const found = WITH_CUSTOM_EVENT_NAMES.find((withCustomName) => {\n return event.startsWith(withCustomName);\n });\n return found || event;\n }\n return internalEvent;\n });\n return Array.from(new Set(valid)).filter(Boolean);\n};\nvar isLocalEvent = (event) => {\n return event.includes(LOCAL_EVENT_PREFIX);\n};\nvar toLocalEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(LOCAL_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar toSyntheticEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(SYNTHETIC_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar isJSONRPCRequest = (e) => {\n return Boolean(e.method);\n};\nvar isJSONRPCResponse = (e) => {\n return !isJSONRPCRequest(e);\n};\nvar isSATAuth = (e) => {\n return typeof e !== \"undefined\" && \"jti\" in e;\n};\n\n// src/RPCMessages/helpers.ts\nvar makeRPCRequest = (params) => {\n var _a;\n return __spreadValues({\n jsonrpc: \"2.0\",\n id: (_a = params.id) != null ? _a : v4()\n }, params);\n};\nvar makeRPCResponse = (params) => {\n return __spreadValues({\n jsonrpc: \"2.0\"\n }, params);\n};\n\n// src/RPCMessages/RPCConnect.ts\nvar DEFAULT_CONNECT_VERSION = {\n major: 3,\n minor: 0,\n revision: 0\n};\nvar RPCConnect = (params) => {\n return makeRPCRequest({\n method: \"signalwire.connect\",\n params: __spreadValues({\n version: DEFAULT_CONNECT_VERSION\n }, params)\n });\n};\n\n// src/RPCMessages/RPCReauthenticate.ts\nvar RPCReauthenticate = (authentication) => {\n return makeRPCRequest({\n method: \"signalwire.reauthenticate\",\n params: {\n authentication\n }\n });\n};\n\n// src/RPCMessages/RPCPing.ts\nvar RPCPing = () => {\n return makeRPCRequest({\n method: \"signalwire.ping\",\n params: {\n timestamp: Date.now() / 1e3\n }\n });\n};\nvar RPCPingResponse = (id, timestamp) => {\n return makeRPCResponse({\n id,\n result: {\n timestamp: timestamp || Date.now() / 1e3\n }\n });\n};\n\n// src/RPCMessages/RPCExecute.ts\nvar RPCExecute = ({ method, params }) => {\n return makeRPCRequest({\n method,\n params\n });\n};\n\n// src/RPCMessages/RPCDisconnect.ts\nvar RPCDisconnectResponse = (id) => {\n return makeRPCResponse({\n id,\n result: {}\n });\n};\n\n// src/RPCMessages/VertoMessages.ts\nvar tmpMap = {\n id: \"callID\",\n destinationNumber: \"destination_number\",\n remoteCallerName: \"remote_caller_id_name\",\n remoteCallerNumber: \"remote_caller_id_number\",\n callerName: \"caller_id_name\",\n callerNumber: \"caller_id_number\"\n};\nvar filterVertoParams = (params) => {\n if (params.hasOwnProperty(\"dialogParams\")) {\n const _a = params.dialogParams, {\n remoteSdp,\n localStream,\n remoteStream\n } = _a, dialogParams = __objRest(_a, [\n \"remoteSdp\",\n \"localStream\",\n \"remoteStream\"\n ]);\n for (const key in tmpMap) {\n if (key && dialogParams.hasOwnProperty(key)) {\n dialogParams[tmpMap[key]] = dialogParams[key];\n delete dialogParams[key];\n }\n }\n params.dialogParams = dialogParams;\n }\n return params;\n};\nvar buildVertoRPCMessage = (method) => {\n return (params = {}) => {\n return makeRPCRequest({\n method,\n params: filterVertoParams(params)\n });\n };\n};\nvar VertoInvite = buildVertoRPCMessage(\"verto.invite\");\nvar VertoBye = buildVertoRPCMessage(\"verto.bye\");\nvar VertoAttach = buildVertoRPCMessage(\"verto.attach\");\nvar VertoModify = buildVertoRPCMessage(\"verto.modify\");\nvar VertoInfo = buildVertoRPCMessage(\"verto.info\");\nvar VertoAnswer = buildVertoRPCMessage(\"verto.answer\");\nvar VertoSubscribe = buildVertoRPCMessage(\"verto.subscribe\");\nvar VertoPong = buildVertoRPCMessage(\"verto.pong\");\nvar VertoResult = (id, method) => {\n return makeRPCResponse({\n id,\n result: {\n method\n }\n });\n};\n\n// src/redux/actions.ts\nvar actions_exports = {};\n__export(actions_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n createAction: () => createAction,\n destroyAction: () => destroyAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\n\n// src/redux/toolkit/index.ts\nvar toolkit_exports = {};\n__export(toolkit_exports, {\n configureStore: () => configureStore,\n createAction: () => createAction\n});\n__reExport(toolkit_exports, redux_star);\nimport * as redux_star from \"redux\";\n\n// src/redux/toolkit/createAction.ts\nfunction createAction(type, prepareAction) {\n function actionCreator(...args) {\n if (prepareAction) {\n let prepared = prepareAction(...args);\n if (!prepared) {\n throw new Error(\"prepareAction did not return an object\");\n }\n return __spreadValues(__spreadValues({\n type,\n payload: prepared.payload\n }, \"meta\" in prepared && { meta: prepared.meta }), \"error\" in prepared && { error: prepared.error });\n }\n return { type, payload: args[0] };\n }\n actionCreator.toString = () => `${type}`;\n actionCreator.type = type;\n actionCreator.match = (action) => action.type === type;\n return actionCreator;\n}\n\n// src/redux/toolkit/configureStore.ts\nimport { createStore, compose as compose2, applyMiddleware, combineReducers } from \"redux\";\n\n// src/redux/toolkit/devtoolsExtension.ts\nimport { compose } from \"redux\";\nvar composeWithDevTools = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {\n if (arguments.length === 0)\n return void 0;\n if (typeof arguments[0] === \"object\")\n return compose;\n return compose.apply(null, arguments);\n};\nvar devToolsEnhancer = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() {\n return function(noop) {\n return noop;\n };\n};\n\n// src/redux/toolkit/isPlainObject.ts\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null)\n return false;\n let proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n let baseProto = proto;\n while (Object.getPrototypeOf(baseProto) !== null) {\n baseProto = Object.getPrototypeOf(baseProto);\n }\n return proto === baseProto;\n}\n\n// src/redux/toolkit/getDefaultMiddleware.ts\nfunction curryGetDefaultMiddleware() {\n return function curriedGetDefaultMiddleware() {\n return [];\n };\n}\n\n// src/redux/toolkit/configureStore.ts\nvar IS_PRODUCTION = process.env.NODE_ENV === \"production\";\nfunction configureStore(options) {\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware();\n const {\n reducer = void 0,\n middleware = curriedGetDefaultMiddleware(),\n devTools = true,\n preloadedState = void 0,\n enhancers = void 0\n } = options || {};\n let rootReducer2;\n if (typeof reducer === \"function\") {\n rootReducer2 = reducer;\n } else if (isPlainObject(reducer)) {\n rootReducer2 = combineReducers(reducer);\n } else {\n throw new Error('\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');\n }\n let finalMiddleware = middleware;\n if (typeof finalMiddleware === \"function\") {\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware);\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\n throw new Error(\"when using a middleware builder function, an array of middleware must be returned\");\n }\n }\n if (!IS_PRODUCTION && finalMiddleware.some((item) => typeof item !== \"function\")) {\n throw new Error(\"each middleware provided to configureStore must be a function\");\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n let finalCompose = compose2;\n if (devTools) {\n finalCompose = composeWithDevTools(__spreadValues({\n trace: !IS_PRODUCTION\n }, typeof devTools === \"object\" && devTools));\n }\n let storeEnhancers = [middlewareEnhancer];\n if (Array.isArray(enhancers)) {\n storeEnhancers = [middlewareEnhancer, ...enhancers];\n } else if (typeof enhancers === \"function\") {\n storeEnhancers = enhancers(storeEnhancers);\n }\n const composedEnhancer = finalCompose(...storeEnhancers);\n return createStore(rootReducer2, preloadedState, composedEnhancer);\n}\n\n// src/redux/actions.ts\nvar initAction = createAction(\"swSdk/init\");\nvar destroyAction = createAction(\"swSdk/destroy\");\nvar reauthAction = createAction(\"swSdk/reauth\");\nvar authErrorAction = createAction(\"auth/error\");\nvar authSuccessAction = createAction(\"auth/success\");\nvar authExpiringAction = createAction(\"auth/expiring\");\nvar socketMessageAction = createAction(\"socket/message\");\nvar sessionDisconnectedAction = createAction(\"session.disconnected\");\nvar sessionReconnectingAction = createAction(\"session.reconnecting\");\nvar sessionForceCloseAction = createAction(\"session.forceClose\");\nvar formatCustomSagaAction = (id, action) => {\n return `${action.type}/${id}`;\n};\nvar makeCustomSagaAction = (id, action) => {\n return __spreadProps(__spreadValues({}, action), {\n type: formatCustomSagaAction(id, action)\n });\n};\nvar getCustomSagaActionType = (id, action) => {\n return formatCustomSagaAction(id, action);\n};\n\n// src/redux/toolkit/mapBuilders.ts\nfunction executeReducerBuilderCallback(builderCallback) {\n const actionsMap = {};\n const actionMatchers = [];\n let defaultCaseReducer;\n const builder = {\n addCase(typeOrActionCreator, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (actionMatchers.length > 0) {\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addMatcher`\");\n }\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n const type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\n if (type in actionsMap) {\n throw new Error(\"addCase cannot be called with two reducers for the same action type\");\n }\n actionsMap[type] = reducer;\n return builder;\n },\n addMatcher(matcher, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n actionMatchers.push({ matcher, reducer });\n return builder;\n },\n addDefaultCase(reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addDefaultCase` can only be called once\");\n }\n }\n defaultCaseReducer = reducer;\n return builder;\n }\n };\n builderCallback(builder);\n return [actionsMap, actionMatchers, defaultCaseReducer];\n}\n\n// src/redux/toolkit/createReducer.ts\nfunction isStateFunction(x) {\n return typeof x === \"function\";\n}\nfunction createReducer(initialState, mapOrBuilderCallback, actionMatchers = [], defaultCaseReducer) {\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = typeof mapOrBuilderCallback === \"function\" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer];\n let getInitialState;\n if (isStateFunction(initialState)) {\n getInitialState = () => initialState();\n } else {\n getInitialState = () => initialState;\n }\n function reducer(state = getInitialState(), action) {\n let caseReducers = [\n actionsMap[action.type],\n ...finalActionMatchers.filter(({ matcher }) => matcher(action)).map(({ reducer: reducer2 }) => reducer2)\n ];\n if (caseReducers.filter((cr) => !!cr).length === 0) {\n caseReducers = [finalDefaultCaseReducer];\n }\n return caseReducers.reduce((previousState, caseReducer) => {\n if (caseReducer) {\n return caseReducer(previousState, action);\n }\n return previousState;\n }, state);\n }\n reducer.getInitialState = getInitialState;\n return reducer;\n}\n\n// src/redux/toolkit/createSlice.ts\nfunction getType(slice, actionKey) {\n return `${slice}/${actionKey}`;\n}\nfunction createSlice(options) {\n const { name } = options;\n if (!name) {\n throw new Error(\"`name` is a required option for createSlice\");\n }\n const initialState = options.initialState;\n const reducers = options.reducers || {};\n const reducerNames = Object.keys(reducers);\n const sliceCaseReducersByName = {};\n const sliceCaseReducersByType = {};\n const actionCreators = {};\n reducerNames.forEach((reducerName) => {\n const maybeReducerWithPrepare = reducers[reducerName];\n const type = getType(name, reducerName);\n let caseReducer;\n let prepareCallback;\n if (\"reducer\" in maybeReducerWithPrepare) {\n caseReducer = maybeReducerWithPrepare.reducer;\n prepareCallback = maybeReducerWithPrepare.prepare;\n } else {\n caseReducer = maybeReducerWithPrepare;\n }\n sliceCaseReducersByName[reducerName] = caseReducer;\n sliceCaseReducersByType[type] = caseReducer;\n actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type);\n });\n function buildReducer() {\n const [\n extraReducers = {},\n actionMatchers = [],\n defaultCaseReducer = void 0\n ] = typeof options.extraReducers === \"function\" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers];\n const finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType);\n return createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer);\n }\n let _reducer;\n return {\n name,\n reducer(state, action) {\n if (!_reducer)\n _reducer = buildReducer();\n return _reducer(state, action);\n },\n actions: actionCreators,\n caseReducers: sliceCaseReducersByName,\n getInitialState() {\n if (!_reducer)\n _reducer = buildReducer();\n return _reducer.getInitialState();\n }\n };\n}\n\n// src/redux/utils/createDestroyableSlice.ts\nvar createDestroyableSlice = ({\n name = \"\",\n initialState,\n reducers,\n extraReducers\n}) => {\n return createSlice({\n name,\n initialState,\n reducers,\n extraReducers: (builder) => {\n builder.addCase(destroyAction.type, () => {\n return initialState;\n });\n if (typeof extraReducers === \"function\") {\n extraReducers(builder);\n }\n }\n });\n};\n\n// src/redux/features/session/sessionSlice.ts\nvar initialSessionState = {\n protocol: \"\",\n iceServers: [],\n authStatus: \"unknown\",\n authState: void 0,\n authError: void 0,\n authCount: 0\n};\nfunction authorizingAction(action) {\n return [initAction.type, reauthAction.type].includes(action.type);\n}\nvar sessionSlice = createDestroyableSlice({\n name: \"session\",\n initialState: initialSessionState,\n reducers: {\n connected: (state, { payload }) => {\n var _a, _b;\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorized\",\n authState: payload == null ? void 0 : payload.authorization,\n authCount: state.authCount + 1,\n protocol: (_a = payload == null ? void 0 : payload.protocol) != null ? _a : \"\",\n iceServers: (_b = payload == null ? void 0 : payload.ice_servers) != null ? _b : []\n });\n },\n authStatus: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: payload\n });\n },\n updateAuthState: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authState: payload\n });\n }\n },\n extraReducers: (builder) => {\n builder.addCase(authErrorAction.type, (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"unauthorized\",\n authError: payload.error\n });\n });\n builder.addMatcher(authorizingAction, (state) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorizing\"\n });\n });\n }\n});\nvar {\n actions: sessionActions,\n reducer: sessionReducer\n} = sessionSlice;\n\n// src/BaseSession.ts\nvar SW_SYMBOL = Symbol(\"BaseSession\");\nvar randomInt = (min, max) => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\nvar reconnectDelay = () => {\n return randomInt(1, 4) * 1e3;\n};\nvar BaseSession = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"__sw_symbol\", SW_SYMBOL);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"WebSocketConstructor\");\n __publicField(this, \"CloseEventConstructor\");\n __publicField(this, \"agent\");\n __publicField(this, \"connectVersion\", DEFAULT_CONNECT_VERSION);\n __publicField(this, \"_rpcConnectResult\");\n __publicField(this, \"_requests\", /* @__PURE__ */ new Map());\n __publicField(this, \"_socket\", null);\n __publicField(this, \"_host\", DEFAULT_HOST);\n __publicField(this, \"_executeTimeoutMs\", 10 * 1e3);\n __publicField(this, \"_executeTimeoutError\", Symbol.for(\"sw-execute-timeout\"));\n __publicField(this, \"_executeQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_swConnectError\", Symbol.for(\"sw-connect-error\"));\n __publicField(this, \"_executeConnectionClosed\", Symbol.for(\"sw-execute-connection-closed\"));\n __publicField(this, \"_checkPingDelay\", 15 * 1e3);\n __publicField(this, \"_checkPingTimer\", null);\n __publicField(this, \"_reconnectTimer\");\n __publicField(this, \"_status\", \"unknown\");\n __publicField(this, \"_sessionChannel\");\n __publicField(this, \"wsOpenHandler\");\n __publicField(this, \"wsCloseHandler\");\n __publicField(this, \"wsErrorHandler\");\n var _a, _b;\n const { host, logLevel = \"info\", sessionChannel } = options;\n if (host) {\n this._host = checkWebSocketHost(host);\n }\n if (sessionChannel) {\n this._sessionChannel = sessionChannel;\n }\n if (logLevel) {\n (_b = (_a = this.logger).setLevel) == null ? void 0 : _b.call(_a, logLevel);\n }\n this._onSocketOpen = this._onSocketOpen.bind(this);\n this._onSocketError = this._onSocketError.bind(this);\n this._onSocketClose = this._onSocketClose.bind(this);\n this._onSocketMessage = this._onSocketMessage.bind(this);\n this.execute = this.execute.bind(this);\n this.connect = this.connect.bind(this);\n this.wsOpenHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"open\", this.wsOpenHandler);\n this._onSocketOpen(event);\n };\n this.wsCloseHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"close\", this.wsCloseHandler);\n this._onSocketClose(event);\n };\n this.wsErrorHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"error\", this.wsErrorHandler);\n this._onSocketError(event);\n };\n }\n get host() {\n return this._host;\n }\n get rpcConnectResult() {\n return this._rpcConnectResult;\n }\n get relayProtocol() {\n var _a, _b;\n return (_b = (_a = this._rpcConnectResult) == null ? void 0 : _a.protocol) != null ? _b : \"\";\n }\n get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult;\n return isSATAuth(authorization) ? authorization.jti : authorization.signature;\n }\n return void 0;\n }\n get logger() {\n return getLogger();\n }\n get connecting() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 0 /* CONNECTING */;\n }\n get connected() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 1 /* OPEN */;\n }\n get closing() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 2 /* CLOSING */;\n }\n get closed() {\n return this._socket ? this._socket.readyState === 3 /* CLOSED */ : true;\n }\n get status() {\n return this._status;\n }\n get idle() {\n return this._status === \"idle\";\n }\n get ready() {\n return !Boolean(this.idle || !this.connected);\n }\n set token(token) {\n this.options.token = token;\n }\n connect() {\n if (!(this == null ? void 0 : this.WebSocketConstructor)) {\n throw new Error(\"Missing WebSocketConstructor\");\n }\n if (!(this == null ? void 0 : this.CloseEventConstructor)) {\n throw new Error(\"Missing CloseEventConstructor\");\n }\n this._clearTimers();\n if (this.connecting || this.connected) {\n this.logger.warn(\"Session already connected.\");\n return;\n }\n this._removeSocketListeners();\n this.destroySocket();\n this._clearCheckPingTimer();\n this._socket = this._createSocket();\n this._addSocketListeners();\n }\n _createSocket() {\n return new this.WebSocketConstructor(this._host);\n }\n destroySocket() {\n if (this._socket) {\n this._socket.close();\n this._socket = null;\n }\n }\n _addSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to add listeners\");\n }\n this._removeSocketListeners();\n this._socket.addEventListener(\"open\", this.wsOpenHandler);\n this._socket.addEventListener(\"close\", this.wsCloseHandler);\n this._socket.addEventListener(\"error\", this.wsErrorHandler);\n this._socket.addEventListener(\"message\", this._onSocketMessage);\n }\n _removeSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to remove listeners\");\n }\n this._socket.removeEventListener(\"open\", this.wsOpenHandler);\n this._socket.removeEventListener(\"close\", this.wsCloseHandler);\n this._socket.removeEventListener(\"error\", this.wsErrorHandler);\n this._socket.removeEventListener(\"message\", this._onSocketMessage);\n }\n async disconnect() {\n if (!this._socket || this.closing) {\n this.logger.debug(\"Session not connected or already in closing state.\");\n return;\n }\n this._status = \"disconnecting\";\n this._checkCurrentStatus();\n }\n execute(msg) {\n if (this._status === \"disconnecting\") {\n this.logger.warn(\"Reject request because the session is disconnecting\", msg);\n return Promise.reject({\n code: \"400\",\n message: \"The SDK session is disconnecting\"\n });\n }\n let promise = Promise.resolve();\n if (\"params\" in msg) {\n promise = new Promise((resolve, reject) => {\n this._requests.set(msg.id, { rpcRequest: msg, resolve, reject });\n });\n }\n if (!this.ready) {\n this._addToExecuteQueue(msg);\n this.connect();\n return promise;\n }\n this._send(msg);\n return timeoutPromise(promise, this._executeTimeoutMs, this._executeTimeoutError).catch((error) => {\n if (error === this._executeConnectionClosed) {\n throw this._executeConnectionClosed;\n } else if (error === this._executeTimeoutError) {\n if (\"method\" in msg && msg.method === \"signalwire.connect\") {\n throw this._swConnectError;\n }\n this._checkCurrentStatus();\n this.logger.error(\"Request Timeout\", msg);\n if (this.status === \"disconnected\") {\n return this.logger.debug(\"Request failed because the session is disconnected\", this.status, this._socket);\n }\n this._closeConnection(\"reconnecting\");\n } else {\n throw error;\n }\n });\n }\n async authenticate() {\n var _a, _b;\n const params = {\n agent: this.agent,\n version: this.connectVersion,\n authentication: {\n project: this.options.project,\n token: this.options.token\n }\n };\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n }\n if ((_a = this.options.topics) == null ? void 0 : _a.length) {\n params.contexts = this.options.topics;\n } else if ((_b = this.options.contexts) == null ? void 0 : _b.length) {\n params.contexts = this.options.contexts;\n }\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n }\n authError(error) {\n this._removeSocketListeners();\n this.dispatch(authErrorAction({ error }));\n }\n forceClose() {\n this._removeSocketListeners();\n return this._closeConnection(\"reconnecting\");\n }\n async _onSocketOpen(event) {\n this.logger.debug(\"_onSocketOpen\", event.type);\n try {\n this._status = \"unknown\";\n this._clearTimers();\n await this.authenticate();\n this._status = \"connected\";\n this._flushExecuteQueue();\n this.dispatch(authSuccessAction());\n } catch (error) {\n if (error === this._swConnectError || error === this._executeConnectionClosed) {\n this.logger.debug(\"Invalid connect or connection closed. Waiting for retry.\");\n return;\n }\n this.logger.error(\"Auth Error\", error);\n this.authError(error);\n }\n }\n _onSocketError(event) {\n this.logger.debug(\"_onSocketError\", event);\n }\n _onSocketClose(event) {\n this.logger.debug(\"_onSocketClose\", event.type, event.code, event.reason);\n if (this._status !== \"disconnected\") {\n this._status = \"reconnecting\";\n this.dispatch(sessionReconnectingAction());\n this._clearTimers();\n this._clearPendingRequests();\n this._reconnectTimer = setTimeout(() => {\n this.connect();\n }, reconnectDelay());\n }\n this._socket = null;\n }\n _clearTimers() {\n clearTimeout(this._reconnectTimer);\n }\n _clearPendingRequests() {\n this.logger.debug(\"_clearPendingRequests\", this._requests.size);\n this._requests.forEach(({ reject }) => {\n reject(this._executeConnectionClosed);\n });\n }\n _onSocketMessage(event) {\n const payload = this.decode(event.data);\n this.logger.wsTraffic({ type: \"recv\", payload });\n if (isJSONRPCResponse(payload)) {\n const request = this._requests.get(payload.id);\n if (request) {\n const { rpcRequest, resolve, reject } = request;\n this._requests.delete(payload.id);\n const { result, error } = parseRPCResponse({\n response: payload,\n request: rpcRequest\n });\n this._checkCurrentStatus();\n return error ? reject(error) : resolve(result);\n }\n return this.logger.warn(\"Unknown request for\", payload);\n }\n switch (payload.method) {\n case \"signalwire.ping\":\n return this._pingHandler(payload);\n case \"signalwire.disconnect\": {\n this.execute(RPCDisconnectResponse(payload.id)).catch((error) => {\n this.logger.error(\"SwDisconnect Error\", error);\n }).finally(() => {\n this._status = \"idle\";\n });\n break;\n }\n default:\n this.dispatch(socketMessageAction(payload));\n }\n }\n dispatch(_payload) {\n if (!this._sessionChannel) {\n throw new Error(\"Session channel does not exist\");\n }\n this._sessionChannel.put(_payload);\n }\n _relayProtocolIsValid() {\n var _a;\n return this.signature && ((_a = this == null ? void 0 : this.relayProtocol) == null ? void 0 : _a.split(\"_\")[1]) === this.signature;\n }\n encode(input) {\n return JSON.stringify(input);\n }\n decode(input) {\n return safeParseJson(input);\n }\n async onSwAuthorizationState(state) {\n this.persistSwAuthorizationState(state);\n }\n async retrieveSwAuthorizationState() {\n return \"\";\n }\n async persistSwAuthorizationState(_) {\n }\n _send(msg) {\n this.logger.wsTraffic({ type: \"send\", payload: msg });\n this._socket.send(this.encode(msg));\n }\n _addToExecuteQueue(msg) {\n this.logger.warn(\"Request queued waiting for session to reconnect\", msg);\n this._executeQueue.add(msg);\n }\n _flushExecuteQueue() {\n if (!this._executeQueue.size) {\n return;\n }\n if (!this.ready) {\n this.logger.warn(`Session not ready to flush the queue.`);\n this._closeConnection(\"reconnecting\");\n return;\n }\n this.logger.debug(`${this._executeQueue.size} messages to flush`);\n this._executeQueue.forEach((msg) => {\n this._send(msg);\n this._executeQueue.delete(msg);\n });\n this._executeQueue.clear();\n }\n _clearCheckPingTimer() {\n clearTimeout(this._checkPingTimer);\n }\n async _pingHandler(payload) {\n var _a;\n this._clearCheckPingTimer();\n this._checkPingTimer = setTimeout(() => {\n this.logger.debug(\"Timeout waiting for ping\");\n this._closeConnection(\"reconnecting\");\n }, this._checkPingDelay);\n await this.execute(RPCPingResponse(payload.id, (_a = payload == null ? void 0 : payload.params) == null ? void 0 : _a.timestamp));\n }\n _checkCurrentStatus() {\n switch (this._status) {\n case \"disconnecting\":\n if (this._requests.size > 0) {\n return;\n }\n this._requests.clear();\n this._closeConnection(\"disconnected\");\n break;\n case \"disconnected\":\n this.dispatch(sessionDisconnectedAction());\n break;\n case \"reconnecting\":\n this.wsCloseHandler(new this.CloseEventConstructor(\"close\", {\n reason: \"Client-side closed\"\n }));\n break;\n }\n }\n _closeConnection(status) {\n this._clearCheckPingTimer();\n this.logger.debug(\"Close Connection:\", status);\n this._status = status;\n this.dispatch(sessionActions.authStatus(status === \"disconnected\" ? \"unauthorized\" : \"unknown\"));\n this._removeSocketListeners();\n this.destroySocket();\n this._checkCurrentStatus();\n }\n};\n\n// src/BaseJWTSession.ts\nvar BaseJWTSession = class extends BaseSession {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"_expiredDiffSeconds\", 0);\n __publicField(this, \"_refreshTokenNotificationDiff\", 120);\n __publicField(this, \"_checkTokenExpirationDelay\", 20 * 1e3);\n __publicField(this, \"_checkTokenExpirationTimer\", null);\n this._checkTokenExpiration = this._checkTokenExpiration.bind(this);\n this.reauthenticate = this.reauthenticate.bind(this);\n }\n get expiresAt() {\n var _a;\n if (!(this == null ? void 0 : this._rpcConnectResult)) {\n return 0;\n }\n const { authorization } = this._rpcConnectResult;\n const expiresAt = (_a = isSATAuth(authorization) ? authorization.fabric_subscriber.expires_at : authorization == null ? void 0 : authorization.expires_at) != null ? _a : 0;\n if (typeof expiresAt === \"string\") {\n const parsed = Date.parse(expiresAt);\n if (!isNaN(parsed)) {\n return Math.floor(parsed / 1e3);\n }\n }\n return expiresAt;\n }\n get expiresIn() {\n const now = Math.floor(Date.now() / 1e3);\n return this.expiresAt - now;\n }\n get expired() {\n return this.expiresAt > 0 && this.expiresIn <= this._expiredDiffSeconds;\n }\n async authenticate() {\n const params = {\n agent: this.agent,\n version: this.connectVersion,\n authentication: {\n jwt_token: this.options.token\n }\n };\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n } else {\n const prevProtocol = await this.retrieveRelayProtocol();\n if (prevProtocol) {\n params.protocol = prevProtocol;\n }\n }\n if (params.protocol) {\n const authorizationState = await this.retrieveSwAuthorizationState();\n if (authorizationState) {\n params.authorization_state = authorizationState;\n }\n }\n try {\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n await this.persistRelayProtocol();\n await this._checkTokenExpiration();\n } catch (error) {\n this.logger.debug(\"BaseJWTSession authenticate error\", error);\n throw error;\n }\n }\n async retrieveRelayProtocol() {\n return \"\";\n }\n async persistRelayProtocol() {\n }\n async reauthenticate() {\n this.logger.debug(\"Session Reauthenticate\", {\n ready: this.ready,\n expired: this.expired\n });\n if (!this.ready || this.expired) {\n return this.connect();\n }\n const params = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token\n };\n try {\n this._rpcConnectResult = await this.execute(RPCReauthenticate(params));\n } catch (error) {\n clearTimeout(this._checkTokenExpirationTimer);\n throw error;\n }\n }\n _onSocketClose(event) {\n clearTimeout(this._checkTokenExpirationTimer);\n super._onSocketClose(event);\n }\n async _checkTokenExpiration() {\n if (!this.expiresAt) {\n return;\n }\n const refreshTokenFn = this.options._onRefreshToken || this.options.onRefreshToken;\n if (this.expiresIn <= this._refreshTokenNotificationDiff) {\n this.dispatch(authExpiringAction());\n if (typeof refreshTokenFn === \"function\") {\n try {\n await refreshTokenFn();\n } catch (error) {\n this.logger.error(error);\n }\n } else {\n this.logger.warn(\"The token is going to expire!\");\n }\n }\n clearTimeout(this._checkTokenExpirationTimer);\n if (!this.expired) {\n this._checkTokenExpirationTimer = setTimeout(this._checkTokenExpiration, this._checkTokenExpirationDelay);\n }\n }\n};\n\n// src/redux/index.ts\nvar redux_exports = {};\n__export(redux_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n configureStore: () => configureStore2,\n connect: () => connect,\n createAction: () => createAction,\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n destroyAction: () => destroyAction,\n eventChannel: () => eventChannel,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\nimport createSagaMiddleware, {\n channel,\n multicastChannel\n} from \"@redux-saga/core\";\n\n// src/redux/features/component/componentSlice.ts\nvar initialComponentState = {\n byId: {}\n};\nvar componentSlice = createDestroyableSlice({\n name: \"components\",\n initialState: initialComponentState,\n reducers: {\n upsert: (state, { payload }) => {\n if (payload.id in state.byId) {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: __spreadValues(__spreadValues({}, state.byId[payload.id]), payload)\n })\n });\n } else {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: payload\n })\n });\n }\n },\n cleanup: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n byId: Object.entries(state.byId).reduce((reducer, [componentId, value]) => {\n if (!payload.ids.includes(componentId)) {\n reducer[componentId] = value;\n }\n return reducer;\n }, {})\n });\n }\n }\n});\nvar {\n actions: componentActions,\n reducer: componentReducer\n} = componentSlice;\n\n// src/redux/rootReducer.ts\nvar rootReducer = (0, toolkit_exports.combineReducers)({\n components: componentReducer,\n session: sessionReducer\n});\n\n// src/redux/rootSaga.ts\nimport { fork as fork2, call as call2, take as take2, put as put2, all, cancelled } from \"@redux-saga/core/effects\";\n\n// src/redux/features/session/sessionSaga.ts\nimport { put, take, fork } from \"@redux-saga/core/effects\";\n\n// src/redux/utils/sagaHelpers.ts\nvar sagaHelpers_exports = {};\n__export(sagaHelpers_exports, {\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n eventChannel: () => eventChannel\n});\nimport { call, spawn } from \"@redux-saga/core/effects\";\nimport { eventChannel } from \"@redux-saga/core\";\nvar createRestartableSaga = (saga) => {\n return function* () {\n spawn(function* () {\n while (true) {\n try {\n getLogger().debug(\"Run a restartable saga\");\n yield call(saga);\n getLogger().debug(\"One of the restartable saga has ended. Restarting..\");\n } catch (error) {\n getLogger().error(\"Restartable Saga Error\", error);\n }\n }\n });\n };\n};\nvar defaultCatchHandler = (error) => getLogger().error(\"Catchable Saga Error\", error);\nvar createCatchableSaga = (saga, errorHandler = defaultCatchHandler) => {\n return function* (...params) {\n try {\n yield call(saga, ...params);\n } catch (error) {\n errorHandler(error);\n }\n };\n};\n\n// src/redux/features/session/sessionSaga.ts\nvar isWebrtcEvent = (e) => {\n return isWebrtcEventType(e == null ? void 0 : e.event_type);\n};\nvar isVideoEvent = (e) => {\n var _a;\n return !!((_a = e == null ? void 0 : e.event_type) == null ? void 0 : _a.startsWith(\"video.\"));\n};\nvar isSwAuthorizationState = (e) => {\n return (e == null ? void 0 : e.event_type) === \"signalwire.authorization.state\";\n};\nfunction* sessionChannelWatcher({\n sessionChannel,\n swEventChannel,\n session\n}) {\n function* swEventWorker(broadcastParams) {\n yield put(swEventChannel, toInternalAction(broadcastParams));\n if (isWebrtcEvent(broadcastParams) || isVideoEvent(broadcastParams)) {\n return;\n }\n if (isSwAuthorizationState(broadcastParams)) {\n session.onSwAuthorizationState(broadcastParams.params.authorization_state);\n return;\n }\n yield put({ type: broadcastParams.event_type, payload: broadcastParams });\n }\n function* sessionChannelWorker(action) {\n if (action.type !== socketMessageAction.type) {\n yield put(action);\n return;\n }\n const { method, params } = action.payload;\n switch (method) {\n case \"signalwire.event\":\n yield fork(swEventWorker, params);\n break;\n default:\n return getLogger().debug(`Unknown message: ${method}`, action);\n }\n }\n const sessionChannelWorkerCatchable = createCatchableSaga(sessionChannelWorker, (error) => {\n getLogger().error(\"Channel Error\", error);\n });\n while (true) {\n try {\n while (true) {\n const action = yield take(sessionChannel);\n yield fork(sessionChannelWorkerCatchable, action);\n }\n } catch (error) {\n getLogger().error(\"sessionChannelWorker error:\", error);\n } finally {\n getLogger().debug(\"sessionChannelWorker finally\");\n }\n }\n}\n\n// src/CustomErrors.ts\nvar AuthError = class extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n this.message = message;\n __publicField(this, \"name\", \"AuthError\");\n Object.setPrototypeOf(this, AuthError.prototype);\n }\n};\nvar HttpError = class extends Error {\n constructor(code, message, response) {\n super(message);\n this.code = code;\n this.message = message;\n this.response = response;\n __publicField(this, \"name\", \"HttpError\");\n Object.setPrototypeOf(this, HttpError.prototype);\n }\n};\n\n// src/redux/rootSaga.ts\nfunction* initSessionSaga({\n initSession,\n sessionEmitter,\n userOptions,\n channels\n}) {\n var _a;\n const session = initSession();\n const swEventChannel = channels.swEventChannel;\n const sessionChannel = channels.sessionChannel;\n let customTasks = [];\n if ((_a = userOptions.workers) == null ? void 0 : _a.length) {\n try {\n const effects = userOptions.workers.map((saga) => {\n return call2(createRestartableSaga(saga));\n });\n customTasks = yield all(effects);\n } catch (error) {\n getLogger().error(\"Error running custom workers\", error);\n }\n }\n yield fork2(sessionChannelWatcher, {\n session,\n sessionChannel,\n swEventChannel\n });\n const sessionStatusTask = yield fork2(sessionStatusWatcher, {\n session,\n sessionEmitter,\n sessionChannel,\n userOptions\n });\n session.connect();\n yield take2(destroyAction.type);\n session.disconnect();\n yield take2(sessionDisconnectedAction.type);\n sessionEmitter.emit(\"session.disconnected\");\n sessionStatusTask.cancel();\n customTasks.forEach((task) => task.cancel());\n}\nfunction* reauthenticateWorker({\n session,\n token,\n sessionEmitter\n}) {\n try {\n if (session.reauthenticate) {\n session.token = token;\n yield call2(session.reauthenticate);\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n }\n } catch (error) {\n getLogger().error(\"Reauthenticate Error\", error);\n session.authError(error);\n }\n}\nfunction* sessionStatusWatcher(options) {\n getLogger().debug(\"sessionStatusWatcher [started]\");\n const { session, sessionEmitter } = options;\n try {\n while (true) {\n const action = yield take2([\n authSuccessAction.type,\n authErrorAction.type,\n authExpiringAction.type,\n reauthAction.type,\n sessionReconnectingAction.type,\n sessionForceCloseAction.type\n ]);\n getLogger().trace(\"sessionStatusWatcher\", action.type, action.payload);\n switch (action.type) {\n case authSuccessAction.type: {\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n break;\n }\n case authErrorAction.type: {\n yield fork2(sessionAuthErrorSaga, __spreadProps(__spreadValues({}, options), {\n action\n }));\n break;\n }\n case authExpiringAction.type: {\n sessionEmitter.emit(\"session.expiring\");\n break;\n }\n case reauthAction.type: {\n yield fork2(reauthenticateWorker, {\n session,\n token: action.payload.token,\n sessionEmitter\n });\n break;\n }\n case sessionReconnectingAction.type: {\n sessionEmitter.emit(\"session.reconnecting\");\n break;\n }\n case sessionForceCloseAction.type: {\n session.forceClose();\n break;\n }\n }\n }\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionStatusWatcher [cancelled]\");\n }\n }\n}\nfunction* sessionAuthErrorSaga(options) {\n getLogger().debug(\"sessionAuthErrorSaga [started]\");\n try {\n const { action, sessionEmitter } = options;\n const { error: authError } = action.payload;\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n sessionEmitter.emit(\"session.auth_error\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionAuthErrorSaga [cancelled]\");\n }\n }\n}\nvar rootSaga_default = (options) => {\n return function* root({\n userOptions,\n channels\n }) {\n var _a;\n if (userOptions.logger) {\n setLogger(userOptions.logger);\n }\n if (userOptions.debug) {\n setDebugOptions(userOptions.debug);\n }\n while (true) {\n const action = yield take2([initAction.type, reauthAction.type]);\n if ((_a = action == null ? void 0 : action.payload) == null ? void 0 : _a.token) {\n userOptions.token = action.payload.token;\n }\n try {\n yield call2(initSessionSaga, __spreadProps(__spreadValues({}, options), {\n userOptions,\n channels\n }));\n } catch (error) {\n getLogger().error(\"RootSaga Error:\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"rootSaga [cancelled]\");\n }\n getLogger().debug(\"Reboot rootSaga\");\n }\n }\n };\n};\n\n// src/redux/features/session/sessionSelectors.ts\nvar sessionSelectors_exports = {};\n__export(sessionSelectors_exports, {\n getAuthError: () => getAuthError,\n getAuthState: () => getAuthState,\n getAuthStatus: () => getAuthStatus,\n getIceServers: () => getIceServers,\n getSession: () => getSession\n});\nvar getIceServers = ({ session }) => {\n var _a;\n return (_a = session == null ? void 0 : session.iceServers) != null ? _a : [];\n};\nvar getSession = (store) => {\n return store.session;\n};\nvar getAuthStatus = ({ session }) => {\n return session.authStatus;\n};\nvar getAuthError = ({ session }) => {\n return session.authError;\n};\nvar getAuthState = ({ session }) => {\n return session.authState;\n};\n\n// src/redux/connect.ts\nvar connect = (options) => {\n const { sessionListeners = {}, store, Component, customSagas = [] } = options;\n const sessionKeys = Object.keys(sessionListeners);\n return (userOptions) => {\n const instance = new Component(__spreadProps(__spreadValues({}, userOptions), { store }));\n const cacheMap = /* @__PURE__ */ new Map();\n let run = true;\n const storeUnsubscribe = store.subscribe(() => {\n const state = store.getState();\n const session = getSession(state);\n for (const reduxKey of sessionKeys) {\n if (run === false) {\n return;\n }\n const cacheKey = `session.${reduxKey}`;\n const current = cacheMap.get(cacheKey);\n const updatedValue = session[reduxKey];\n if (updatedValue !== void 0 && current !== updatedValue) {\n cacheMap.set(cacheKey, updatedValue);\n const fnName = sessionListeners[reduxKey];\n if (typeof fnName === \"string\") {\n instance[fnName](session);\n } else if (typeof fnName === \"function\") {\n fnName(session);\n }\n }\n }\n });\n const taskList = customSagas == null ? void 0 : customSagas.map((saga) => {\n return store.runSaga(saga, { instance, runSaga: store.runSaga });\n });\n instance.destroyer = () => {\n run = false;\n storeUnsubscribe();\n cacheMap.clear();\n if (taskList == null ? void 0 : taskList.length) {\n taskList.forEach((task) => task.cancel());\n }\n };\n return instance;\n };\n};\n\n// src/utils/EventEmitter.ts\nimport EventEmitter from \"eventemitter3\";\nvar getEventEmitter = () => {\n return new EventEmitter();\n};\n\n// src/redux/utils/useSession.ts\nvar useSession = (options) => {\n const { SessionConstructor, userOptions, sessionChannel } = options;\n const sessionEmitter = getEventEmitter();\n let session = null;\n const initSession = () => {\n session = new SessionConstructor(__spreadProps(__spreadValues({}, userOptions), {\n sessionChannel\n }));\n return session;\n };\n const getSession2 = () => {\n if (!session) {\n getLogger().warn(\"Custom worker started without the session\");\n }\n return session;\n };\n return { session, initSession, getSession: getSession2, sessionEmitter };\n};\n\n// src/redux/utils/useInstanceMap.ts\nvar useInstanceMap = () => {\n const instanceMap = /* @__PURE__ */ new Map();\n const getInstance = (key) => {\n return instanceMap.get(key);\n };\n const setInstance = (key, value) => {\n instanceMap.set(key, value);\n return instanceMap;\n };\n const deleteInstance = (key) => {\n instanceMap.delete(key);\n return instanceMap;\n };\n return {\n get: getInstance,\n set: setInstance,\n remove: deleteInstance\n };\n};\n\n// src/redux/index.ts\n__reExport(redux_exports, toolkit_exports);\nvar configureStore2 = (options) => {\n var _a;\n const {\n userOptions,\n SessionConstructor,\n preloadedState = {},\n runSagaMiddleware = true\n } = options;\n const sagaMiddleware = createSagaMiddleware();\n const swEventChannel = multicastChannel();\n const sessionChannel = channel();\n const channels = {\n swEventChannel,\n sessionChannel\n };\n const store = configureStore({\n devTools: (_a = userOptions == null ? void 0 : userOptions.devTools) != null ? _a : true,\n reducer: rootReducer,\n preloadedState,\n middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(sagaMiddleware)\n });\n const { initSession, getSession: getSession2, sessionEmitter } = useSession({\n userOptions,\n sessionChannel,\n SessionConstructor\n });\n const map = useInstanceMap();\n const runSaga = (saga, args) => {\n return sagaMiddleware.run(saga, __spreadProps(__spreadValues({}, args), {\n channels,\n getSession: getSession2,\n instanceMap: map\n }));\n };\n if (runSagaMiddleware) {\n const saga = rootSaga_default({\n initSession,\n sessionEmitter\n });\n sagaMiddleware.run(saga, { userOptions, channels });\n }\n return __spreadProps(__spreadValues({}, store), {\n runSaga,\n channels,\n instanceMap: map,\n sessionEmitter\n });\n};\n\n// src/workers/executeActionWorker.ts\nimport { call as call3 } from \"@redux-saga/core/effects\";\nvar executeActionWorker = function* (options) {\n const { initialState, onDone, onFail, getSession: getSession2 } = options;\n const { requestId, method, params } = initialState;\n const session = getSession2();\n if (!session) {\n const error = new Error(\"Session does not exist!\");\n getLogger().error(error);\n onFail == null ? void 0 : onFail(error);\n return;\n }\n try {\n const message = RPCExecute({\n id: requestId,\n method,\n params\n });\n const response = yield call3(session.execute, message);\n onDone == null ? void 0 : onDone(response);\n } catch (error) {\n getLogger().warn(\"Execute error: \", error);\n onFail == null ? void 0 : onFail(error);\n }\n};\n\n// src/BaseComponent.ts\nvar identity = (payload) => payload;\nvar SW_SYMBOL2 = Symbol(\"BaseComponent\");\nvar BaseComponent = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"__sw_symbol\", SW_SYMBOL2);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"_customSagaTriggers\", /* @__PURE__ */ new Map());\n __publicField(this, \"_destroyer\");\n __publicField(this, \"eventEmitter\");\n __publicField(this, \"_runningWorkers\", []);\n __publicField(this, \"_workers\", /* @__PURE__ */ new Map());\n this.eventEmitter = new EventEmitter();\n }\n get __uuid() {\n return this.uuid;\n }\n get logger() {\n return getLogger();\n }\n set destroyer(d) {\n this._destroyer = d;\n }\n get store() {\n return this.options.store;\n }\n get instanceMap() {\n return this.options.store.instanceMap;\n }\n get emitter() {\n return this.eventEmitter;\n }\n get sessionEmitter() {\n return this.options.store.sessionEmitter;\n }\n get session() {\n return this.sessionEmitter;\n }\n on(event, fn) {\n return this.emitter.on(event, fn);\n }\n once(event, fn) {\n return this.emitter.once(event, fn);\n }\n off(event, fn) {\n return this.emitter.off(event, fn);\n }\n removeAllListeners(event) {\n if (event) {\n return this.off(event);\n }\n this.eventNames().forEach((eventName) => {\n this.off(eventName);\n });\n this.sessionEventNames().forEach((eventName) => {\n this.sessionEmitter.off(eventName);\n });\n return this.emitter;\n }\n eventNames() {\n return this.emitter.eventNames();\n }\n sessionEventNames() {\n return this.sessionEmitter.eventNames();\n }\n getSubscriptions() {\n return validateEventsToSubscribe(this.eventNames());\n }\n emit(event, ...args) {\n return this.emitter.emit(event, ...args);\n }\n listenerCount(event) {\n return this.emitter.listenerCount(event);\n }\n destroy() {\n var _a;\n (_a = this._destroyer) == null ? void 0 : _a.call(this);\n this.removeAllListeners();\n this.detachWorkers();\n }\n execute({ method, params }, {\n transformParams = identity,\n transformResolve = identity,\n transformReject = identity\n } = {\n transformParams: identity,\n transformResolve: identity,\n transformReject: identity\n }) {\n return new Promise((resolve, reject) => {\n const requestId = v4();\n this.runWorker(\"executeActionWorker\", {\n worker: executeActionWorker,\n onDone: (data) => resolve(transformResolve(data)),\n onFail: (error) => reject(transformReject(error)),\n initialState: {\n requestId,\n componentId: this.__uuid,\n method,\n params: transformParams(params)\n }\n });\n });\n }\n triggerCustomSaga(action) {\n return new Promise((resolve, reject) => {\n const dispatchId = v4();\n this._customSagaTriggers.set(dispatchId, { resolve, reject });\n this.store.dispatch(__spreadValues({\n dispatchId\n }, makeCustomSagaAction(this.__uuid, action)));\n });\n }\n settleCustomSagaTrigger({\n dispatchId,\n payload,\n kind\n }) {\n const actions = this._customSagaTriggers.get(dispatchId);\n if (actions) {\n actions[kind](payload);\n this._customSagaTriggers.delete(dispatchId);\n }\n }\n select(selectorFn) {\n return selectorFn(this.store.getState());\n }\n getStateProperty(param) {\n return this[param];\n }\n get _sessionAuthStatus() {\n return getAuthStatus(this.store.getState());\n }\n get _sessionAuthState() {\n return getAuthState(this.store.getState());\n }\n _waitUntilSessionAuthorized() {\n const authStatus = getAuthStatus(this.store.getState());\n switch (authStatus) {\n case \"authorized\":\n return Promise.resolve(this);\n case \"unknown\":\n case \"authorizing\":\n return new Promise((resolve, reject) => {\n const unsubscribe = this.store.subscribe(() => {\n const authStatus2 = getAuthStatus(this.store.getState());\n const authError = getAuthError(this.store.getState());\n if (authStatus2 === \"authorized\") {\n resolve(this);\n unsubscribe();\n } else if (authStatus2 === \"unauthorized\") {\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n reject(error);\n unsubscribe();\n }\n });\n });\n case \"unauthorized\":\n return Promise.reject(new Error(\"Unauthorized\"));\n }\n }\n runWorker(name, def) {\n if (this._workers.has(name)) {\n getLogger().warn(`[runWorker] Worker with name ${name} has already been registerd.`);\n } else {\n this._setWorker(name, def);\n }\n return this._attachWorker(name, def);\n }\n _setWorker(name, def) {\n this._workers.set(name, def);\n }\n _attachWorker(name, _a) {\n var _b = _a, { worker } = _b, params = __objRest(_b, [\"worker\"]);\n const task = this.store.runSaga(worker, __spreadValues({\n instance: this,\n runSaga: this.store.runSaga\n }, params));\n this._runningWorkers.push(task);\n this._workers.delete(name);\n return task;\n }\n detachWorkers() {\n this._runningWorkers.forEach((task) => {\n task.cancel();\n });\n this._runningWorkers = [];\n }\n};\n\n// src/BaseClient.ts\nvar BaseClient = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n }\n connect() {\n const authStatus = getAuthStatus(this.store.getState());\n if (authStatus === \"unknown\" || authStatus === \"unauthorized\") {\n this.store.dispatch(initAction());\n }\n return this._waitUntilSessionAuthorized();\n }\n disconnect() {\n this.store.dispatch(destroyAction());\n }\n};\n\n// src/BaseConsumer.ts\nvar BaseConsumer = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"subscribeMethod\", \"signalwire.subscribe\");\n __publicField(this, \"subscribeParams\", {});\n __publicField(this, \"_latestExecuteParams\");\n const resetLatestExecuteParams = () => {\n this._latestExecuteParams = void 0;\n };\n super.session.on(\"session.connected\", resetLatestExecuteParams);\n super.session.on(\"session.disconnected\", resetLatestExecuteParams);\n super.session.on(\"session.reconnecting\", resetLatestExecuteParams);\n }\n shouldExecuteSubscribe(execParams) {\n return !this._latestExecuteParams || JSON.stringify(execParams) !== JSON.stringify(this._latestExecuteParams);\n }\n async subscribe() {\n await this._waitUntilSessionAuthorized();\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.debug(\"`subscribe()` was called without any listeners attached.\");\n return;\n }\n const execParams = {\n method: this.subscribeMethod,\n params: __spreadProps(__spreadValues({}, this.subscribeParams), {\n event_channel: this.getStateProperty(\"eventChannel\"),\n events: subscriptions\n })\n };\n if (!this.shouldExecuteSubscribe(execParams)) {\n this.logger.debug(\"BaseConsumer.subscribe() - Skipped .execute() since the execParams are exactly the same as last time\");\n return;\n }\n this._latestExecuteParams = execParams;\n return new Promise(async (resolve, reject) => {\n try {\n await this.execute(execParams);\n return resolve(void 0);\n } catch (error) {\n return reject(error);\n }\n });\n }\n};\n\n// src/redux/features/shared/namespace.ts\nvar isVideoMemberEvent = (action) => {\n return action.type.startsWith(\"video.member.\") || action.type.startsWith(\"video.__synthetic__.member\");\n};\nvar isVideoRoomEvent = (action) => {\n return action.type.startsWith(\"video.room.\");\n};\nvar isVideoRoomAudienceCountEvent = (action) => {\n return action.type === \"video.room.audience_count\" || action.type === \"video.room.audienceCount\";\n};\nvar isVideoLayoutEvent = (action) => {\n return action.type.startsWith(\"video.layout.\");\n};\nvar isVideoRecordingEvent = (action) => {\n return action.type.startsWith(\"video.recording.\");\n};\nvar isVideoPlaybackEvent = (action) => {\n return action.type.startsWith(\"video.playback.\");\n};\nvar isVideoStreamEvent = (action) => {\n return action.type.startsWith(\"video.stream.\");\n};\nvar isChatEvent = (action) => {\n return action.type.startsWith(\"chat.\");\n};\nvar isVoiceCallEvent = (action) => {\n return action.type.startsWith(\"calling.\");\n};\nvar findNamespaceInPayload = (action) => {\n var _a;\n if (action.payload === void 0) {\n return \"\";\n } else if (isVideoMemberEvent(action) || isVideoLayoutEvent(action) || isVideoRecordingEvent(action) || isVideoPlaybackEvent(action) || isVideoStreamEvent(action) || isVideoRoomAudienceCountEvent(action)) {\n return action.payload.room_session_id;\n } else if (isVideoRoomEvent(action)) {\n return action.payload.room_session.id;\n } else if (isChatEvent(action)) {\n return \"\";\n } else if (isVoiceCallEvent(action)) {\n return (_a = action.payload.tag) != null ? _a : \"\";\n }\n if (process.env.NODE_ENV === \"development\") {\n getLogger().info(\"Namespace not found for action.type: \", action == null ? void 0 : action.type);\n }\n return \"\";\n};\n\n// src/types/videoMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS = {\n audio_muted: true,\n video_muted: true,\n deaf: true,\n visible: true,\n input_volume: 1,\n output_volume: 1,\n input_sensitivity: 1\n};\nvar INTERNAL_MEMBER_UPDATED_EVENTS = Object.keys(INTERNAL_MEMBER_UPDATABLE_PROPS).map((key) => {\n return `${PRODUCT_PREFIX_VIDEO}.member.updated.${key}`;\n});\nvar MEMBER_UPDATABLE_PROPS = toExternalJSON(INTERNAL_MEMBER_UPDATABLE_PROPS);\nvar MEMBER_UPDATED_EVENTS = Object.keys(MEMBER_UPDATABLE_PROPS).map((key) => {\n return `member.updated.${key}`;\n});\n\n// src/redux/features/component/componentSelectors.ts\nvar componentSelectors_exports = {};\n__export(componentSelectors_exports, {\n getComponent: () => getComponent,\n getComponentsById: () => getComponentsById,\n getComponentsToCleanup: () => getComponentsToCleanup\n});\nvar getComponent = ({ components }, id) => {\n var _a;\n return (_a = components.byId) == null ? void 0 : _a[id];\n};\nvar getComponentsById = ({ components }) => {\n return components.byId;\n};\nvar getComponentsToCleanup = (state) => {\n const components = getComponentsById(state);\n let toCleanup = [];\n Object.keys(components).forEach((id) => {\n if (components[id].responses || components[id].errors) {\n toCleanup.push(id);\n }\n });\n return toCleanup;\n};\n\n// src/index.ts\nimport * as sagaEffects from \"@redux-saga/core/effects\";\n\n// src/rooms/index.ts\nvar rooms_exports = {};\n__export(rooms_exports, {\n RoomSessionPlaybackAPI: () => RoomSessionPlaybackAPI,\n RoomSessionRecordingAPI: () => RoomSessionRecordingAPI,\n RoomSessionStreamAPI: () => RoomSessionStreamAPI,\n audioMuteMember: () => audioMuteMember,\n audioUnmuteMember: () => audioUnmuteMember,\n createRoomSessionPlaybackObject: () => createRoomSessionPlaybackObject,\n createRoomSessionRecordingObject: () => createRoomSessionRecordingObject,\n createRoomSessionStreamObject: () => createRoomSessionStreamObject,\n deafMember: () => deafMember,\n deleteMemberMeta: () => deleteMemberMeta,\n deleteMeta: () => deleteMeta,\n demote: () => demote,\n getLayouts: () => getLayouts,\n getMemberMeta: () => getMemberMeta,\n getMembers: () => getMembers,\n getMeta: () => getMeta,\n getPlaybacks: () => getPlaybacks,\n getRecordings: () => getRecordings,\n getStreams: () => getStreams,\n hideVideoMuted: () => hideVideoMuted,\n lock: () => lock,\n play: () => play,\n promote: () => promote,\n removeAllMembers: () => removeAllMembers,\n removeMember: () => removeMember,\n setDeaf: () => setDeaf,\n setHideVideoMuted: () => setHideVideoMuted,\n setInputSensitivityMember: () => setInputSensitivityMember,\n setInputVolumeMember: () => setInputVolumeMember,\n setLayout: () => setLayout,\n setMemberMeta: () => setMemberMeta,\n setMemberPosition: () => setMemberPosition,\n setMeta: () => setMeta,\n setOutputVolumeMember: () => setOutputVolumeMember,\n setPositions: () => setPositions,\n showVideoMuted: () => showVideoMuted,\n startRecording: () => startRecording,\n startStream: () => startStream,\n undeafMember: () => undeafMember,\n unlock: () => unlock,\n updateMemberMeta: () => updateMemberMeta,\n updateMeta: () => updateMeta,\n videoMuteMember: () => videoMuteMember,\n videoUnmuteMember: () => videoUnmuteMember\n});\n\n// src/rooms/methods.ts\nvar baseCodeTransform = () => {\n};\nvar createRoomMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute({\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n }, options);\n }\n});\nvar createRoomMemberMethod = (method, options = {}) => ({\n value: function(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this.execute({\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId || this.memberId\n }, rest)\n }, options);\n }\n});\nvar getLayouts = createRoomMethod(\"video.list_available_layouts\", {\n transformResolve: (payload) => ({ layouts: payload.layouts })\n});\nvar getMembers = createRoomMethod(\"video.members.get\", {\n transformResolve: (payload) => ({ members: payload.members })\n});\nvar setLayout = createRoomMethod(\"video.set_layout\", {\n transformResolve: baseCodeTransform\n});\nvar setPositions = createRoomMethod(\"video.set_position\", {\n transformResolve: baseCodeTransform\n});\nvar hideVideoMuted = createRoomMethod(\"video.hide_video_muted\", {\n transformResolve: baseCodeTransform\n});\nvar showVideoMuted = createRoomMethod(\"video.show_video_muted\", {\n transformResolve: baseCodeTransform\n});\nvar lock = createRoomMethod(\"video.lock\", {\n transformResolve: baseCodeTransform\n});\nvar unlock = createRoomMethod(\"video.unlock\", {\n transformResolve: baseCodeTransform\n});\nvar setHideVideoMuted = {\n value: function(value) {\n return this.execute({\n method: value ? \"video.hide_video_muted\" : \"video.show_video_muted\",\n params: {\n room_session_id: this.roomSessionId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar getRecordings = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recordings } = await this.execute({\n method: \"video.recording.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstances = [];\n recordings.forEach((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n } else {\n recordingInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n });\n }\n recordingInstances.push(recordingInstance);\n this.instanceMap.set(recordingInstance.id, recordingInstance);\n });\n resolve({ recordings: recordingInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startRecording = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recording } = await this.execute({\n method: \"video.recording.start\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n this.instanceMap.set(recordingInstance.id, recordingInstance);\n resolve(recordingInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar getPlaybacks = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { playbacks } = await this.execute({\n method: \"video.playback.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const playbackInstances = [];\n playbacks.forEach((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n } else {\n playbackInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n });\n }\n playbackInstances.push(playbackInstance);\n this.instanceMap.set(playbackInstance.id, playbackInstance);\n });\n resolve({ playbacks: playbackInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar play = {\n value: function(_a) {\n var _b = _a, { seekPosition, currentTimecode } = _b, params = __objRest(_b, [\"seekPosition\", \"currentTimecode\"]);\n return new Promise(async (resolve, reject) => {\n try {\n const seek_position = seekPosition || currentTimecode;\n const { playback } = await this.execute({\n method: \"video.playback.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n seek_position\n }, params)\n });\n const playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n this.instanceMap.set(playbackInstance.id, playbackInstance);\n resolve(playbackInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar createRoomMetaMethod = (method) => {\n return createRoomMethod(method, {\n transformResolve: baseCodeTransform,\n transformParams: (params) => {\n const _a = params, { room_session_id } = _a, meta = __objRest(_a, [\"room_session_id\"]);\n return { room_session_id, meta };\n }\n });\n};\nvar getMeta = createRoomMethod(\"video.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMeta = createRoomMetaMethod(\"video.set_meta\");\nvar updateMeta = createRoomMetaMethod(\"video.update_meta\");\nvar deleteMeta = {\n value: function(params) {\n return this.execute({\n method: \"video.delete_meta\",\n params: {\n room_session_id: this.roomSessionId,\n keys: params\n }\n });\n }\n};\nvar getStreams = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { streams } = await this.execute({\n method: \"video.stream.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const streamInstances = [];\n streams.forEach((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n } else {\n streamInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n });\n }\n streamInstances.push(streamInstance);\n this.instanceMap.set(streamInstance.id, streamInstance);\n });\n resolve({ streams: streamInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startStream = {\n value: function(params) {\n return new Promise(async (resolve, reject) => {\n try {\n const { stream } = await this.execute({\n method: \"video.stream.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n });\n const streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n this.instanceMap.set(streamInstance.id, streamInstance);\n resolve({ stream: streamInstance });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar audioMuteMember = createRoomMemberMethod(\"video.member.audio_mute\", {\n transformResolve: baseCodeTransform\n});\nvar audioUnmuteMember = createRoomMemberMethod(\"video.member.audio_unmute\", {\n transformResolve: baseCodeTransform\n});\nvar videoMuteMember = createRoomMemberMethod(\"video.member.video_mute\", {\n transformResolve: baseCodeTransform\n});\nvar videoUnmuteMember = createRoomMemberMethod(\"video.member.video_unmute\", {\n transformResolve: baseCodeTransform\n});\nvar deafMember = createRoomMemberMethod(\"video.member.deaf\", {\n transformResolve: baseCodeTransform\n});\nvar undeafMember = createRoomMemberMethod(\"video.member.undeaf\", {\n transformResolve: baseCodeTransform\n});\nvar setDeaf = {\n value: function(value) {\n return this.execute({\n method: value ? \"video.member.deaf\" : \"video.member.undeaf\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: this.memberId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar setInputVolumeMember = createRoomMemberMethod(\"video.member.set_input_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setOutputVolumeMember = createRoomMemberMethod(\"video.member.set_output_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setInputSensitivityMember = createRoomMemberMethod(\"video.member.set_input_sensitivity\", {\n transformResolve: baseCodeTransform\n});\nvar promote = {\n value: function(_a) {\n var _b = _a, {\n memberId,\n mediaAllowed,\n joinAudioMuted,\n joinVideoMuted\n } = _b, rest = __objRest(_b, [\n \"memberId\",\n \"mediaAllowed\",\n \"joinAudioMuted\",\n \"joinVideoMuted\"\n ]);\n return this.execute({\n method: \"video.member.promote\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed,\n join_audio_muted: joinAudioMuted,\n join_video_muted: joinVideoMuted\n }, rest)\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar demote = {\n value: function({ memberId, mediaAllowed }) {\n return this.execute({\n method: \"video.member.demote\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar setMemberPosition = createRoomMemberMethod(\"video.member.set_position\", {\n transformResolve: baseCodeTransform\n});\nvar removeMember = {\n value: function(_a) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n if (!memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument');\n }\n return this.execute({\n method: \"video.member.remove\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId\n }, rest)\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar removeAllMembers = {\n value: function() {\n return this.execute({\n method: \"video.member.remove\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: \"all\"\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar getMemberMeta = createRoomMemberMethod(\"video.member.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMemberMeta = createRoomMemberMethod(\"video.member.set_meta\", {\n transformResolve: baseCodeTransform\n});\nvar updateMemberMeta = createRoomMemberMethod(\"video.member.update_meta\", {\n transformResolve: baseCodeTransform\n});\nvar deleteMemberMeta = createRoomMemberMethod(\"video.member.delete_meta\", {\n transformResolve: baseCodeTransform\n});\n\n// src/rooms/RoomSessionRecording.ts\nvar RoomSessionRecordingAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.recording.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.recording.state;\n }\n get duration() {\n return this._payload.recording.duration;\n }\n get startedAt() {\n if (!this._payload.recording.started_at)\n return void 0;\n return new Date(this._payload.recording.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.recording.ended_at)\n return void 0;\n return new Date(this._payload.recording.ended_at * 1e3);\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.recording.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.recording.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.recording.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionRecordingObject = (params) => {\n const recording = connect({\n store: params.store,\n Component: RoomSessionRecordingAPI\n })(params);\n return recording;\n};\n\n// src/rooms/RoomSessionPlayback.ts\nvar RoomSessionPlaybackAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.playback.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get url() {\n return this._payload.playback.url;\n }\n get state() {\n return this._payload.playback.state;\n }\n get volume() {\n return this._payload.playback.volume;\n }\n get startedAt() {\n if (!this._payload.playback.started_at)\n return void 0;\n return new Date(this._payload.playback.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.playback.ended_at)\n return void 0;\n return new Date(this._payload.playback.ended_at * 1e3);\n }\n get position() {\n return this._payload.playback.position;\n }\n get seekable() {\n return this._payload.playback.seekable;\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.playback.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.playback.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.playback.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async setVolume(volume) {\n await this.execute({\n method: \"video.playback.set_volume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n volume\n }\n });\n }\n async seek(timecode) {\n await this.execute({\n method: \"video.playback.seek_absolute\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(timecode)\n }\n });\n }\n async forward(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(offset)\n }\n });\n }\n async rewind(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: -Math.abs(offset)\n }\n });\n }\n};\nvar createRoomSessionPlaybackObject = (params) => {\n const playback = connect({\n store: params.store,\n Component: RoomSessionPlaybackAPI\n })(params);\n return playback;\n};\n\n// src/rooms/RoomSessionStream.ts\nvar RoomSessionStreamAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.stream.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.stream.state;\n }\n get duration() {\n return this._payload.stream.duration;\n }\n get url() {\n return this._payload.stream.url;\n }\n get startedAt() {\n if (!this._payload.stream.started_at)\n return void 0;\n return new Date(this._payload.stream.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.stream.ended_at)\n return void 0;\n return new Date(this._payload.stream.ended_at * 1e3);\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async stop() {\n await this.execute({\n method: \"video.stream.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n stream_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionStreamObject = (params) => {\n const stream = connect({\n store: params.store,\n Component: RoomSessionStreamAPI\n })(params);\n return stream;\n};\n\n// src/chat/index.ts\nvar chat_exports = {};\n__export(chat_exports, {\n BaseChatAPI: () => BaseChatAPI,\n BaseChatConsumer: () => BaseChatConsumer,\n ChatMember: () => ChatMember,\n ChatMessage: () => ChatMessage,\n createBaseChatObject: () => createBaseChatObject,\n getMemberState: () => getMemberState,\n getMembers: () => getMembers2,\n getMessages: () => getMessages,\n publish: () => publish,\n setMemberState: () => setMemberState\n});\n\n// src/chat/utils/toInternalChatChannels.ts\nvar toInternalChatChannels = (channels) => {\n const list = !channels || Array.isArray(channels) ? channels : [channels];\n if (Array.isArray(list)) {\n return list.map((name) => {\n return {\n name\n };\n });\n }\n return [];\n};\n\n// src/chat/utils/index.ts\nvar isValidChannels = (input) => {\n return Array.isArray(input) || typeof input === \"string\";\n};\n\n// src/chat/methods.ts\nvar baseCodeTransform2 = () => {\n};\nvar createChatMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute({\n method,\n params\n }, options);\n }\n});\nvar createChatMemberMethod = (method, options = {}) => ({\n value: function(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this.execute({\n method,\n params: __spreadValues({\n member_id: memberId\n }, rest)\n }, options);\n }\n});\nvar publish = createChatMethod(\"chat.publish\", {\n transformResolve: baseCodeTransform2\n});\nvar getMessages = createChatMethod(\"chat.messages.get\", {\n transformResolve: (payload) => ({\n messages: payload.messages.map((message) => toExternalJSON(message)),\n cursor: payload.cursor\n })\n});\nvar getMembers2 = createChatMethod(\"chat.members.get\", {\n transformResolve: (payload) => ({\n members: payload.members.map((member) => toExternalJSON(member))\n })\n});\nvar transformParamChannels = (params) => {\n const channels = isValidChannels(params == null ? void 0 : params.channels) ? toInternalChatChannels(params.channels) : void 0;\n return __spreadProps(__spreadValues({}, params), {\n channels\n });\n};\nvar setMemberState = createChatMemberMethod(\"chat.member.set_state\", {\n transformResolve: baseCodeTransform2,\n transformParams: transformParamChannels\n});\nvar getMemberState = createChatMemberMethod(\"chat.member.get_state\", {\n transformResolve: (payload) => ({ channels: payload.channels }),\n transformParams: transformParamChannels\n});\n\n// src/pubSub/index.ts\nvar pubSub_exports = {};\n__export(pubSub_exports, {\n BasePubSubConsumer: () => BasePubSubConsumer,\n PubSubMessage: () => PubSubMessage,\n createBasePubSubObject: () => createBasePubSubObject\n});\n\n// src/pubSub/workers/pubSubWorker.ts\nvar pubSubWorker = function* (options) {\n getLogger().trace(\"pubSubWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case `${PRODUCT_PREFIX_PUBSUB}.channel.message`: {\n const {\n channel: channel3,\n message: _a\n } = payload, _b = _a, { member } = _b, restMessage = __objRest(_b, [\"member\"]);\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, restMessage), {\n channel: channel3\n }));\n const pubSubMessage = new PubSubMessage(externalJSON);\n client.emit(\"message\", pubSubMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown pubsub event: \"${type}\"`);\n break;\n }\n }\n const isPubSubEvent = (action) => action.type.startsWith(`${PRODUCT_PREFIX_PUBSUB}.`);\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, isPubSubEvent);\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"pubSubWorker ended\");\n};\n\n// src/pubSub/BasePubSub.ts\nvar toInternalPubSubChannels = (channels) => {\n return channels.map((name) => {\n return {\n name\n };\n });\n};\nvar BasePubSubConsumer = class extends BaseConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_PUBSUB}.subscribe`);\n this.initWorker();\n }\n initWorker() {\n this.runWorker(\"pubSub\", { worker: pubSubWorker });\n }\n _getChannelsParam(channels, method) {\n const _channels = !channels || Array.isArray(channels) ? channels : [channels];\n if (!Array.isArray(_channels) || _channels.length === 0) {\n throw new Error(`Please specify one or more channels when calling .${method}()`);\n }\n return {\n channels: toInternalPubSubChannels(_channels)\n };\n }\n _setSubscribeParams(params) {\n this.subscribeParams = __spreadValues(__spreadValues({}, this.subscribeParams), params);\n }\n _getSubscribeParams({ channels }) {\n return __spreadValues({}, this._getChannelsParam(channels, \"subscribe\"));\n }\n _getUnsubscribeParams({ channels }) {\n const channelsParam = this._getChannelsParam(channels, \"unsubscribe\");\n return __spreadValues({}, channelsParam);\n }\n _checkMissingSubscriptions() {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.info(\"Subscribe was called before any listeners were attached. Move `.subscribe()` right after your event listeners to suppress this message.\");\n this.once(\"message\", () => {\n });\n }\n }\n getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => `${PRODUCT_PREFIX_PUBSUB}.${String(event)}`);\n return validateEventsToSubscribe(eventNamesWithPrefix);\n }\n async subscribe(channels) {\n this._checkMissingSubscriptions();\n const params = this._getSubscribeParams({ channels });\n this._setSubscribeParams(params);\n return super.subscribe();\n }\n async unsubscribe(channels) {\n if (this._sessionAuthStatus === \"unknown\" || this._sessionAuthStatus === \"unauthorized\") {\n throw new Error(\"You must be authenticated to unsubscribe from a channel\");\n }\n const params = this._getUnsubscribeParams({ channels });\n return new Promise(async (resolve, reject) => {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length > 0) {\n const execParams = {\n method: `${PRODUCT_PREFIX_PUBSUB}.unsubscribe`,\n params: __spreadProps(__spreadValues({}, params), {\n events: subscriptions\n })\n };\n try {\n await this.execute(execParams);\n } catch (error) {\n return reject(error);\n }\n } else {\n this.logger.warn(\"`unsubscribe()` was called without any listeners attached.\");\n }\n return resolve();\n });\n }\n updateToken(token) {\n return new Promise((resolve, reject) => {\n this.session.once(\"session.auth_error\", (error) => {\n reject(error);\n });\n this.session.once(\"session.connected\", () => {\n resolve();\n });\n this.store.dispatch(actions_exports.reauthAction({ token }));\n });\n }\n publish(params) {\n return this.execute({\n method: `${PRODUCT_PREFIX_PUBSUB}.publish`,\n params\n });\n }\n async getAllowedChannels() {\n await this._waitUntilSessionAuthorized();\n const authState = this.select(getAuthState);\n if (authState && \"channels\" in authState && authState.channels) {\n return authState.channels;\n }\n return {};\n }\n};\nvar createBasePubSubObject = (params) => {\n const pubSub = connect({\n store: params.store,\n Component: BasePubSubConsumer\n })(params);\n return pubSub;\n};\n\n// src/pubSub/PubSubMessage.ts\nvar PubSubMessage = class {\n constructor(payload) {\n this.payload = payload;\n }\n get id() {\n return this.payload.id;\n }\n get channel() {\n return this.payload.channel;\n }\n get content() {\n return this.payload.content;\n }\n get meta() {\n return this.payload.meta;\n }\n get publishedAt() {\n return this.payload.publishedAt;\n }\n};\n\n// src/chat/workers/chatWorker.ts\nvar chatWorker = function* (options) {\n getLogger().trace(\"chatWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case \"chat.channel.message\": {\n const { channel: channel3, message } = payload;\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, message), {\n channel: channel3\n }));\n const chatMessage = new ChatMessage(externalJSON);\n client.emit(\"message\", chatMessage);\n break;\n }\n case \"chat.member.joined\":\n case \"chat.member.updated\":\n case \"chat.member.left\": {\n const { member } = payload;\n const externalJSON = toExternalJSON(member);\n const chatMessage = new ChatMember(externalJSON);\n const event = stripNamespacePrefix(type);\n client.emit(event, chatMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown chat event: \"${type}\"`);\n break;\n }\n }\n const isChatEvent2 = (action) => action.type.startsWith(\"chat.\");\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, isChatEvent2);\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"chatWorker ended\");\n};\n\n// src/chat/BaseChat.ts\nvar BaseChatConsumer = class extends BasePubSubConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_CHAT}.subscribe`);\n }\n initWorker() {\n this.runWorker(\"chat\", { worker: chatWorker });\n }\n};\nvar BaseChatAPI = extendComponent(BaseChatConsumer, {\n publish,\n getMembers: getMembers2,\n getMessages,\n setMemberState,\n getMemberState\n});\nvar createBaseChatObject = (params) => {\n const chat = connect({\n store: params.store,\n Component: BaseChatAPI\n })(params);\n return chat;\n};\n\n// src/chat/ChatMessage.ts\nvar ChatMessage = class extends PubSubMessage {\n get member() {\n return this.payload.member;\n }\n};\n\n// src/chat/ChatMember.ts\nvar ChatMember = class {\n constructor(payload) {\n this.payload = payload;\n }\n get id() {\n return this.payload.id;\n }\n get channel() {\n return this.payload.channel;\n }\n get state() {\n var _a;\n return (_a = this.payload.state) != null ? _a : {};\n }\n};\n\n// src/memberPosition/index.ts\nvar memberPosition_exports = {};\n__export(memberPosition_exports, {\n MEMBER_POSITION_COMPOUND_EVENTS: () => MEMBER_POSITION_COMPOUND_EVENTS,\n memberPositionWorker: () => memberPositionWorker,\n memberUpdatedWorker: () => memberUpdatedWorker\n});\n\n// src/memberPosition/workers.ts\nimport { fork as fork3 } from \"@redux-saga/core/effects\";\nvar defaultDispatcher = function* (type, payload, instance) {\n instance.emit(type, payload);\n};\nfunction* memberPositionLayoutChangedWorker(options) {\n const {\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n } = options;\n const layers = action.payload.layout.layers;\n const processedMembers = {};\n layers.forEach((layer) => {\n var _a;\n const memberId = layer.member_id;\n if (!memberId) {\n return;\n }\n const memberEventParams = memberList.get(memberId);\n if (memberEventParams && layer.position !== ((_a = memberEventParams.member) == null ? void 0 : _a.current_position)) {\n mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: layer.position\n });\n processedMembers[memberId] = true;\n } else {\n processedMembers[memberId] = false;\n }\n });\n for (const [memberId, payload] of memberList) {\n if (processedMembers[memberId]) {\n yield dispatcher == null ? void 0 : dispatcher(\"video.member.updated\", payload, instance);\n } else if (processedMembers[memberId] === void 0) {\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: \"off-canvas\"\n });\n if (!updatedMemberEventParams) {\n return;\n }\n yield dispatcher == null ? void 0 : dispatcher(\"video.member.updated\", updatedMemberEventParams, instance);\n }\n }\n}\nfunction* memberUpdatedWorker({\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n}) {\n var _a, _b;\n const memberId = action.payload.member.id;\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: (_b = (_a = memberList.get(memberId)) == null ? void 0 : _a.member) == null ? void 0 : _b.current_position\n });\n if (!updatedMemberEventParams) {\n return;\n }\n const {\n member: { updated = [] }\n } = action.payload;\n const memberUpdatedPayload = __spreadProps(__spreadValues({}, updatedMemberEventParams), {\n member: __spreadValues(__spreadValues({}, updatedMemberEventParams.member), action.payload.member)\n });\n memberList.set(memberId, memberUpdatedPayload);\n for (const key of updated) {\n const type = `${action.type}.${key}`;\n yield dispatcher == null ? void 0 : dispatcher(type, memberUpdatedPayload, instance);\n }\n yield dispatcher == null ? void 0 : dispatcher(action.type, memberUpdatedPayload, instance);\n}\nvar MEMBER_POSITION_COMPOUND_EVENTS = /* @__PURE__ */ new Map([\n [\n \"video.member.updated\",\n [\n \"video.layout.changed\",\n \"video.member.joined\",\n \"video.member.left\"\n ]\n ]\n]);\nvar memberPositionWorker = function* memberPositionWorker2({\n instance,\n channels,\n initialState,\n getSession: getSession2,\n instanceMap,\n dispatcher = defaultDispatcher\n}) {\n if (!initialState) {\n return;\n }\n const { swEventChannel } = channels;\n let memberList = initializeMemberList(initialState);\n const addToMemberList = (payload) => {\n if (!memberList.has(payload.member.id)) {\n memberList.set(payload.member.id, payload);\n }\n };\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action2) => {\n const istargetEvent = action2.type === \"video.member.updated\" || action2.type === \"video.layout.changed\" || action2.type === \"video.member.joined\" || action2.type === \"video.member.left\";\n return istargetEvent;\n });\n switch (action.type) {\n case \"video.member.updated\": {\n addToMemberList(action.payload);\n yield fork3(memberUpdatedWorker, {\n action,\n channels,\n memberList,\n instance,\n getSession: getSession2,\n instanceMap,\n dispatcher\n });\n break;\n }\n case \"video.member.joined\": {\n addToMemberList(action.payload);\n break;\n }\n case \"video.member.left\": {\n const member = action.payload.member;\n memberList.delete(member.id);\n break;\n }\n case \"video.layout.changed\": {\n yield fork3(memberPositionLayoutChangedWorker, {\n action,\n channels,\n memberList,\n instance,\n dispatcher\n });\n break;\n }\n }\n }\n};\nvar mutateMemberCurrentPosition = ({\n memberList,\n memberId,\n currentPosition\n}) => {\n const memberEventParams = memberList.get(memberId);\n if (!memberEventParams) {\n return;\n } else if (!currentPosition) {\n return memberEventParams;\n }\n const updatedMemberEventParams = __spreadProps(__spreadValues({}, memberEventParams), {\n member: __spreadProps(__spreadValues({}, memberEventParams == null ? void 0 : memberEventParams.member), {\n current_position: currentPosition\n })\n });\n memberList.set(memberId, updatedMemberEventParams);\n return updatedMemberEventParams;\n};\nvar initializeMemberList = (payload) => {\n const members = payload.room_session.members;\n const memberList = /* @__PURE__ */ new Map();\n members.forEach((member) => {\n memberList.set(member.id, {\n room_id: payload.room_session.room_id,\n room_session_id: payload.room_session.id,\n member\n });\n });\n return memberList;\n};\n\n// src/testUtils.ts\nvar testUtils_exports = {};\n__export(testUtils_exports, {\n configureFullStack: () => configureFullStack,\n configureJestStore: () => configureJestStore,\n createMockedLogger: () => createMockedLogger,\n createSessionChannel: () => createSessionChannel,\n createSwEventChannel: () => createSwEventChannel,\n rpcConnectResultVRT: () => rpcConnectResultVRT,\n wait: () => wait\n});\nimport { channel as channel2, multicastChannel as multicastChannel2 } from \"@redux-saga/core\";\nvar PROJECT_ID = \"8f0a119a-cda7-4497-a47d-c81493b824d4\";\nvar TOKEN = \"<VRT>\";\nvar createMockedLogger = () => ({\n fatal: jest.fn(),\n error: jest.fn(),\n warn: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n trace: jest.fn(),\n wsTraffic: jest.fn()\n});\nvar configureJestStore = (options) => {\n return configureStore2(__spreadValues({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false,\n emitter: new EventEmitter()\n },\n SessionConstructor: BaseSession,\n runSagaMiddleware: false\n }, options));\n};\nvar configureFullStack = () => {\n const session = {\n dispatch: console.log,\n connect: jest.fn(),\n disconnect: jest.fn(),\n execute: jest.fn()\n };\n const emitter = new EventEmitter();\n const store = configureStore2({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false,\n emitter\n },\n SessionConstructor: jest.fn().mockImplementation(() => {\n return session;\n })\n });\n store.dispatch(actions_exports.initAction());\n store.dispatch(actions_exports.authSuccessAction());\n return {\n store,\n session,\n emitter,\n destroy: () => store.dispatch(actions_exports.destroyAction())\n };\n};\nvar wait = (ms) => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n};\nvar rpcConnectResultVRT = {\n identity: \"f3bc99df-2c3d-4fa4-b1dc-e8a8ffc579e6@e3fefa44-1bad-4be9-ad9b-1cbb9abd60c7.west-us\",\n authorization: {\n type: \"video\",\n project_id: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n project: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n scopes: [\"video\"],\n scope_id: \"26675883-8499-4ee9-85eb-691c4aa209f8\",\n resource: \"9c80f1e8-9430-4070-a043-937eb3a96b38\",\n join_as: \"member\",\n user_name: \"Joe\",\n room: {\n name: \"lobby\",\n display_name: \"Lobby\",\n scopes: [\"room.self.audio_mute\", \"room.self.audio_unmute\"],\n meta: {}\n },\n signature: \"SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q\",\n media_allowed: \"all\",\n audio_allowed: \"both\",\n video_allowed: \"both\",\n meta: {}\n },\n protocol: \"signalwire_SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q_03e8c927-8ea3-4661-86d5-778c3e03296a_8f0a119a-cda7-4497-a47d-c81493b824d4\",\n ice_servers: [\n {\n urls: \"turn.swire.io:443\",\n credential: \"sFTwvi8ShXcYNOcyYjFy3ATIUpQ=\",\n credentialType: \"password\",\n username: \"1619521908:8f0a119a-cda7-4497-a47d-c81493b824d4\"\n }\n ]\n};\nvar createSwEventChannel = () => multicastChannel2();\nvar createSessionChannel = () => channel2();\n\n// src/index.ts\nvar selectors = __spreadValues({}, sessionSelectors_exports);\nexport {\n AuthError,\n BaseClient,\n BaseComponent,\n BaseConsumer,\n BaseJWTSession,\n BaseSession,\n chat_exports as Chat,\n ChatMember,\n ChatMessage,\n DEFAULT_CONNECT_VERSION,\n EventEmitter,\n GLOBAL_VIDEO_EVENTS,\n HttpError,\n INTERNAL_MEMBER_UPDATABLE_PROPS,\n INTERNAL_MEMBER_UPDATED_EVENTS,\n LOCAL_EVENT_PREFIX,\n MEMBER_UPDATABLE_PROPS,\n MEMBER_UPDATED_EVENTS,\n memberPosition_exports as MemberPosition,\n pubSub_exports as PubSub,\n PubSubMessage,\n RPCConnect,\n RPCDisconnectResponse,\n RPCExecute,\n RPCPing,\n RPCPingResponse,\n RPCReauthenticate,\n rooms_exports as Rooms,\n SWCloseEvent,\n VertoAnswer,\n VertoAttach,\n VertoBye,\n VertoInfo,\n VertoInvite,\n VertoModify,\n VertoPong,\n VertoResult,\n VertoSubscribe,\n WEBRTC_EVENT_TYPES,\n actions_exports as actions,\n componentActions,\n componentReducer,\n componentSelectors_exports as componentSelectors,\n configureStore2 as configureStore,\n connect,\n debounce,\n extendComponent,\n findNamespaceInPayload,\n fromSnakeToCamelCase,\n getEventEmitter,\n getLogger,\n initialComponentState,\n initialSessionState,\n isGlobalEvent,\n isSATAuth,\n isWebrtcEventType,\n makeRPCRequest,\n makeRPCResponse,\n sagaEffects,\n sagaHelpers_exports as sagaHelpers,\n selectors,\n sessionActions,\n sessionReducer,\n setLogger,\n stripNamespacePrefix,\n testUtils_exports as testUtils,\n timeoutPromise,\n toExternalJSON,\n toInternalAction,\n toInternalEventName,\n toLocalEvent,\n toSnakeCaseKeys,\n toSyntheticEvent,\n v4 as uuid,\n validateEventsToSubscribe\n};\n//# sourceMappingURL=index.esm.js.map\n","import { AuthError, HttpError } from '@signalwire/core'\n\ninterface InternalHttpResponse<T> extends Response {\n parsedBody?: T\n}\n\nasync function http<T>(\n input: string,\n init: RequestInit | undefined\n): Promise<InternalHttpResponse<T>> {\n const response: InternalHttpResponse<T> = await fetch(input, init)\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError(response.status, 'Unauthorized')\n }\n\n let errorResponse\n try {\n errorResponse = await response.json()\n } catch (e) {}\n\n const errorMessage = errorResponse?.errors\n ? JSON.stringify(errorResponse.errors)\n : 'Not Found'\n\n throw new HttpError(response.status, errorMessage, errorResponse)\n }\n\n try {\n // might throw if body is empty\n response.parsedBody = await response.json()\n } catch (e) {}\n\n return response\n}\n\ninterface CreateHttpClientOptions extends RequestInit {\n baseUrl: string\n /**\n * Timeout in milliseconds\n */\n timeout?: number\n}\n\ninterface HttpClientRequestInit extends Omit<RequestInit, 'body'> {\n body?: Record<string, unknown>\n searchParams?: Record<string, any>\n}\n\nexport const createHttpClient = (\n { baseUrl, timeout = 30000, ...globalOptions }: CreateHttpClientOptions,\n fetcher = http\n) => {\n const apiClient = async <T>(\n path: string,\n options?: HttpClientRequestInit\n ): Promise<{ body: T }> => {\n const headers = {\n ...(options?.body ? { 'Content-Type': 'application/json' } : {}),\n ...globalOptions.headers,\n ...options?.headers,\n }\n\n const reqInit = getRequestInit({\n ...globalOptions,\n ...options,\n headers,\n })\n // reqInit.mode = 'no-cors'\n // reqInit.credentials = 'include'\n\n let timerId\n if (timeout) {\n const controller = new AbortController()\n const signal = controller.signal\n\n reqInit.signal = signal\n\n timerId = setTimeout(() => {\n controller.abort()\n }, timeout)\n }\n\n try {\n const response = await fetcher<T>(\n getUrl({\n path,\n baseUrl,\n searchParams: options?.searchParams,\n }),\n reqInit\n )\n\n return { body: response.parsedBody as T }\n } catch (e) {\n throw e\n } finally {\n timerId && clearTimeout(timerId)\n }\n }\n\n return apiClient\n}\n\nconst getBody = (body: unknown) => {\n return typeof body === 'string' ? body : JSON.stringify(body)\n}\n\nconst getRequestInit = (options: any): RequestInit => {\n return Object.entries(options).reduce((reducer, [key, value]) => {\n if (key === 'body') {\n return {\n ...reducer,\n body: getBody(value),\n }\n } else if (value != undefined) {\n return {\n ...reducer,\n [key]: value,\n }\n }\n\n return reducer\n }, {} as RequestInit)\n}\n\nconst getUrl = ({\n path,\n baseUrl,\n searchParams,\n}: {\n baseUrl: string\n path: string\n searchParams?: Record<string, any>\n}) => {\n const url = new URL(path, baseUrl)\n\n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value != undefined) {\n url.searchParams.append(key, value)\n }\n })\n }\n return url.toString()\n}\n","import { getLogger } from '@signalwire/core';\nexport const RTCPeerConnection = (config) => {\n return new window.RTCPeerConnection(config);\n};\n/**\n * Returns whether the current environment supports the media devices API.\n */\nexport const supportsMediaDevices = () => {\n return typeof navigator !== 'undefined' && !!navigator.mediaDevices;\n};\n/**\n * Returns the mediaDevices object if supported, otherwise throws an error.\n */\nexport const getMediaDevicesApi = () => {\n if (!supportsMediaDevices()) {\n throw new Error(\"The media devices API isn't supported in this environment\");\n }\n return navigator.mediaDevices;\n};\n/**\n * Returns whether the current environment supports `getUserMedia`.\n */\nexport const supportsGetUserMedia = () => {\n return typeof getMediaDevicesApi().getUserMedia === 'function';\n};\n/**\n * Returns whether the current environment supports `getDisplayMedia`.\n */\nexport const supportsGetDisplayMedia = () => {\n return typeof getMediaDevicesApi().getDisplayMedia === 'function';\n};\n/**\n * Returns a dictionary whose fields specify the constrainable properties the user agent understands.\n */\nexport const getSupportedConstraints = () => {\n return getMediaDevicesApi().getSupportedConstraints();\n};\nexport const streamIsValid = (stream) => stream && stream instanceof MediaStream;\n/**\n * Returns whether the current environment supports the selection of a media output device.\n */\nexport const supportsMediaOutput = () => {\n return 'sinkId' in HTMLMediaElement.prototype;\n};\n/**\n * Assigns the specified audio output device to the specified HTMLMediaElement.\n * The device with id `deviceId` must be an audio output device. Asynchronously\n * returns whether the operation had success.\n *\n * > 📘\n * > Some browsers do not support output device selection. You can check by\n * > calling [`supportsMediaOutput`](supportsmediaoutput).\n *\n * @param el target element\n * @param deviceId id of the audio output device\n * @returns a promise of whether the operation had success\n *\n * @example\n * ```typescript\n * const el = document.querySelector('video')\n * const outDevices = await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * await SignalWire.WebRTC.setMediaElementSinkId(el, outDevices[0].deviceId)\n * // true\n```\n */\nexport const setMediaElementSinkId = async (el, deviceId) => {\n if (el === null) {\n getLogger().warn('No HTMLMediaElement to attach the speakerId');\n return;\n }\n else if (typeof deviceId !== 'string') {\n getLogger().warn(`Invalid speaker deviceId: '${deviceId}'`);\n return;\n }\n else if (!supportsMediaOutput()) {\n getLogger().warn('Browser does not support output device selection.');\n return;\n }\n try {\n // @ts-ignore\n return await el.setSinkId(deviceId);\n }\n catch (error) {\n if (error.name === 'SecurityError') {\n getLogger().error(`You need to use HTTPS for selecting audio output device: ${error}`);\n }\n else {\n getLogger().error(`Error: ${error}`);\n }\n throw error;\n }\n};\nexport const sdpToJsonHack = (sdp) => sdp;\nexport const stopStream = (stream) => {\n var _a;\n if (streamIsValid(stream)) {\n (_a = stream === null || stream === void 0 ? void 0 : stream.getTracks()) === null || _a === void 0 ? void 0 : _a.forEach(stopTrack);\n }\n};\nexport const stopTrack = (track) => {\n if (track && track.readyState === 'live') {\n track.stop();\n track.dispatchEvent(new Event('ended'));\n }\n};\n/**\n * Maps permission's names from `DevicePermissionDescriptor[\"name\"]`\n * to `MediaDeviceKind`\n */\nconst PERMISSIONS_MAPPING = {\n camera: 'videoinput',\n microphone: 'audioinput',\n speaker: 'audiooutput',\n};\nexport const _getMediaDeviceKindByName = (name) => {\n if (!name) {\n return undefined;\n }\n return PERMISSIONS_MAPPING[name];\n};\n//# sourceMappingURL=primitives.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Enumerates the media input and output devices available on this device.\n *\n * > 📘\n * > Depending on the browser, some information (such as the `label` and\n * > `deviceId` attributes) could be hidden until permission is granted, for\n * > example by calling {@link getUserMedia}.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.enumerateDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"EEX/N2...AjrOs=\"\n * // },\n * // ...\n * // ]\n * ```\n */\nexport const enumerateDevices = () => {\n return getMediaDevicesApi().enumerateDevices();\n};\nexport const enumerateDevicesByKind = async (filterByKind) => {\n let devices = await enumerateDevices().catch((_error) => []);\n if (filterByKind) {\n devices = devices.filter(({ kind }) => kind === filterByKind);\n }\n return devices;\n};\n//# sourceMappingURL=enumerateDevices.js.map","import { getLogger } from '@signalwire/core';\nimport { _getMediaDeviceKindByName } from './primitives';\nimport { enumerateDevicesByKind } from './enumerateDevices';\n/**\n * For browsers not supporting the Permissions API\n * @param {string} kind\n * @returns\n */\nconst _legacyCheckPermissions = async (kind) => {\n const devices = await enumerateDevicesByKind(kind);\n if (!devices.length) {\n getLogger().warn(`No ${kind} devices to check for permissions!`);\n return null;\n }\n return devices.every(({ deviceId, label }) => Boolean(deviceId && label));\n};\n/**\n * Asynchronously returns whether we have permissions to access the specified\n * resource. Some common parameter values for `name` are `\"camera\"`,\n * `\"microphone\"`, and `\"speaker\"`. In those cases, prefer the dedicated methods\n * {@link checkCameraPermissions}, {@link checkMicrophonePermissions}, and\n * {@link checkSpeakerPermissions}.\n * @param name name of the resource\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkPermissions(\"camera\")\n * // true: we have permission for using the camera\n * ```\n */\nexport const checkPermissions = async (name) => {\n if ('permissions' in navigator &&\n typeof navigator.permissions.query === 'function' &&\n name) {\n try {\n /**\n * `navigator.permissions.query` can throw if `name` is not a\n * valid enumation value for `PermissionName`. As of today, some\n * browsers like Fireforx will throw with `name: \"camera\"`\n */\n // @ts-expect-error\n const status = await navigator.permissions.query({ name });\n return status.state === 'granted';\n }\n catch (e) { }\n }\n return _legacyCheckPermissions(_getMediaDeviceKindByName(name));\n};\n/**\n * Asynchronously returns whether we have permissions to access the camera.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkCameraPermissions()\n * // true\n * ```\n */\nexport const checkCameraPermissions = () => checkPermissions('camera');\n/**\n * Asynchronously returns whether we have permissions to access the microphone.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkMicrophonePermissions()\n * // true\n * ```\n */\nexport const checkMicrophonePermissions = () => checkPermissions('microphone');\n/**\n * Asynchronously returns whether we have permissions to access the speakers.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkSpeakerPermissions()\n * // true\n * ```\n */\nexport const checkSpeakerPermissions = () => checkPermissions('speaker');\n//# sourceMappingURL=permissions.js.map","import { getLogger, timeoutPromise } from '@signalwire/core';\nimport { getMediaDevicesApi, getSupportedConstraints } from './primitives';\nimport { checkMicrophonePermissions, checkCameraPermissions, } from './permissions';\nconst GUM_TIMEOUT = 5000;\n/**\n * Check if we need to set a timeout on the gUM request.\n * In case the user needs to go through the browser prompt\n * for permissions we can't set a timer but instead just wait for\n * the user and/or the UA to solve the promise.\n * If we have the permissions already, set the timeout because we\n * had some cases where the UA is stuck reading from the device\n * and the gUM request was never resolved.\n *\n * @internal\n * @returns True/False whether the timeout should be used\n */\nconst _useTimeoutForGUM = async (constraints) => {\n const promises = [];\n if (constraints === null || constraints === void 0 ? void 0 : constraints.audio) {\n promises.push(checkMicrophonePermissions());\n }\n if (constraints === null || constraints === void 0 ? void 0 : constraints.video) {\n promises.push(checkCameraPermissions());\n }\n if (promises.length) {\n const results = await Promise.all(promises);\n return results.every(Boolean);\n }\n return false;\n};\n/**\n * Prompts the user to share one or more media devices and asynchronously\n * returns an associated [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object.\n *\n * For more information, see [`MediaDevices.getUserMedia()`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia).\n *\n * @param constraints an optional [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * To only request audio media:\n *\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n *\n * @example\n * To request both audio and video, specifying constraints for the video:\n *\n * ```typescript\n * const constraints = {\n * audio: true,\n * video: {\n * width: { min: 1024, ideal: 1280, max: 1920 },\n * height: { min: 576, ideal: 720, max: 1080 }\n * }\n * }\n * await SignalWire.WebRTC.getUserMedia(constraints)\n * // MediaStream {id: \"EDVk...\", active: true, ...}\n * ```\n */\nexport const getUserMedia = async (constraints = { audio: true, video: true }) => {\n var _a;\n try {\n const promise = getMediaDevicesApi().getUserMedia(constraints);\n const useTimeout = await _useTimeoutForGUM(constraints);\n if (useTimeout) {\n const exception = new Error('Timeout reading from your devices');\n return await timeoutPromise(promise, GUM_TIMEOUT, exception);\n }\n return await promise;\n }\n catch (error) {\n switch (error.name) {\n case 'Error': {\n getLogger().error((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : \"navigator.mediaDevices.getUserMedia doesn't seem to be supported.\");\n break;\n }\n case 'NotFoundError': {\n getLogger().error('No media tracks of the type specified were found that satisfy the given constraints.');\n break;\n }\n case 'NotReadableError': {\n getLogger().error('Hardware error occurred at the operating system, browser, or Web page level which prevented access to the device. This could have been caused by having the Camera or Mic being user by another application.');\n break;\n }\n case 'OverconstrainedError': {\n getLogger().error(`The constraint: ${error.constraint} cannot be met by the selected device.`);\n getLogger().info(`List of available constraints:`, getSupportedConstraints());\n break;\n }\n case 'NotAllowedError': {\n getLogger().error('The user has mostly likely denied access to the device. This could also happen if the browsing context is insecure (using HTTP rather than HTTPS)');\n break;\n }\n case 'TypeError': {\n if (Object.keys(constraints).length === 0) {\n getLogger().error('Constraints can\\'t be empty nor have \"video\" and \"audio\" set to false.');\n }\n else {\n getLogger().error('Please check that you are calling this method from a secure context (using HTTPS rather than HTTP).');\n }\n break;\n }\n case 'SecurityError': {\n getLogger().error('User media support is disabled on the Document on which getUserMedia() was called. The mechanism by which user media support is enabled and disabled is left up to the individual user agent.');\n break;\n }\n }\n throw error;\n }\n};\n//# sourceMappingURL=getUserMedia.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Prompts the user to share the screen and asynchronously returns a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object associated with a display or part of it.\n *\n * @param constraints an optional\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDisplayMedia()\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n */\nexport const getDisplayMedia = (constraints) => {\n return getMediaDevicesApi().getDisplayMedia(constraints);\n};\n//# sourceMappingURL=getDisplayMedia.js.map","import { getLogger, EventEmitter } from '@signalwire/core';\nimport { getUserMedia, enumerateDevices, enumerateDevicesByKind, checkPermissions, checkCameraPermissions, checkMicrophonePermissions, checkSpeakerPermissions, _getMediaDeviceKindByName, stopStream, supportsMediaOutput, getMediaDevicesApi, } from './index';\nconst _constraintsByKind = (kind) => {\n return {\n audio: !kind || kind === 'all' || kind === 'microphone' || kind === 'speaker',\n video: !kind || kind === 'all' || kind === 'camera',\n };\n};\n/**\n * After prompting the user for permission, returns an array of media input and\n * output devices available on this machine. If `kind` is not null, only the\n * devices of the specified kind are returned. Possible values of the `kind`\n * parameters are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`, which\n * respectively correspond to functions\n * {@link getCameraDevicesWithPermissions},\n * {@link getMicrophoneDevicesWithPermissions}, and\n * {@link getSpeakerDevicesWithPermissions}.\n *\n * @param kind filter for this device category\n * @param fullList By default, only devices for which\n * we have been granted permissions are returned. To obtain a list of devices regardless of\n * the permissions, pass `fullList=true`. Note however that some values such as\n * `name` and `deviceId` could be omitted.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevicesWithPermissions(\"camera\")\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getDevices} for better cross browser compatibility.\n */\nexport const getDevicesWithPermissions = async (kind, fullList = false) => getDevices(kind, fullList);\n/**\n * After prompting the user for permission, returns an array of camera devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getCameraDevices} for better cross browser compatibility.\n */\nexport const getCameraDevicesWithPermissions = () => getDevicesWithPermissions('camera');\n/**\n * After prompting the user for permission, returns an array of microphone devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getMicrophoneDevices} for better cross browser compatibility.\n */\nexport const getMicrophoneDevicesWithPermissions = () => getDevicesWithPermissions('microphone');\n/**\n * After prompting the user for permission, returns an array of speaker devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getSpeakerDevices} for better cross browser compatibility.\n */\nexport const getSpeakerDevicesWithPermissions = () => getDevicesWithPermissions('speaker');\nconst _filterDevices = (devices, options = {}) => {\n const found = [];\n return devices.filter(({ deviceId, kind, groupId }) => {\n var _a;\n if (!deviceId || (options.targets && !((_a = options.targets) === null || _a === void 0 ? void 0 : _a.includes(kind)))) {\n return false;\n }\n if (!groupId) {\n return true;\n }\n const key = `${kind}-${groupId}`;\n const checkDefault = (options === null || options === void 0 ? void 0 : options.excludeDefault) ? deviceId !== 'default' : true;\n if (!found.includes(key) && checkDefault) {\n found.push(key);\n return true;\n }\n return false;\n });\n};\n/**\n * Enumerates the media input and output devices available on this machine. If\n * `name` is provided, only the devices of the specified kind are returned.\n * Possible values of the `name` parameters are `\"camera\"`, `\"microphone\"`, and\n * `\"speaker\"`, which respectively correspond to functions\n * {@link getCameraDevices}, {@link getMicrophoneDevices}, and\n * {@link getSpeakerDevices}.\n *\n * @param name filter for this device category\n * @param fullList Default to false. Set to true to retrieve the raw list as returned by\n * the browser, which might include multiple, duplicate deviceIds for the same group.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevices(\"camera\", true)\n * // [\n * // {\n * // \"deviceId\": \"3c4f97...\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD Camera\",\n * // \"groupId\": \"828fec...\"\n * // }\n * // ]\n * ```\n */\nexport const getDevices = async (name, fullList = false) => {\n const hasPerms = await checkPermissions(name);\n let stream = undefined;\n if (hasPerms === false) {\n const constraints = _constraintsByKind(name);\n stream = await getUserMedia(constraints);\n }\n const devices = await enumerateDevicesByKind(_getMediaDeviceKindByName(name));\n /**\n * Firefox requires an active stream at the time of `enumerateDevices`\n * so we need to stop it after `WebRTC.enumerateDevicesByKind`\n */\n if (stream) {\n stopStream(stream);\n }\n if (fullList === true) {\n return devices;\n }\n return _filterDevices(devices);\n};\n/**\n * Returns an array of camera devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n */\nexport const getCameraDevices = () => getDevices('camera');\n/**\n * Returns an array of microphone devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getMicrophoneDevices = () => getDevices('microphone');\n/**\n * Returns an array of speaker devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getSpeakerDevices = () => getDevices('speaker');\n/**\n * Assure a deviceId exists in the current device list from the browser.\n * It checks for deviceId or label - in case the UA changed the deviceId randomly\n */\nexport const assureDeviceId = async (id, label, name) => {\n const devices = await getDevices(name, true);\n for (let i = 0; i < devices.length; i++) {\n const { deviceId, label: deviceLabel } = devices[i];\n if (id === deviceId || label === deviceLabel) {\n return deviceId;\n }\n }\n return null;\n};\n/**\n * Helper methods to assure a deviceId without asking the user the \"kind\"\n */\nexport const assureVideoDevice = (id, label) => assureDeviceId(id, label, 'camera');\nexport const assureAudioInDevice = (id, label) => assureDeviceId(id, label, 'microphone');\nexport const assureAudioOutDevice = (id, label) => assureDeviceId(id, label, 'speaker');\nconst _deviceInfoToMap = (devices) => {\n const map = new Map();\n devices.forEach((deviceInfo) => {\n if (deviceInfo.deviceId) {\n map.set(deviceInfo.deviceId, deviceInfo);\n }\n });\n return map;\n};\nconst _getDeviceListDiff = (oldDevices, newDevices) => {\n const current = _deviceInfoToMap(oldDevices);\n const removals = _deviceInfoToMap(oldDevices);\n const updates = [];\n getLogger().debug('[_getDeviceListDiff] <- oldDevices', oldDevices);\n getLogger().debug('[_getDeviceListDiff] -> newDevices', newDevices);\n const additions = newDevices.filter((newDevice) => {\n const id = newDevice.deviceId;\n const oldDevice = current.get(id);\n if (oldDevice) {\n removals.delete(id);\n if (newDevice.label !== oldDevice.label) {\n updates.push(newDevice);\n }\n }\n return oldDevice === undefined;\n });\n return {\n updated: updates.map((value) => {\n return {\n type: 'updated',\n payload: value,\n };\n }),\n // Removed devices\n removed: Array.from(removals, ([_, value]) => value).map((value) => {\n return {\n type: 'removed',\n payload: value,\n };\n }),\n added: additions.map((value) => {\n return {\n type: 'added',\n payload: value,\n };\n }),\n };\n};\nconst TARGET_PERMISSIONS_MAP = {\n // FIXME: Replace this object with just checkPermissions(<target>)\n camera: checkCameraPermissions,\n microphone: checkMicrophonePermissions,\n speaker: checkSpeakerPermissions,\n};\nconst DEFAULT_TARGETS = [\n 'camera',\n 'microphone',\n 'speaker',\n];\nconst ALLOWED_TARGETS_MSG = `Allowed targets are: '${DEFAULT_TARGETS.join(\"', '\")}'`;\nconst CHECK_SUPPORT_MAP = {\n speaker: supportsMediaOutput,\n};\nconst checkTargetPermissions = async (options) => {\n const targets = options.targets;\n const permissions = await Promise.all(targets.map((target) => TARGET_PERMISSIONS_MAP[target]()));\n return permissions.reduce((reducer, permission, index) => {\n var _a;\n const target = targets[index];\n /**\n * If we don't specify a check for the target we'll assume\n * there's no need to check for support\n */\n const platformSupportStatus = target in CHECK_SUPPORT_MAP ? (_a = CHECK_SUPPORT_MAP[target]) === null || _a === void 0 ? void 0 : _a.call(CHECK_SUPPORT_MAP) : true;\n const supportStatus = platformSupportStatus\n ? 'supported'\n : 'unsupported';\n reducer[supportStatus].push([target, !!permission]);\n return reducer;\n }, { supported: [], unsupported: [] });\n};\nconst validateTargets = async (options) => {\n var _a;\n const targets = ((_a = options.targets) !== null && _a !== void 0 ? _a : DEFAULT_TARGETS).filter((target) => {\n if (!DEFAULT_TARGETS.includes(target)) {\n getLogger().warn(`We'll ignore the \"${target}\" target as it is not allowed. ${ALLOWED_TARGETS_MSG}.`);\n return false;\n }\n return true;\n });\n if (!targets.length) {\n throw new Error(`At least one \"target\" is required for createDeviceWatcher(). ${ALLOWED_TARGETS_MSG}.`);\n }\n const permissions = await checkTargetPermissions({ targets });\n if (permissions.unsupported.length > 0 &&\n targets.length === permissions.unsupported.length) {\n throw new Error(`The platform doesn't support \"${targets.join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices.`);\n }\n else if (permissions.supported.every(([_, status]) => !status)) {\n throw new Error('You must ask the user for permissions before being able to listen for device changes. Try calling getUserMedia() before calling `createDeviceWatcher()`.');\n }\n let needPermissionsTarget = [];\n const filteredTargets = permissions.supported.reduce((reducer, [target, status]) => {\n if (!status) {\n needPermissionsTarget.push(target);\n }\n else {\n reducer.push(target);\n }\n return reducer;\n }, []);\n /**\n * If the length of these two arrays is different it means whether\n * we have unsupported devices or that the user hasn't granted the\n * permissions for certain targets\n */\n if (filteredTargets.length !== targets.length) {\n const unsupportedTargets = permissions.unsupported.length > 0\n ? `The platform doesn't support \"${permissions.unsupported\n .map(([t]) => t)\n .join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices. `\n : '';\n const needPermissions = needPermissionsTarget.length > 0\n ? `The user hasn't granted permissions for the following targets: ${needPermissionsTarget.join(', ')}. `\n : '';\n getLogger().warn(`${unsupportedTargets}${needPermissions}We'll be watching for the following targets instead: \"${filteredTargets.join(', ')}\"`);\n }\n getLogger().debug(`Watching these targets: \"${filteredTargets.join(', ')}\"`);\n return filteredTargets;\n};\n// FIXME: Move createDeviceWatcher and all related helpers/derived methods to its own module\n/**\n * Asynchronously returns an event emitter that notifies changes in the devices.\n * The possible events are:\n *\n * - \"added\": a device has been added\n * - \"removed\": a device has been removed\n * - \"updated\": a device has been updated\n * - \"changed\": any of the previous events occurred\n *\n * In all cases, your event handler gets as parameter an object `e` with the\n * following keys:\n *\n * - `e.changes`: the changed devices. For \"added\", \"removed\", and \"updated\"\n * event handlers, you only get the object associated to the respective event\n * (i.e., only a list of added devices, removed devices, or updated devices).\n * For \"changed\" event handlers, you get all three lists.\n * - `e.devices`: the new list of devices\n *\n * For device-specific helpers, see {@link createCameraDeviceWatcher},\n * {@link createMicrophoneDeviceWatcher}, and {@link createSpeakerDeviceWatcher}.\n *\n * @param options if null, the event emitter is associated to all devices for\n * which we have permission. Otherwise, you can pass an object\n * `{targets: string}`, where the value for key targets is a list of categories.\n * Allowed categories are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`.\n *\n * @example\n * Creating an event listener on the \"changed\" event and printing the received parameter after both connecting and disconnecting external headphones:\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * h = await SignalWire.WebRTC.createDeviceWatcher()\n * h.on('changed', (c) => console.log(c))\n * ```\n *\n * @example\n * Getting notified just for changes about audio input and output devices, ignoring the camera:\n * ```typescript\n * h = await SignalWire.WebRTC.createDeviceWatcher({targets: ['microphone', 'speaker']})\n * h.on('changed', (c) => console.log(c))\n * ```\n */\nexport const createDeviceWatcher = async (options = {}) => {\n const targets = await validateTargets({ targets: options.targets });\n const emitter = new EventEmitter();\n const currentDevices = await enumerateDevices();\n const kinds = targets === null || targets === void 0 ? void 0 : targets.reduce((reducer, name) => {\n const kind = _getMediaDeviceKindByName(name);\n if (kind) {\n reducer.push(kind);\n }\n return reducer;\n }, []);\n let knownDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n const deviceChangeHandler = async () => {\n const currentDevices = await enumerateDevices();\n const oldDevices = knownDevices;\n const newDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n knownDevices = newDevices;\n const changes = _getDeviceListDiff(oldDevices, newDevices);\n const hasAddedDevices = changes.added.length > 0;\n const hasRemovedDevices = changes.removed.length > 0;\n const hasUpdatedDevices = changes.updated.length > 0;\n if (hasAddedDevices || hasRemovedDevices || hasUpdatedDevices) {\n emitter.emit('changed', { changes: changes, devices: newDevices });\n }\n if (hasAddedDevices) {\n emitter.emit('added', {\n changes: changes.added,\n devices: newDevices,\n });\n }\n if (hasRemovedDevices) {\n emitter.emit('removed', {\n changes: changes.removed,\n devices: newDevices,\n });\n }\n if (hasUpdatedDevices) {\n emitter.emit('updated', {\n changes: changes.updated,\n devices: newDevices,\n });\n }\n };\n getMediaDevicesApi().addEventListener('devicechange', deviceChangeHandler);\n return emitter;\n};\n/**\n * Asynchronously returns an event emitter that notifies changes in all\n * microphone devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['microphone'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createMicrophoneDeviceWatcher = () => createDeviceWatcher({ targets: ['microphone'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all speaker\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['speaker'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createSpeakerDeviceWatcher = () => createDeviceWatcher({ targets: ['speaker'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all camera\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['camera'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createCameraDeviceWatcher = () => createDeviceWatcher({ targets: ['camera'] });\nconst isMediaStream = (options) => {\n return typeof (options === null || options === void 0 ? void 0 : options.getTracks) === 'function';\n};\n// FIXME: Move getMicrophoneAnalyzerMediaStream and all related helpers/derived methods to its own module\nconst getMicrophoneAnalyzerMediaStream = async (options) => {\n if (isMediaStream(options)) {\n return options;\n }\n let constraints;\n if (typeof options === 'string') {\n constraints = {\n audio: {\n deviceId: options,\n },\n };\n }\n else {\n constraints = {\n audio: options,\n };\n }\n return getUserMedia(constraints);\n};\nconst createAnalyzer = (audioContext) => {\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 64;\n analyser.minDecibels = -90;\n analyser.maxDecibels = -10;\n analyser.smoothingTimeConstant = 0.85;\n return analyser;\n};\nconst MAX_VOLUME = 100;\n/**\n * Initializes a microphone analyzer. You can use a MicrophoneAnalyzer to track\n * the input audio volume.\n *\n * To stop the analyzer, plase call the `destroy()` method on the object\n * returned by this method.\n *\n * The returned object emits the following events:\n *\n * - `volumeChanged`: instantaneous volume from 0 to 100\n * - `destroyed`: the object has been destroyed. You get a parameter\n * describing the reason, which can be `null` (if you called `destroy()`),\n * `\"error\"` (in case of errors), or `\"disconnected\"` (if the device was\n * disconnected).\n *\n * @example\n *\n * ```js\n * const micAnalyzer = await createMicrophoneAnalyzer('device-id')\n *\n * micAnalyzer.on('volumeChanged', (vol) => {\n * console.log(\"Volume: \", vol)\n * })\n * micAnalyzer.on('destroyed', (reason) => {\n * console.log('Microphone analyzer destroyed', reason)\n * })\n *\n * micAnalyzer.destroy()\n * ```\n *\n * @param options either the id of the device to analize, or\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints),\n * or a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @returns Asynchronously returns a MicrophoneAnalyzer.\n */\nexport const createMicrophoneAnalyzer = async (options) => {\n const stream = await getMicrophoneAnalyzerMediaStream(options);\n if (!stream) {\n throw new Error('Failed to get the audio stream');\n }\n const emitter = new EventEmitter();\n const audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n const analyser = createAnalyzer(audioContext);\n let rafId;\n let volume;\n try {\n audioContext.createMediaStreamSource(stream).connect(analyser);\n }\n catch (error) {\n throw new Error('No audio track found');\n }\n /**\n * If the device gets disconnected, we'll notify the user of\n * the change.\n */\n stream.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', () => {\n emitter.emit('destroyed', 'disconnected');\n });\n });\n const startMetering = () => {\n try {\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(dataArray);\n /**\n * dataArray contains the values of the volume\n * gathered within a single requestAnimationFrame With\n * reduce and divide by 20 we translate the array\n * values into a 0-100 scale to draw the green bars\n * for the voice/volume energy.\n */\n const latestVol = dataArray.reduce((final, value) => final + value, 0) / 20;\n if (volume !== latestVol) {\n volume = latestVol;\n emitter.emit('volumeChanged', Math.min(volume, MAX_VOLUME));\n }\n rafId = requestAnimationFrame(startMetering);\n }\n catch (e) {\n emitter.emit('destroyed', 'error');\n }\n };\n rafId = requestAnimationFrame(startMetering);\n const destroy = () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n }\n if (audioContext.state !== 'closed') {\n audioContext.close().catch((error) => {\n getLogger().error('Error closing the AudioContext', error);\n });\n }\n /**\n * If the user provided a MediaStream, we don't need to\n * close it.\n */\n if (!isMediaStream(options)) {\n stream.getTracks().forEach((track) => track.stop());\n }\n emitter.emit('destroyed', null);\n emitter.removeAllListeners();\n };\n return new Proxy(\n // @ts-expect-error\n emitter, {\n get(target, prop, receiver) {\n if (prop === 'destroy') {\n return destroy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n};\n/**\n * Returns the speaker based on the given id.\n * @param id string\n * @returns MediaDevices | undefined\n */\nexport const getSpeakerById = async (id) => {\n const speakers = await getSpeakerDevices();\n return speakers.find((audio) => audio.deviceId === id ||\n (audio.deviceId === 'default' && id === '') ||\n (audio.deviceId === '' && id === 'default'));\n};\n//# sourceMappingURL=deviceHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport { getUserMedia as _getUserMedia } from './getUserMedia';\nimport { assureDeviceId } from './deviceHelpers';\n// FIXME: Remove and use getUserMedia directly\nexport const getUserMedia = (constraints) => {\n getLogger().info('RTCService.getUserMedia', constraints);\n const { audio, video } = constraints;\n if (!audio && !video) {\n return;\n }\n return _getUserMedia(constraints);\n};\nexport const getMediaConstraints = async (options) => {\n let { audio = true, micId } = options;\n const { micLabel = '' } = options;\n if (micId) {\n const newMicId = await assureDeviceId(micId, micLabel, 'microphone').catch((_error) => null);\n if (newMicId) {\n if (typeof audio === 'boolean') {\n audio = {};\n }\n audio.deviceId = { exact: newMicId };\n }\n }\n let { video = false, camId } = options;\n const { camLabel = '' } = options;\n if (camId) {\n const newCamId = await assureDeviceId(camId, camLabel, 'camera').catch((_error) => null);\n if (newCamId) {\n if (typeof video === 'boolean') {\n video = {};\n }\n video.deviceId = { exact: newCamId };\n }\n }\n return { audio, video };\n};\n//# sourceMappingURL=helpers.js.map","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","import { getLogger } from '@signalwire/core';\nimport SDPUtils from 'sdp';\nconst _isAudioLine = (line) => /^m=audio/.test(line);\nconst _isVideoLine = (line) => /^m=video/.test(line);\nconst _getCodecPayloadType = (line) => {\n const pattern = new RegExp('a=rtpmap:(\\\\d+) \\\\w+\\\\/\\\\d+');\n const result = line.match(pattern);\n return result && result.length == 2 ? result[1] : null;\n};\n/**\n * Add stereo support hacking the SDP\n * @return the SDP modified\n */\nexport const sdpStereoHack = (sdp) => {\n const endOfLine = '\\r\\n';\n const sdpLines = sdp.split(endOfLine);\n const opusIndex = sdpLines.findIndex((s) => /^a=rtpmap/.test(s) && /opus\\/48000/.test(s));\n if (opusIndex < 0) {\n return sdp;\n }\n const opusPayload = _getCodecPayloadType(sdpLines[opusIndex]);\n const pattern = new RegExp(`a=fmtp:${opusPayload}`);\n const fmtpLineIndex = sdpLines.findIndex((s) => pattern.test(s));\n if (fmtpLineIndex >= 0) {\n if (!/stereo=1;/.test(sdpLines[fmtpLineIndex])) {\n // Append stereo=1 to fmtp line if not already present\n sdpLines[fmtpLineIndex] += '; stereo=1; sprop-stereo=1';\n }\n }\n else {\n // create an fmtp line\n sdpLines[opusIndex] += `${endOfLine}a=fmtp:${opusPayload} stereo=1; sprop-stereo=1`;\n }\n return sdpLines.join(endOfLine);\n};\nexport const sdpMediaOrderHack = (answer, localOffer) => {\n const endOfLine = '\\r\\n';\n const offerLines = localOffer.split(endOfLine);\n const offerAudioIndex = offerLines.findIndex(_isAudioLine);\n const offerVideoIndex = offerLines.findIndex(_isVideoLine);\n if (offerAudioIndex < offerVideoIndex) {\n return answer;\n }\n const answerLines = answer.split(endOfLine);\n const answerAudioIndex = answerLines.findIndex(_isAudioLine);\n const answerVideoIndex = answerLines.findIndex(_isVideoLine);\n const audioLines = answerLines.slice(answerAudioIndex, answerVideoIndex);\n const videoLines = answerLines.slice(answerVideoIndex, answerLines.length - 1);\n const beginLines = answerLines.slice(0, answerAudioIndex);\n return [...beginLines, ...videoLines, ...audioLines, ''].join(endOfLine);\n};\n/**\n * Modify the SDP to increase video bitrate\n * @return the SDP modified\n */\nexport const sdpBitrateHack = (sdp, max, min, start) => {\n const endOfLine = '\\r\\n';\n const lines = sdp.split(endOfLine);\n lines.forEach((line, i) => {\n if (/^a=fmtp:\\d*/.test(line)) {\n lines[i] += `;x-google-max-bitrate=${max};x-google-min-bitrate=${min};x-google-start-bitrate=${start}`;\n }\n else if (/^a=mid:(1|video)/.test(line)) {\n lines[i] += `\\r\\nb=AS:${max}`;\n }\n });\n return lines.join(endOfLine);\n};\n// const sdpAudioRemoveRTPExtensions = (sdp: string, extensionsToFilter: string[]): string => {\n// const endOfLine = '\\r\\n'\n// let beginLines: string[] = []\n// let audioLines: string[] = []\n// let videoLines: string[] = []\n// const newLines = sdp.split(endOfLine)\n// const offerAudioIndex = newLines.findIndex(_isAudioLine)\n// const offerVideoIndex = newLines.findIndex(_isVideoLine)\n// if (offerAudioIndex < offerVideoIndex) {\n// beginLines = newLines.slice(0, offerAudioIndex)\n// audioLines = newLines.slice(offerAudioIndex, offerVideoIndex)\n// videoLines = newLines.slice(offerVideoIndex, (newLines.length - 1))\n// } else {\n// beginLines = newLines.slice(0, offerVideoIndex)\n// audioLines = newLines.slice(offerAudioIndex, (newLines.length - 1))\n// videoLines = newLines.slice(offerVideoIndex, offerAudioIndex)\n// }\n// const newAudioLines = audioLines.filter((line: string) => {\n// return !(line.includes(extensionsToFilter[0]) || line.includes(extensionsToFilter[1]) || line.includes(extensionsToFilter[2]))\n// })\n// return [...beginLines, ...newAudioLines, ...videoLines, ''].join(endOfLine)\n// }\n// const sdpAudioRemoveRidMidExtHack = (sdp: string): string => {\n// const extensionsToFilter = [\n// 'urn:ietf:params:rtp-hdrext:sdes:mid',\n// 'urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id',\n// 'urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id',\n// ]\n// return sdpAudioRemoveRTPExtensions(sdp, extensionsToFilter)\n// }\n/**\n * Check for srflx, prflx or relay candidates\n * TODO: improve the logic check private/public IP for typ host\n *\n * @param sdp string\n * @returns boolean\n */\nexport const sdpHasValidCandidates = (sdp) => {\n try {\n const regex = /typ (?:srflx|prflx|relay)/;\n const sections = SDPUtils.getMediaSections(sdp);\n for (const section of sections) {\n const lines = SDPUtils.splitLines(section);\n const valid = lines.some((line) => {\n return line.indexOf('a=candidate') === 0 && regex.test(line);\n });\n if (!valid) {\n return false;\n }\n }\n return true;\n }\n catch (error) {\n getLogger().error('Error checking SDP', error);\n return false;\n }\n};\n/**\n * Remove \"a=candidate\" lines with local candidates\n * https://bloggeek.me/psa-mdns-and-local-ice-candidates-are-coming/\n */\nexport const sdpRemoveLocalCandidates = (sdp) => {\n const pattern = /^a=candidate.*.local\\ .*/;\n const endOfLine = '\\r\\n';\n return sdp\n .split(endOfLine)\n .filter((line) => !pattern.test(line))\n .join(endOfLine);\n};\n//# sourceMappingURL=sdpHelpers.js.map","import { getLogger, uuid } from '@signalwire/core';\nimport { getUserMedia, getMediaConstraints } from './utils/helpers';\nimport { sdpStereoHack, sdpBitrateHack, sdpMediaOrderHack, sdpHasValidCandidates, } from './utils/sdpHelpers';\nimport { sdpToJsonHack, RTCPeerConnection, streamIsValid, stopTrack, } from './utils';\nimport { watchRTCPeerMediaPackets } from './utils/watchRTCPeerMediaPackets';\nconst RESUME_TIMEOUT = 12000;\nexport default class RTCPeer {\n constructor(call, type) {\n this.call = call;\n this.type = type;\n this.uuid = uuid();\n this._negotiating = false;\n this._processingRemoteSDP = false;\n this._restartingIce = false;\n this.logger.debug('New Peer with type:', this.type, 'Options:', this.options);\n this._onIce = this._onIce.bind(this);\n this._onEndedTrackHandler = this._onEndedTrackHandler.bind(this);\n if (this.options.prevCallId) {\n this.uuid = this.options.prevCallId;\n }\n this.options.prevCallId = undefined;\n if (this.options.localStream && streamIsValid(this.options.localStream)) {\n this._localStream = this.options.localStream;\n }\n this.rtcConfigPolyfill = this.config;\n }\n get logger() {\n return getLogger();\n }\n get options() {\n return this.call.options;\n }\n get watchMediaPacketsTimeout() {\n var _a;\n return (_a = this.options.watchMediaPacketsTimeout) !== null && _a !== void 0 ? _a : 2000;\n }\n get localStream() {\n return this._localStream;\n }\n set localStream(stream) {\n this._localStream = stream;\n }\n get remoteStream() {\n return this._remoteStream;\n }\n get isOffer() {\n return this.type === 'offer';\n }\n get isAnswer() {\n return this.type === 'answer';\n }\n get isSimulcast() {\n return this.options.simulcast === true;\n }\n get isSfu() {\n return this.options.sfu === true;\n }\n get localVideoTrack() {\n const videoSender = this._getSenderByKind('video');\n return (videoSender === null || videoSender === void 0 ? void 0 : videoSender.track) || null;\n }\n get localAudioTrack() {\n const audioSender = this._getSenderByKind('audio');\n return (audioSender === null || audioSender === void 0 ? void 0 : audioSender.track) || null;\n }\n get remoteVideoTrack() {\n const videoReceiver = this._getReceiverByKind('video');\n return (videoReceiver === null || videoReceiver === void 0 ? void 0 : videoReceiver.track) || null;\n }\n get remoteAudioTrack() {\n const audioReceiver = this._getReceiverByKind('audio');\n return (audioReceiver === null || audioReceiver === void 0 ? void 0 : audioReceiver.track) || null;\n }\n get hasAudioSender() {\n return this._getSenderByKind('audio') ? true : false;\n }\n get hasVideoSender() {\n return this._getSenderByKind('video') ? true : false;\n }\n get hasAudioReceiver() {\n return this._getReceiverByKind('audio') ? true : false;\n }\n get hasVideoReceiver() {\n return this._getReceiverByKind('video') ? true : false;\n }\n get config() {\n const { rtcPeerConfig = {} } = this.options;\n const config = Object.assign({ bundlePolicy: 'max-compat', iceServers: this.call.iceServers, \n // @ts-ignore\n sdpSemantics: 'unified-plan' }, rtcPeerConfig);\n this.logger.debug('RTC config', config);\n return config;\n }\n get localSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.localDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get remoteSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.remoteDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get hasIceServers() {\n if (this.instance) {\n const { iceServers = [] } = this.getConfiguration();\n return Boolean(iceServers === null || iceServers === void 0 ? void 0 : iceServers.length);\n }\n return false;\n }\n stopTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to stop.`);\n }\n if (sender.track) {\n stopTrack(sender.track);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(sender.track);\n }\n }\n catch (error) {\n this.logger.error('RTCPeer stopTrackSender error', kind, error);\n }\n }\n async restoreTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to restore.`);\n }\n if (sender.track && sender.track.readyState !== 'ended') {\n return this.logger.info(`There is already an active ${kind} track.`);\n }\n const constraints = await getMediaConstraints(this.options);\n // @ts-ignore\n const stream = await getUserMedia({ [kind]: constraints[kind] });\n if (stream && streamIsValid(stream)) {\n const newTrack = stream.getTracks().find((t) => t.kind === kind);\n if (newTrack) {\n await sender.replaceTrack(newTrack);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.addTrack(newTrack);\n }\n }\n }\n catch (error) {\n this.logger.error('RTCPeer restoreTrackSender error', kind, error);\n }\n }\n getDeviceId(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n const { deviceId = null } = sender.track.getSettings();\n return deviceId;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceId error', kind, error);\n return null;\n }\n }\n getTrackSettings(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.getSettings();\n }\n catch (error) {\n this.logger.error('RTCPeer getTrackSettings error', kind, error);\n return null;\n }\n }\n getDeviceLabel(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.label;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceLabel error', kind, error);\n return null;\n }\n }\n restartIceWithRelayOnly() {\n try {\n if (this.isAnswer) {\n return this.logger.warn('Skip restartIceWithRelayOnly since we need to generate answer');\n }\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n return this.logger.warn('RTCPeer already with iceTransportPolicy relay only');\n }\n const newConfig = Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' });\n this.setConfiguration(newConfig);\n this.restartIce();\n }\n catch (error) {\n this.logger.error('restartIceWithRelayOnly', error);\n }\n }\n restartIce() {\n if (this._negotiating || this._restartingIce) {\n return this.logger.warn('Skip restartIce');\n }\n this._restartingIce = true;\n this.logger.debug('Restart ICE');\n // Type must be Offer to send reinvite.\n this.type = 'offer';\n // @ts-ignore\n this.instance.restartIce();\n }\n triggerResume() {\n this.logger.info('Probably half-open so force close from client');\n if (this._resumeTimer) {\n this.logger.info('[skipped] Already in \"resume\" state');\n return;\n }\n // @ts-expect-error\n this.call.emit('media.disconnected');\n // @ts-expect-error\n this.call.emit('media.reconnecting');\n this.clearTimers();\n this._resumeTimer = setTimeout(() => {\n this.logger.warn('Disconnecting due to RECONNECTION_ATTEMPT_TIMEOUT');\n // @ts-expect-error\n this.call.emit('media.disconnected');\n this.call.leaveReason = 'RECONNECTION_ATTEMPT_TIMEOUT';\n this.call.setState('hangup');\n }, RESUME_TIMEOUT); // TODO: read from call verto.invite response\n this.call._closeWSConnection();\n }\n resetNeedResume() {\n this.clearResumeTimer();\n if (this.options.watchMediaPackets) {\n this.startWatchMediaPackets();\n }\n }\n stopWatchMediaPackets() {\n if (this._mediaWatcher) {\n this._mediaWatcher.stop();\n }\n }\n startWatchMediaPackets() {\n var _a;\n this.stopWatchMediaPackets();\n this._mediaWatcher = watchRTCPeerMediaPackets(this);\n (_a = this._mediaWatcher) === null || _a === void 0 ? void 0 : _a.start();\n }\n async applyMediaConstraints(kind, constraints) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return this.logger.info('No sender to apply constraints', kind, constraints);\n }\n if (sender.track.readyState === 'live') {\n const newConstraints = Object.assign(Object.assign({}, sender.track.getConstraints()), constraints);\n const deviceId = this.getDeviceId(kind);\n if (deviceId && !this.options.screenShare) {\n newConstraints.deviceId = { exact: deviceId };\n }\n this.logger.info(`Apply ${kind} constraints`, this.call.id, newConstraints);\n await sender.track.applyConstraints(newConstraints);\n }\n }\n catch (error) {\n this.logger.error('Error applying constraints', kind, constraints);\n }\n }\n _getSenderByKind(kind) {\n if (!this.instance.getSenders) {\n this.logger.warn('RTCPeerConnection.getSenders() not available.');\n return null;\n }\n return this.instance\n .getSenders()\n .find(({ track }) => track && track.kind === kind);\n }\n _getReceiverByKind(kind) {\n if (!this.instance.getReceivers) {\n this.logger.warn('RTCPeerConnection.getReceivers() not available.');\n return null;\n }\n return this.instance\n .getReceivers()\n .find(({ track }) => track && track.kind === kind);\n }\n async startNegotiation(force = false) {\n var _a, _b;\n if (this._negotiating) {\n return this.logger.warn('Skip twice onnegotiationneeded!');\n }\n this._negotiating = true;\n try {\n /**\n * additionalDevice and screenShare are `sendonly`\n */\n if (this.options.additionalDevice || this.options.screenShare) {\n (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === null || _b === void 0 ? void 0 : _b.call(_a).forEach((tr) => {\n tr.direction = 'sendonly';\n });\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n this.instance.addEventListener('icecandidate', this._onIce);\n if (this.isOffer) {\n this.logger.debug('Trying to generate offer');\n const offerOptions = {\n /**\n * While this property is deprected, on Browsers where this\n * is still supported this avoids conflicting with the VAD\n * server-side\n */\n // @ts-ignore\n voiceActivityDetection: false,\n };\n if (!this._supportsAddTransceiver()) {\n offerOptions.offerToReceiveAudio = this.options.negotiateAudio;\n offerOptions.offerToReceiveVideo = this.options.negotiateVideo;\n }\n const offer = await this.instance.createOffer(offerOptions);\n await this._setLocalDescription(offer);\n }\n if (this.isAnswer) {\n this.logger.debug('Trying to generate answer');\n await this._setRemoteDescription({\n sdp: this.options.remoteSdp,\n type: 'offer',\n });\n const answer = await this.instance.createAnswer({\n // Same as above.\n // @ts-ignore\n voiceActivityDetection: false,\n });\n await this._setLocalDescription(answer);\n }\n /**\n * ReactNative Workaround\n */\n if (force) {\n this._sdpReady();\n }\n this.logger.info('iceGatheringState', this.instance.iceGatheringState);\n if (this.instance.iceGatheringState === 'gathering') {\n this._iceTimeout = setTimeout(() => {\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n }\n catch (error) {\n this.logger.error(`Error creating ${this.type}:`, error);\n }\n }\n onRemoteBye({ code, message }) {\n var _a;\n // It could be a negotiation/signaling error so reject the \"startMethod\"\n (_a = this._rejectStartMethod) === null || _a === void 0 ? void 0 : _a.call(this, {\n code,\n message,\n });\n this.stop();\n }\n async onRemoteSdp(sdp) {\n if (this._processingRemoteSDP ||\n (this.remoteSdp && this.remoteSdp === sdp)) {\n this.logger.warn('Ignore same remote SDP', sdp);\n return;\n }\n try {\n this._processingRemoteSDP = true;\n const type = this.isOffer ? 'answer' : 'offer';\n await this._setRemoteDescription({ sdp, type });\n this._processingRemoteSDP = false;\n /**\n * Resolve the start() method only for Offer because for Answer\n * we need to reply to the server and wait for the signaling.\n */\n if (this.isOffer) {\n this._resolveStartMethod();\n }\n this.resetNeedResume();\n }\n catch (error) {\n this.logger.error(`Error handling remote SDP on call ${this.call.id}:`, error);\n this.call.hangup();\n this._rejectStartMethod(error);\n }\n }\n _setupRTCPeerConnection() {\n if (!this.instance) {\n this.instance = RTCPeerConnection(this.config);\n this._attachListeners();\n }\n }\n async start() {\n return new Promise(async (resolve, reject) => {\n this._resolveStartMethod = resolve;\n this._rejectStartMethod = reject;\n try {\n this._localStream = await this._retrieveLocalStream();\n }\n catch (error) {\n this._rejectStartMethod(error);\n return this.call.setState('hangup');\n }\n /**\n * We need to defer the creation of RTCPeerConnection\n * until we gain gUM access otherwise it will have\n * private IP addresses in ICE host candidates\n * replaced by an mDNS hostname\n * @see https://groups.google.com/g/discuss-webrtc/c/6stQXi72BEU?pli=1\n */\n this._setupRTCPeerConnection();\n let hasLocalTracks = false;\n if (this._localStream && streamIsValid(this._localStream)) {\n const audioTracks = this._localStream.getAudioTracks();\n this.logger.debug('Local audio tracks: ', audioTracks);\n const videoTracks = this._localStream.getVideoTracks();\n this.logger.debug('Local video tracks: ', videoTracks);\n hasLocalTracks = Boolean(audioTracks.length || videoTracks.length);\n // TODO: use transceivers way only for offer - when answer gotta match mid from the ones from SRD\n if (this.isOffer &&\n typeof this.instance.addTransceiver === 'function') {\n const audioTransceiverParams = {\n direction: this.options.negotiateAudio ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n this.logger.debug('Applying audioTransceiverParams', audioTransceiverParams);\n audioTracks.forEach((track) => {\n this.instance.addTransceiver(track, audioTransceiverParams);\n });\n const videoTransceiverParams = {\n direction: this.options.negotiateVideo ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n if (this.isSimulcast) {\n const rids = ['0', '1', '2'];\n videoTransceiverParams.sendEncodings = rids.map((rid) => ({\n active: true,\n rid: rid,\n scaleResolutionDownBy: Number(rid) * 6 || 1.0,\n }));\n }\n this.logger.debug('Applying videoTransceiverParams', videoTransceiverParams);\n videoTracks.forEach((track) => {\n this.instance.addTransceiver(track, videoTransceiverParams);\n });\n if (this.isSfu) {\n const { msStreamsNumber = 5 } = this.options;\n this.logger.debug('Add ', msStreamsNumber, 'recvonly MS Streams');\n videoTransceiverParams.direction = 'recvonly';\n for (let i = 0; i < Number(msStreamsNumber); i++) {\n this.instance.addTransceiver('video', videoTransceiverParams);\n }\n }\n }\n else if (typeof this.instance.addTrack === 'function') {\n // Use addTrack\n // To avoid TS complains in forEach\n const stream = this._localStream;\n audioTracks.forEach((track) => this.instance.addTrack(track, stream));\n videoTracks.forEach((track) => this.instance.addTrack(track, stream));\n }\n else {\n // Fallback to legacy addStream ..\n // @ts-ignore\n this.instance.addStream(this._localStream);\n }\n }\n if (this.isOffer) {\n if (this.options.negotiateAudio) {\n this._checkMediaToNegotiate('audio');\n }\n if (this.options.negotiateVideo) {\n this._checkMediaToNegotiate('video');\n }\n /**\n * If it does not support unified-plan stuff (senders/receivers/transceivers)\n * invoke manually startNegotiation and use the RTCOfferOptions\n */\n if (!this._supportsAddTransceiver() && !hasLocalTracks) {\n this.startNegotiation();\n }\n }\n else {\n this.startNegotiation();\n }\n });\n }\n detachAndStop() {\n var _a;\n if (typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === 'function') {\n this.instance.getTransceivers().forEach((transceiver) => {\n // Do not use `stopTrack` util to not dispatch the `ended` event\n if (transceiver.sender.track) {\n transceiver.sender.track.stop();\n }\n if (transceiver.receiver.track) {\n transceiver.receiver.track.stop();\n }\n });\n }\n this.stop();\n }\n stop() {\n var _a, _b, _c;\n // Do not use `stopTrack` util to not dispatch the `ended` event\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());\n (_b = this._remoteStream) === null || _b === void 0 ? void 0 : _b.getTracks().forEach((track) => track.stop());\n (_c = this.instance) === null || _c === void 0 ? void 0 : _c.close();\n this.stopWatchMediaPackets();\n }\n _supportsAddTransceiver() {\n return typeof this.instance.addTransceiver === 'function';\n }\n _checkMediaToNegotiate(kind) {\n // addTransceiver of 'kind' if not present\n const sender = this._getSenderByKind(kind);\n if (!sender && this._supportsAddTransceiver()) {\n const transceiver = this.instance.addTransceiver(kind, {\n direction: 'recvonly',\n });\n this.logger.debug('Add transceiver', kind, transceiver);\n }\n }\n async _sdpReady() {\n clearTimeout(this._iceTimeout);\n if (!this.instance.localDescription) {\n this.logger.error('Missing localDescription', this.instance);\n return;\n }\n const { sdp } = this.instance.localDescription;\n if (sdp.indexOf('candidate') === -1) {\n this.logger.debug('No candidate - retry \\n');\n this.startNegotiation(true);\n return;\n }\n if (!this._sdpIsValid()) {\n this.logger.info('SDP ready but not valid');\n this._onIceTimeout();\n return;\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n try {\n await this.call.onLocalSDPReady(this);\n if (this.isAnswer) {\n this._resolveStartMethod();\n }\n }\n catch (error) {\n this._rejectStartMethod(error);\n }\n }\n _sdpIsValid() {\n if (this.localSdp && this.hasIceServers) {\n return sdpHasValidCandidates(this.localSdp);\n }\n return Boolean(this.localSdp);\n }\n _forceNegotiation() {\n this.logger.info('Force negotiation again');\n this._negotiating = false;\n this.startNegotiation();\n }\n _onIceTimeout() {\n if (this._sdpIsValid()) {\n this._sdpReady();\n return;\n }\n this.logger.info('ICE gathering timeout');\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n this.logger.info('RTCPeer already with \"iceTransportPolicy: relay\"');\n this._rejectStartMethod({\n code: 'ICE_GATHERING_FAILED',\n message: 'Ice gathering timeout',\n });\n this.call.setState('destroy');\n return;\n }\n this.setConfiguration(Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' }));\n this._forceNegotiation();\n }\n _onIce(event) {\n /**\n * Clear _iceTimeout on each single candidate\n */\n if (this._iceTimeout) {\n clearTimeout(this._iceTimeout);\n }\n /**\n * Following spec: no candidate means the gathering is completed.\n */\n if (!event.candidate) {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n return;\n }\n this.logger.debug('RTCPeer Candidate:', event.candidate);\n if (event.candidate.type === 'host') {\n /**\n * With `host` candidate set timeout to\n * maxIceGatheringTimeout and then invoke\n * _onIceTimeout to check if the SDP is valid\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n else {\n /**\n * With `srflx`, `prflx` or `relay` candidates\n * set timeout to iceGatheringTimeout and then invoke\n * _sdpReady since at least one candidate is valid.\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n }, this.options.iceGatheringTimeout);\n }\n }\n _setLocalDescription(localDescription) {\n const { useStereo, googleMaxBitrate, googleMinBitrate, googleStartBitrate, } = this.options;\n if (localDescription.sdp && useStereo) {\n localDescription.sdp = sdpStereoHack(localDescription.sdp);\n }\n if (localDescription.sdp &&\n googleMaxBitrate &&\n googleMinBitrate &&\n googleStartBitrate) {\n localDescription.sdp = sdpBitrateHack(localDescription.sdp, googleMaxBitrate, googleMinBitrate, googleStartBitrate);\n }\n // this.logger.debug(\n // 'LOCAL SDP \\n',\n // `Type: ${localDescription.type}`,\n // '\\n\\n',\n // localDescription.sdp\n // )\n return this.instance.setLocalDescription(localDescription);\n }\n _setRemoteDescription(remoteDescription) {\n if (remoteDescription.sdp && this.options.useStereo) {\n remoteDescription.sdp = sdpStereoHack(remoteDescription.sdp);\n }\n if (remoteDescription.sdp && this.instance.localDescription) {\n remoteDescription.sdp = sdpMediaOrderHack(remoteDescription.sdp, this.instance.localDescription.sdp);\n }\n const sessionDescr = sdpToJsonHack(remoteDescription);\n this.logger.debug('REMOTE SDP \\n', `Type: ${remoteDescription.type}`, '\\n\\n', remoteDescription.sdp);\n return this.instance.setRemoteDescription(sessionDescr);\n }\n async _retrieveLocalStream() {\n if (streamIsValid(this.options.localStream)) {\n return this.options.localStream;\n }\n const constraints = await getMediaConstraints(this.options);\n return getUserMedia(constraints);\n }\n _attachListeners() {\n this.instance.addEventListener('signalingstatechange', () => {\n this.logger.debug('signalingState:', this.instance.signalingState);\n switch (this.instance.signalingState) {\n case 'stable':\n // Workaround to skip nested negotiations\n // Chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=740501\n this._negotiating = false;\n this._restartingIce = false;\n this.resetNeedResume();\n if (this.instance.connectionState === 'connected') {\n // An ice restart won't change the connectionState so we emit the same event in here\n // since the signalingState is \"stable\" again.\n this.emitMediaConnected();\n }\n break;\n case 'have-local-offer': {\n if (this.instance.iceGatheringState === 'complete') {\n this._sdpReady();\n }\n break;\n }\n // case 'have-remote-offer': {}\n case 'closed':\n // @ts-ignore\n delete this.instance;\n break;\n default:\n this._negotiating = true;\n }\n });\n this.instance.addEventListener('connectionstatechange', () => {\n this.logger.debug('connectionState:', this.instance.connectionState);\n switch (this.instance.connectionState) {\n // case 'new':\n // break\n case 'connecting':\n this._connectionStateTimer = setTimeout(() => {\n this.logger.warn('connectionState timed out');\n this.restartIceWithRelayOnly();\n }, this.options.maxConnectionStateTimeout);\n break;\n case 'connected':\n this.clearConnectionStateTimer();\n this.emitMediaConnected();\n break;\n // case 'closed':\n // break\n case 'disconnected':\n this.logger.debug('[test] Prevent reattach!');\n break;\n case 'failed': {\n this.triggerResume();\n break;\n }\n }\n });\n this.instance.addEventListener('negotiationneeded', () => {\n this.logger.debug('Negotiation needed event');\n this.startNegotiation();\n });\n this.instance.addEventListener('iceconnectionstatechange', () => {\n this.logger.debug('iceConnectionState:', this.instance.iceConnectionState);\n });\n this.instance.addEventListener('icegatheringstatechange', () => {\n this.logger.debug('iceGatheringState:', this.instance.iceGatheringState);\n });\n // this.instance.addEventListener('icecandidateerror', (event) => {\n // this.logger.warn('IceCandidate Error:', event)\n // })\n this.instance.addEventListener('track', (event) => {\n // @ts-expect-error\n this.call.emit('track', event);\n if (this.isSfu) {\n // const notification = { type: 'trackAdd', event }\n // this.call._dispatchNotification(notification)\n }\n this._remoteStream = event.streams[0];\n });\n // @ts-ignore\n this.instance.addEventListener('addstream', (event) => {\n if (event.stream) {\n this._remoteStream = event.stream;\n }\n });\n this._attachAudioTrackListener();\n this._attachVideoTrackListener();\n }\n clearTimers() {\n this.clearResumeTimer();\n this.clearWatchMediaPacketsTimer();\n this.clearConnectionStateTimer();\n }\n clearConnectionStateTimer() {\n clearTimeout(this._connectionStateTimer);\n }\n clearWatchMediaPacketsTimer() {\n clearTimeout(this._watchMediaPacketsTimer);\n }\n clearResumeTimer() {\n clearTimeout(this._resumeTimer);\n this._resumeTimer = undefined;\n }\n emitMediaConnected() {\n // @ts-expect-error\n this.call.emit('media.connected');\n }\n _onEndedTrackHandler(event) {\n const mediaTrack = event.target;\n const evt = mediaTrack.kind === 'audio' ? 'microphone' : 'camera';\n // @ts-expect-error\n this.call.emit(`${evt}.disconnected`, {\n deviceId: mediaTrack.id,\n label: mediaTrack.label,\n });\n }\n _attachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _attachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local `rtcConfigPolyfill` object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration#parameters\n */\n setConfiguration(config) {\n var _a;\n this.rtcConfigPolyfill = config;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.setConfiguration) === 'function') {\n this.instance.setConfiguration(config);\n }\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local config object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/getConfiguration\n */\n getConfiguration() {\n var _a;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getConfiguration) === 'function') {\n return this.instance.getConfiguration();\n }\n return this.rtcConfigPolyfill || this.config;\n }\n}\n//# sourceMappingURL=RTCPeer.js.map","import { getLogger } from '@signalwire/core';\nexport const watchRTCPeerMediaPackets = (rtcPeer) => {\n if (!rtcPeer.hasAudioReceiver && !rtcPeer.hasVideoReceiver) {\n getLogger().warn(`Missing receivers to inspect media for RTCPeer \"${rtcPeer.uuid}\"`);\n return;\n }\n getLogger().debug(`Start watching media for RTCPeer \"${rtcPeer.uuid}\"`);\n let previousAudioValue = 0;\n let previousVideoValue = 0;\n let run = true;\n let timer;\n const clearTimer = () => {\n clearTimeout(timer);\n };\n const meter = async () => {\n var _a, _b;\n let audioPacketsReceived = 0;\n let videoPacketsReceived = 0;\n try {\n const stats = await rtcPeer.instance.getStats(null);\n const audioTrackId = (_a = rtcPeer.remoteAudioTrack) === null || _a === void 0 ? void 0 : _a.id;\n const videoTrackId = (_b = rtcPeer.remoteVideoTrack) === null || _b === void 0 ? void 0 : _b.id;\n stats.forEach((report) => {\n if (report.type === 'inbound-rtp' &&\n report.kind === 'audio' &&\n report.trackIdentifier === audioTrackId) {\n getLogger().trace(`audio inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n audioPacketsReceived = report.packetsReceived;\n }\n if (report.type === 'inbound-rtp' &&\n report.kind === 'video' &&\n report.trackIdentifier === videoTrackId) {\n getLogger().trace(`video inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n videoPacketsReceived = report.packetsReceived;\n }\n });\n }\n catch (error) {\n getLogger().warn('getStats error', error);\n }\n finally {\n const noAudioChanged = audioPacketsReceived && audioPacketsReceived <= previousAudioValue;\n const noVideoChanged = videoPacketsReceived && videoPacketsReceived <= previousVideoValue;\n if (noAudioChanged && noVideoChanged) {\n getLogger().warn(`audioPacketsReceived: ${audioPacketsReceived} - previousAudioValue: ${previousAudioValue}`);\n getLogger().warn(`videoPacketsReceived: ${videoPacketsReceived} - previousVideoValue: ${previousVideoValue}`);\n rtcPeer.triggerResume();\n }\n else {\n previousAudioValue = audioPacketsReceived !== null && audioPacketsReceived !== void 0 ? audioPacketsReceived : previousAudioValue;\n previousVideoValue = videoPacketsReceived !== null && videoPacketsReceived !== void 0 ? videoPacketsReceived : previousVideoValue;\n clearTimer();\n if (run && rtcPeer.instance.connectionState !== 'closed') {\n timer = setTimeout(() => meter(), rtcPeer.watchMediaPacketsTimeout);\n }\n }\n }\n };\n return {\n start: () => {\n clearTimer();\n meter();\n },\n stop: () => {\n run = false;\n clearTimer();\n },\n };\n};\n//# sourceMappingURL=watchRTCPeerMediaPackets.js.map","import { __rest } from \"tslib\";\nimport { getLogger, sagaEffects, VertoResult, VertoPong, isWebrtcEventType, sagaHelpers, componentActions, } from '@signalwire/core';\nconst isWebrtcAction = (action) => {\n return isWebrtcEventType(action.type);\n};\nexport const vertoEventWorker = function* (options) {\n getLogger().debug('vertoEventWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const worker = function* (action) {\n var _a, _b;\n const { id: jsonrpcId, method, params = {} } = action.payload;\n const { callID, nodeId } = params;\n const peer = instance.getRTCPeerById(callID);\n if (!peer) {\n getLogger().warn(`RTCPeer '${callID}' not found for method: '${method}'`, params);\n return;\n }\n const activeRTCPeer = instance.peer;\n // getLogger().warn('vertoEventWorker', method, params)\n switch (method) {\n case 'verto.media':\n case 'verto.answer': {\n /**\n * verto.media and verto.answer share the same logic\n *\n * Always invoke peer.onRemoteSdp(params.sdp) on the proper RTCPeer\n * If the `params.callID` is the current ACTIVE peer, set the BaseConnection state to 'early' | 'active'\n * If the `params.callID` is NOT the current peer just setup the media (ie: promote/demote)\n */\n if (peer.uuid === (activeRTCPeer === null || activeRTCPeer === void 0 ? void 0 : activeRTCPeer.uuid)) {\n const state = method === 'verto.media' ? 'early' : 'active';\n instance.setState(state);\n }\n if (params === null || params === void 0 ? void 0 : params.sdp) {\n peer.onRemoteSdp(params.sdp);\n }\n yield sagaEffects.put(componentActions.upsert({\n id: (_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID,\n nodeId: (_b = action.payload.params) === null || _b === void 0 ? void 0 : _b.nodeId,\n }));\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.bye': {\n /**\n * If the `params.callID` is the current ACTIVE peer, stop everything and destroy the BaseConnection\n * If the `params.callID` is NOT the current peer, but is there from promote/demote process stop/destroy just the peer\n */\n yield sagaEffects.call([instance, instance.onVertoBye], {\n rtcPeerId: callID,\n byeCause: params === null || params === void 0 ? void 0 : params.cause,\n byeCauseCode: params === null || params === void 0 ? void 0 : params.causeCode,\n redirectDestination: params === null || params === void 0 ? void 0 : params.redirectDestination,\n });\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.ping': {\n // Remove nodeId from params\n const { nodeId } = params, pongParams = __rest(params, [\"nodeId\"]);\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoPong(pongParams),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.mediaParams': {\n if (!callID || !params.mediaParams) {\n getLogger().warn(`Invalid mediaParams event`, params);\n break;\n }\n const { audio, video } = params.mediaParams;\n if (peer && video) {\n peer.applyMediaConstraints('video', video);\n }\n if (peer && audio) {\n peer.applyMediaConstraints('audio', audio);\n }\n break;\n }\n case 'verto.display': {\n /** Call is active so set the RTCPeer */\n instance.setActiveRTCPeer(rtcPeerId);\n instance.emit('verto.display', action.payload.params);\n break;\n }\n default:\n return getLogger().warn(`Unknown Verto method: ${method}`, params);\n }\n };\n const catchableWorker = sagaHelpers.createCatchableSaga(worker, (error) => {\n getLogger().error('Verto Error', error);\n });\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n var _a;\n if (isWebrtcAction(action)) {\n return ((_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID) === rtcPeerId;\n }\n return false;\n });\n yield sagaEffects.fork(catchableWorker, action);\n }\n getLogger().trace('vertoEventWorker ended');\n};\n//# sourceMappingURL=vertoEventWorker.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { getLogger, sagaEffects, componentActions, Rooms, } from '@signalwire/core';\nexport const roomSubscribedWorker = function* (options) {\n getLogger().debug('roomSubscribedWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.room.subscribed') {\n return action.payload.call_id === rtcPeerId;\n }\n return false;\n });\n // New emitter should not change the payload by reference\n const clonedPayload = JSON.parse(JSON.stringify(action.payload));\n /**\n * In here we joined a room_session so we can swap between RTCPeers\n */\n instance.setActiveRTCPeer(rtcPeerId);\n /**\n * TODO: Replace the redux action/component with properties on RTCPeer instance?\n */\n yield sagaEffects.put(componentActions.upsert({\n id: action.payload.call_id,\n roomId: action.payload.room_session.room_id,\n roomSessionId: action.payload.room_session.id,\n memberId: action.payload.member_id,\n previewUrl: action.payload.room_session.preview_url,\n }));\n instance.emit('room.joined', transformPayload.call(instance, clonedPayload));\n getLogger().debug('roomSubscribedWorker ended', rtcPeerId);\n};\nfunction transformPayload(payload) {\n const keys = ['room_session', 'room'];\n keys.forEach((key) => {\n if (payload[key].recordings) {\n payload[key].recordings = (payload[key].recordings || []).map((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n },\n });\n }\n else {\n recordingInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n });\n }\n this.instanceMap.set(recording.id, recordingInstance);\n return recordingInstance;\n });\n }\n if (payload[key].playbacks) {\n payload[key].playbacks = (payload[key].playbacks || []).map((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n },\n });\n }\n else {\n playbackInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n });\n }\n this.instanceMap.set(playback.id, playbackInstance);\n return playbackInstance;\n });\n }\n if (payload[key].streams) {\n payload[key].streams = (payload[key].streams || []).map((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n },\n });\n }\n else {\n streamInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n });\n }\n this.instanceMap.set(stream.id, streamInstance);\n return streamInstance;\n });\n }\n });\n return payload;\n}\n//# sourceMappingURL=roomSubscribedWorker.js.map","import { getLogger, sagaEffects, sessionActions, selectors, } from '@signalwire/core';\nexport const promoteDemoteWorker = function* (options) {\n getLogger().debug('promoteDemoteWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for promoteDemoteWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.member.promoted' ||\n action.type === 'video.member.demoted') {\n return action.payload.member_id === instance.memberId;\n }\n return false;\n });\n getLogger().debug('promoteDemoteWorker:', action.type, action.payload);\n yield sagaEffects.put(sessionActions.updateAuthState(action.payload.authorization));\n const authState = yield sagaEffects.select(selectors.getAuthState);\n if (!authState) {\n throw new Error(`Invalid authState for '${action.type}'`);\n }\n // TODO: use the new getJoinMediaParams in here\n const { audio_allowed, video_allowed } = authState;\n switch (action.type) {\n case 'video.member.promoted':\n /**\n * Promote means enable the media allowed and keep the\n * same recv settings. (do not force recv media)\n */\n instance.updateMediaOptions({\n audio: audio_allowed === 'both',\n video: video_allowed === 'both',\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n case 'video.member.demoted':\n /**\n * Demote means force recvonly and receive only the media allowed.\n */\n instance.updateMediaOptions({\n audio: false,\n video: false,\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n }\n instance._triggerNewRTCPeer();\n getLogger().debug('promoteDemoteWorker ended', rtcPeerId);\n};\n//# sourceMappingURL=promoteDemoteWorker.js.map","import { getLogger, sagaEffects, actions, } from '@signalwire/core';\nexport const sessionAuthWorker = function* (options) {\n getLogger().debug('sessionAuthWorker started');\n const { instance } = options;\n const action = yield sagaEffects.take([\n actions.authSuccessAction.type,\n actions.authErrorAction.type,\n ]);\n switch (action.type) {\n case actions.authSuccessAction.type:\n yield sagaEffects.call([instance, instance.resume]);\n break;\n case actions.authErrorAction.type:\n yield sagaEffects.call([instance, instance.setState], 'hangup');\n break;\n }\n getLogger().debug('sessionAuthWorker ended');\n};\n//# sourceMappingURL=sessionAuthWorker.js.map","import { VertoBye, VertoInfo, VertoInvite, BaseComponent, selectors, VertoModify, componentSelectors, actions, isSATAuth, \n// VertoAttach,\nVertoAnswer, } from '@signalwire/core';\nimport RTCPeer from './RTCPeer';\nimport { stopTrack, getUserMedia, streamIsValid } from './utils';\nimport { sdpRemoveLocalCandidates } from './utils/sdpHelpers';\nimport * as workers from './workers';\nconst INVITE_VERSION = 1000;\nconst AUDIO_CONSTRAINTS = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n};\nconst AUDIO_CONSTRAINTS_SCREENSHARE = Object.assign(Object.assign({}, AUDIO_CONSTRAINTS), { noiseSuppression: false, autoGainControl: false, \n // @ts-expect-error\n googAutoGainControl: false });\nconst VIDEO_CONSTRAINTS = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n};\nconst DEFAULT_CALL_OPTIONS = {\n destinationNumber: 'room',\n remoteCallerName: 'Outbound Call',\n remoteCallerNumber: '',\n callerName: '',\n callerNumber: '',\n audio: AUDIO_CONSTRAINTS,\n video: VIDEO_CONSTRAINTS,\n useStereo: false,\n attach: false,\n screenShare: false,\n additionalDevice: false,\n userVariables: {},\n requestTimeout: 10 * 1000,\n autoApplyMediaParams: true,\n iceGatheringTimeout: 2 * 1000,\n maxIceGatheringTimeout: 5 * 1000,\n maxConnectionStateTimeout: 3 * 1000,\n watchMediaPackets: true,\n watchMediaPacketsTimeout: 2 * 1000,\n};\nexport class BaseConnection extends BaseComponent {\n constructor(options) {\n super(options);\n /** @internal */\n this.leaveReason = undefined;\n /** @internal */\n this.gotEarly = false;\n /** @internal */\n this.doReinvite = false;\n this.state = 'new';\n this.prevState = 'new';\n this.rtcPeerMap = new Map();\n this.resuming = false;\n /** @internal */\n this.onVertoBye = (params) => {\n this.logger.debug('onVertoBye', params);\n const { rtcPeerId, byeCause = 'NORMAL_CLEARING', byeCauseCode = '16', redirectDestination, } = params;\n this.cause = String(byeCause);\n this.causeCode = String(byeCauseCode);\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer) {\n return this.logger.warn('Invalid RTCPeer to hangup', params);\n }\n if (redirectDestination && rtcPeer.localSdp) {\n this.logger.debug('Redirect Destination to:', redirectDestination, 'for RTCPeer:', rtcPeer.uuid);\n // Force nodeId to redirectDestination\n this.executeInvite(rtcPeer.localSdp, rtcPeer.uuid, redirectDestination);\n return;\n }\n // Notify RTCPeer for the bad signaling error\n rtcPeer.onRemoteBye({ code: this.causeCode, message: this.cause });\n // Set state to hangup only if the rtcPeer is the current one\n if (this.activeRTCPeerId === (rtcPeer === null || rtcPeer === void 0 ? void 0 : rtcPeer.uuid)) {\n this.logger.debug('onVertoBye go hangup');\n this.setState('hangup');\n }\n };\n this.options = Object.assign(Object.assign({}, DEFAULT_CALL_OPTIONS), options);\n this._checkDefaultMediaConstraints();\n this.setState('new');\n this.logger.trace('New Call with Options:', this.options);\n this._initPeer();\n }\n get id() {\n return this.__uuid;\n }\n get active() {\n return this.state === 'active';\n }\n get trying() {\n return this.state === 'trying';\n }\n get memberId() {\n // @ts-expect-error\n return this.component.memberId;\n }\n get previewUrl() {\n // @ts-expect-error\n return this.component.previewUrl;\n }\n get roomId() {\n // @ts-expect-error\n return this.component.roomId;\n }\n get roomSessionId() {\n // @ts-expect-error\n return this.component.roomSessionId;\n }\n get nodeId() {\n // @ts-expect-error\n return this.component.nodeId || this.options.nodeId;\n }\n get callId() {\n var _a;\n return ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.uuid) || '';\n }\n get localStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.localStream;\n }\n set localStream(stream) {\n if (this.peer) {\n this.peer.localStream = stream;\n }\n }\n get remoteStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.remoteStream;\n }\n get iceServers() {\n var _a, _b;\n return (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.iceServers) !== null && _b !== void 0 ? _b : this.select(selectors.getIceServers);\n }\n get component() {\n return (this.select((state) => componentSelectors.getComponent(state, this.callId)) || {});\n }\n /** @internal */\n dialogParams(rtcPeerId) {\n const { destinationNumber, attach, callerName, callerNumber, remoteCallerName, remoteCallerNumber, userVariables, screenShare, additionalDevice, pingSupported = true, } = this.options;\n return {\n dialogParams: {\n id: rtcPeerId,\n destinationNumber,\n attach,\n callerName,\n callerNumber,\n remoteCallerName,\n remoteCallerNumber,\n userVariables,\n screenShare,\n additionalDevice,\n pingSupported,\n version: INVITE_VERSION,\n },\n };\n }\n get cameraId() {\n return this.peer ? this.peer.getDeviceId('video') : null;\n }\n get cameraLabel() {\n return this.peer ? this.peer.getDeviceLabel('video') : null;\n }\n get microphoneId() {\n return this.peer ? this.peer.getDeviceId('audio') : null;\n }\n get microphoneLabel() {\n return this.peer ? this.peer.getDeviceLabel('audio') : null;\n }\n /** @internal */\n get withAudio() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasAudioReceiver);\n }\n /** @internal */\n get withVideo() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasVideoReceiver);\n }\n get localVideoTrack() {\n return this.peer ? this.peer.localVideoTrack : null;\n }\n get localAudioTrack() {\n return this.peer ? this.peer.localAudioTrack : null;\n }\n get peer() {\n return this.getRTCPeerById(this.activeRTCPeerId);\n }\n set peer(rtcPeer) {\n if (!rtcPeer) {\n this.logger.warn('Invalid RTCPeer', rtcPeer);\n return;\n }\n this.logger.debug('Set RTCPeer', rtcPeer.uuid, rtcPeer);\n this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n if (this.peer && this.peer.instance && this.callId !== rtcPeer.uuid) {\n const oldPeerId = this.peer.uuid;\n this.logger.debug('>>> Stop old RTCPeer', oldPeerId);\n // Hangup the previous RTCPeer\n this.hangup(oldPeerId).catch(console.error);\n this.peer.detachAndStop();\n // Remove RTCPeer from local cache to stop answering to ping/pong\n // this.rtcPeerMap.delete(oldPeerId)\n }\n this.logger.debug('>>> Replace RTCPeer with', rtcPeer.uuid);\n this.activeRTCPeerId = rtcPeer.uuid;\n }\n getRTCPeerById(rtcPeerId) {\n return this.rtcPeerMap.get(rtcPeerId);\n }\n appendRTCPeer(rtcPeer) {\n return this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n }\n setActiveRTCPeer(rtcPeerId) {\n this.peer = this.getRTCPeerById(rtcPeerId);\n }\n setLocalStream(stream) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.peer || !this.localStream) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!streamIsValid(stream)) {\n return reject(new Error('Invalid stream provided.'));\n }\n const prevAudioTracks = this.localStream.getAudioTracks();\n const newAudioTracks = stream.getAudioTracks();\n if (newAudioTracks.length <= 0) {\n this.logger.info('No audio track found in the stream provided. Audio will be unaffected.');\n }\n else {\n prevAudioTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newAudioTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n const prevVideoTracks = this.localStream.getVideoTracks();\n const newVideoTracks = stream.getVideoTracks();\n if (newVideoTracks.length <= 0) {\n this.logger.info('No video track found in the stream provided. Video will be unaffected.');\n }\n else {\n prevVideoTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newVideoTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n await this.updateStream(this.localStream);\n this.logger.debug('setLocalStream done');\n resolve(this.localStream);\n }\n catch (error) {\n this.logger.error('setLocalStream', error);\n reject(error);\n }\n });\n }\n /**\n * @internal\n * Verto messages have to be wrapped into an execute\n * request and sent using the proper RPC WebRTCMethod.\n */\n vertoExecute(params) {\n return this.execute({\n method: this._getRPCMethod(),\n params,\n });\n }\n /** @internal */\n _getRPCMethod() {\n const authState = this.select(selectors.getAuthState);\n if (authState && isSATAuth(authState)) {\n return 'webrtc.verto';\n }\n return 'video.message';\n }\n /** @internal */\n async _triggerNewRTCPeer() {\n this.logger.debug('_triggerNewRTCPeer Start');\n try {\n this.logger.debug('Build a new RTCPeer');\n const rtcPeer = this._buildPeer('offer');\n this.logger.debug('Trigger start for the new RTCPeer!');\n await rtcPeer.start();\n }\n catch (error) {\n this.logger.error('Error building new RTCPeer to promote/demote', error);\n }\n }\n updateCamera(constraints) {\n return this.updateConstraints({\n video: Object.assign({ aspectRatio: 16 / 9 }, constraints),\n });\n }\n updateMicrophone(constraints) {\n return this.updateConstraints({\n audio: constraints,\n });\n }\n /** @internal */\n manageSendersWithConstraints(constraints) {\n if (constraints.audio === false) {\n this.logger.info('Switching off the microphone');\n this.stopOutboundAudio();\n }\n if (constraints.video === false) {\n this.logger.info('Switching off the camera');\n this.stopOutboundVideo();\n }\n return constraints.audio || constraints.video;\n }\n /**\n * @internal\n */\n updateConstraints(constraints, { attempt = 0 } = {}) {\n if (attempt > 1) {\n return Promise.reject(new Error('Failed to update constraints'));\n }\n return new Promise(async (resolve, reject) => {\n var _a, _b, _c;\n try {\n if (!this.peer) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!Object.keys(constraints).length) {\n return reject(new Error('Invalid audio/video constraints.'));\n }\n this.logger.debug('updateConstraints trying constraints', this.__uuid, constraints);\n const shouldContinueWithUpdate = this.manageSendersWithConstraints(constraints);\n if (!shouldContinueWithUpdate) {\n this.logger.debug('Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped');\n return resolve();\n }\n /**\n * On some devices/browsers you cannot open more than one MediaStream at\n * a time, per process. When this happens we'll try to do the following:\n * 1. Stop the current media tracks\n * 2. Try to get new media tracks with the new constraints\n * 3. If we get an error: restore the media tracks using the previous\n * constraints.\n * @see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1238038\n *\n * Instead of just replace the track, force-stop the current one to free\n * up the device\n */\n let oldConstraints = {};\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => {\n var _a;\n /**\n * We'll keep a reference of the original constraints so if something\n * fails we should be able to restore them.\n */\n // @ts-expect-error\n oldConstraints[track.kind] = track.getConstraints();\n // @ts-expect-error\n if (constraints[track.kind] !== undefined) {\n this.logger.debug('updateConstraints stop old tracks first?');\n this.logger.debug('Track readyState:', track.kind, track.readyState);\n stopTrack(track);\n track.stop();\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n let newStream;\n try {\n this.logger.info('updateConstraints with', constraints);\n newStream = await getUserMedia(constraints);\n }\n catch (error) {\n this.logger.error('Error updating device constraints:', error.name, error.message, error);\n this.logger.info('Restoring previous constraints', oldConstraints);\n await this.updateConstraints(oldConstraints, {\n attempt: attempt + 1,\n });\n return reject(error);\n }\n await this.updateStream(newStream);\n this.logger.debug('updateConstraints done');\n resolve();\n }\n catch (error) {\n this.logger.error('updateConstraints', error);\n reject(error);\n }\n finally {\n (_b = this.peer) === null || _b === void 0 ? void 0 : _b._attachAudioTrackListener();\n (_c = this.peer) === null || _c === void 0 ? void 0 : _c._attachVideoTrackListener();\n }\n });\n }\n async updateStream(stream) {\n if (!this.peer) {\n throw new Error('Invalid RTCPeerConnection.');\n }\n // Store the previous tracks for device.updated event\n const prevVideoTrack = this.localVideoTrack;\n const prevAudioTrack = this.localAudioTrack;\n // Detach listeners because updateStream will trigger the track ended event\n this.peer._detachAudioTrackListener();\n this.peer._detachVideoTrackListener();\n this.logger.debug('updateStream got stream', stream);\n if (!this.localStream) {\n this.localStream = new MediaStream();\n }\n const { instance } = this.peer;\n const tracks = stream.getTracks();\n this.logger.debug(`updateStream got ${tracks.length} tracks`);\n for (let i = 0; i < tracks.length; i++) {\n const newTrack = tracks[i];\n this.logger.debug('updateStream apply track: ', newTrack);\n const transceiver = instance\n .getTransceivers()\n .find(({ mid, sender, receiver }) => {\n if (sender.track && sender.track.kind === newTrack.kind) {\n this.logger.debug('Found transceiver by sender');\n return true;\n }\n if (receiver.track && receiver.track.kind === newTrack.kind) {\n this.logger.debug('Found transceiver by receiver');\n return true;\n }\n if (mid === null) {\n this.logger.debug('Found disassociated transceiver');\n return true;\n }\n return false;\n });\n if (transceiver && transceiver.sender) {\n this.logger.debug('updateStream got transceiver', transceiver.currentDirection, transceiver.mid);\n await transceiver.sender.replaceTrack(newTrack);\n this.logger.debug('updateStream replaceTrack');\n transceiver.direction = 'sendrecv';\n this.logger.debug('updateStream set to sendrecv');\n this.localStream.getTracks().forEach((track) => {\n var _a;\n if (track.kind === newTrack.kind && track.id !== newTrack.id) {\n this.logger.debug('updateStream stop old track and apply new one - ');\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n this.localStream.addTrack(newTrack);\n }\n else {\n this.logger.debug('updateStream no transceiver found. addTrack and start dancing!');\n this.peer.type = 'offer';\n this.doReinvite = true;\n this.localStream.addTrack(newTrack);\n instance.addTrack(newTrack, this.localStream);\n }\n this.logger.debug('updateStream simply update mic/cam');\n if (newTrack.kind === 'audio') {\n // @ts-expect-error\n this.emit('microphone.updated', {\n previous: {\n deviceId: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.id,\n label: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.label,\n },\n current: {\n deviceId: newTrack === null || newTrack === void 0 ? void 0 : newTrack.id,\n label: newTrack === null || newTrack === void 0 ? void 0 : newTrack.label,\n },\n });\n this.options.micId = newTrack.getSettings().deviceId;\n }\n else if (newTrack.kind === 'video') {\n // @ts-expect-error\n this.emit('camera.updated', {\n previous: {\n deviceId: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.id,\n label: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.label,\n },\n current: {\n deviceId: newTrack === null || newTrack === void 0 ? void 0 : newTrack.id,\n label: newTrack === null || newTrack === void 0 ? void 0 : newTrack.label,\n },\n });\n this.options.camId = newTrack.getSettings().deviceId;\n }\n }\n this.logger.debug('updateStream done');\n }\n runRTCPeerWorkers(rtcPeerId) {\n this.runWorker('vertoEventWorker', {\n worker: workers.vertoEventWorker,\n initialState: { rtcPeerId },\n });\n const main = !(this.options.additionalDevice || this.options.screenShare);\n if (main) {\n this.runWorker('roomSubscribedWorker', {\n worker: workers.roomSubscribedWorker,\n initialState: { rtcPeerId },\n });\n this.runWorker('promoteDemoteWorker', {\n worker: workers.promoteDemoteWorker,\n initialState: { rtcPeerId },\n });\n }\n }\n /** @internal */\n invite() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'outbound';\n this.peer = this._buildPeer('offer');\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Invite error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n answer() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'inbound';\n if (!this.peer) {\n this.peer = this._buildPeer('answer');\n }\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Answer error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n onLocalSDPReady(rtcPeer) {\n if (!rtcPeer.instance.localDescription) {\n this.logger.error('Missing localDescription', rtcPeer);\n throw new Error('Invalid RTCPeerConnection localDescription');\n }\n const { type, sdp } = rtcPeer.instance.localDescription;\n const mungedSDP = this._mungeSDP(sdp);\n this.logger.debug('LOCAL SDP \\n', `Type: ${type}`, '\\n\\n', mungedSDP);\n switch (type) {\n case 'offer':\n this._watchSessionAuth();\n // If we have a remoteDescription already, send reinvite\n if (!this.resuming && rtcPeer.instance.remoteDescription) {\n return this.executeUpdateMedia(mungedSDP, rtcPeer.uuid);\n }\n else {\n return this.executeInvite(mungedSDP, rtcPeer.uuid);\n }\n case 'answer':\n return this.executeAnswer(mungedSDP, rtcPeer.uuid);\n default:\n return this.logger.error(`Unknown SDP type: '${type}' on call ${this.id}`);\n }\n }\n /** @internal */\n _closeWSConnection() {\n this._watchSessionAuth();\n this.store.dispatch(actions.sessionForceCloseAction());\n }\n _watchSessionAuth() {\n if (this.sessionAuthTask) {\n this.sessionAuthTask.cancel();\n }\n this.sessionAuthTask = this.runWorker('sessionAuthWorker', {\n worker: workers.sessionAuthWorker,\n });\n }\n /** @internal */\n async resume() {\n var _a;\n this.logger.warn(`[resume] Call ${this.id}`);\n if ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.instance) {\n const { connectionState } = this.peer.instance;\n this.logger.debug(`[resume] connectionState for ${this.id} is '${connectionState}'`);\n if (connectionState !== 'closed') {\n this.resuming = true;\n this.peer.restartIce();\n }\n }\n }\n /**\n * Send the `verto.invite` only if the state is either `new` or `requesting`\n * - new: the first time we send out the offer.\n * - requesting: we received a redirectDestination so need to send it again\n * specifying nodeId.\n *\n * @internal\n */\n async executeInvite(sdp, rtcPeerId, nodeId) {\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer || (rtcPeer.instance.remoteDescription && !this.resuming)) {\n throw new Error(`RTCPeer '${rtcPeerId}' already has a remoteDescription. Invalid invite.`);\n }\n // Set state to `requesting` only when `new`, otherwise keep it as `requesting`.\n if (this.state === 'new') {\n this.setState('requesting');\n }\n try {\n const ssOpts = this.options.screenShare\n ? {\n layout: this.options.layout,\n positions: this.options.positions,\n }\n : {};\n const message = VertoInvite(Object.assign(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), ssOpts), { sdp }));\n let subscribe = [];\n if (this.options.screenShare) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.screenshare'];\n }\n else if (this.options.additionalDevice) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.additionaldevice'];\n }\n else {\n subscribe = this.getSubscriptions();\n }\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe,\n });\n this.logger.debug('Invite response', response);\n this.resuming = false;\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /**\n * Send the `verto.answer` only if the state is `new`\n * - new: the first time we send out the answer.\n * @internal\n */\n async executeAnswer(sdp, rtcPeerId, nodeId) {\n // Set state to `answering` only when `new`, otherwise keep it as `answering`.\n if (this.state === 'new') {\n this.setState('answering');\n }\n try {\n const message = VertoAnswer(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe: this.getSubscriptions(),\n });\n this.logger.debug('Answer response', response);\n this.resuming = false;\n /** Call is active so set the RTCPeer */\n this.setActiveRTCPeer(rtcPeerId);\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /** @internal */\n async executeUpdateMedia(sdp, rtcPeerId) {\n try {\n const message = VertoModify(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp, action: 'updateMedia' }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n if (!response.sdp) {\n this.logger.error('UpdateMedia invalid SDP answer', response);\n }\n this.logger.debug('UpdateMedia response', response);\n if (!this.peer) {\n return this.logger.error('Invalid RTCPeer to updateMedia');\n }\n await this.peer.onRemoteSdp(response.sdp);\n }\n catch (error) {\n this.logger.error('UpdateMedia error', error);\n // this.setState('hangup')\n throw error;\n }\n }\n async hangup(id) {\n const rtcPeerId = id !== null && id !== void 0 ? id : this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(this.dialogParams(rtcPeerId));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('Hangup error:', error);\n }\n finally {\n if (rtcPeerId !== this.callId) {\n return this.logger.warn('Prevent setState hangup', rtcPeerId, this.callId);\n }\n this.setState('hangup');\n }\n }\n async hangupAll() {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(Object.assign({ cause: 'REJECT_ALL', causeCode: '825' }, this.dialogParams(rtcPeerId)));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('HangupAll error:', error);\n }\n finally {\n this.setState('hangup');\n }\n }\n /** @internal */\n dtmf(dtmf) {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to send DTMF');\n }\n const message = VertoInfo(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { dtmf }));\n this.vertoExecute({ message, callID: rtcPeerId, node_id: this.nodeId });\n }\n /** @internal */\n doReinviteWithRelayOnly() {\n if (this.peer && this.active) {\n this.peer.restartIceWithRelayOnly();\n }\n }\n /** @internal */\n stopOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('audio');\n }\n }\n /** @internal */\n restoreOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('audio');\n }\n }\n /** @internal */\n stopOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('video');\n }\n }\n /** @internal */\n restoreOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('video');\n }\n }\n /** @internal */\n setState(state) {\n this.prevState = this.state;\n this.state = state;\n this.logger.trace(`Call ${this.id} state change from ${this.prevState} to ${this.state}`);\n // @ts-expect-error\n this.emitter.emit(this.state, this);\n switch (state) {\n case 'purge': {\n this._finalize();\n break;\n }\n case 'hangup': {\n this.setState('destroy');\n break;\n }\n case 'destroy':\n this._finalize();\n break;\n }\n }\n /** @internal */\n updateMediaOptions(options) {\n this.logger.debug('updateMediaOptions', Object.assign({}, options));\n this.options = Object.assign(Object.assign({}, this.options), options);\n this._checkDefaultMediaConstraints();\n }\n /**\n * Allow to define logic to munge the SDP\n *\n * @internal\n * */\n _mungeSDP(sdp) {\n return sdpRemoveLocalCandidates(sdp);\n }\n /**\n * Always use VIDEO_CONSTRAINTS if video: true\n * Always use AUDIO_CONSTRAINTS (or the SS one) if audio: true\n *\n * @internal\n */\n _checkDefaultMediaConstraints() {\n if (this.options.video === true) {\n this.options.video = VIDEO_CONSTRAINTS;\n }\n if (this.options.audio === true) {\n this.options.audio = this.options.screenShare\n ? AUDIO_CONSTRAINTS_SCREENSHARE\n : AUDIO_CONSTRAINTS;\n }\n }\n _initPeer() {\n // Build only for answer to be able to reject\n if (this.options.remoteSdp) {\n this.peer = this._buildPeer('answer');\n }\n }\n _buildPeer(type) {\n const rtcPeer = new RTCPeer(this, type);\n this.appendRTCPeer(rtcPeer);\n this.runRTCPeerWorkers(rtcPeer.uuid);\n return rtcPeer;\n }\n /** @internal */\n _finalize() {\n this.rtcPeerMap.forEach((rtcPeer) => {\n rtcPeer.stop();\n });\n this.rtcPeerMap.clear();\n }\n}\n//# sourceMappingURL=BaseConnection.js.map","import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n debounce,\n} from '@signalwire/core'\n\nconst addSDKPrefix = (input: string) => {\n return `sw-sdk-${input}`\n}\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n /**\n * Local and Remov video elements should never be paused\n * and Safari/Firefox pause the video (ie: enabling PiP, switch cameras etc)\n * We try to force it to keep playing.\n */\n video.addEventListener('pause', () => {\n video.play().catch((error) => {\n getLogger().error('Video Element Paused', video, error)\n })\n })\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\nexport interface LocalOverlay {\n readonly id: string\n status: 'hidden' | 'visible'\n domElement: HTMLDivElement | undefined\n hide(): void\n show(): void\n setLocalOverlayMediaStream(stream: MediaStream): void\n setLocalOverlayMirror(mirror?: boolean): void\n}\n\ninterface MakeLayoutChangedHandlerParams {\n localOverlay: LocalOverlay\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({ localOverlay, rootElement }: MakeLayoutChangedHandlerParams) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n let myLayer = localOverlay.domElement\n // Update localOverlay.status if a location has been found\n localOverlay.status = location ? 'visible' : 'hidden'\n if (!location) {\n getLogger().debug('Location not found')\n if (myLayer) {\n getLogger().debug('Current layer not visible')\n localOverlay.hide()\n }\n\n return\n }\n\n if (!myLayer) {\n getLogger().debug('Build myLayer')\n myLayer = _buildLayer({ location })\n myLayer.id = localOverlay.id\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.disablePictureInPicture = true\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n localVideo.style.pointerEvents = 'none'\n localVideo.style.objectFit = 'cover'\n\n myLayer.appendChild(localVideo)\n\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n const exists = mcuLayers?.querySelector(`#${myLayer.id}`)\n if (mcuLayers && !exists) {\n getLogger().debug('Build myLayer append it')\n mcuLayers.appendChild(myLayer)\n localOverlay.domElement = myLayer\n localOverlay.setLocalOverlayMirror()\n return\n }\n\n getLogger().debug('Build myLayer >> wait next')\n return\n }\n\n const { top, left, width, height } = _getLocationStyles(location)\n getLogger().debug('Update myLayer:', top, left, width, height)\n /**\n * Show myLayer only if the localStream has a valid video track\n */\n const hasVideo =\n localStream\n .getVideoTracks()\n .filter((t) => t.enabled && t.readyState === 'live').length > 0\n if (hasVideo) {\n localOverlay.setLocalOverlayMediaStream(localStream)\n }\n myLayer.style.opacity = hasVideo ? '1' : '0'\n myLayer.style.top = top\n myLayer.style.left = left\n myLayer.style.width = width\n myLayer.style.height = height\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\n }\n }\n\nconst cleanupElement = (rootElement: HTMLElement) => {\n while (rootElement.firstChild) {\n rootElement.removeChild(rootElement.firstChild)\n }\n}\n\nconst setVideoMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLVideoElement\n}) => {\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n}\n\nconst createRootElementResizeObserver = ({\n video,\n rootElement,\n paddingWrapper,\n}: {\n video: HTMLVideoElement\n rootElement: HTMLElement\n paddingWrapper: HTMLDivElement\n}) => {\n const computePaddingWrapperWidth = (width: number, height: number) => {\n const nativeVideoRatio = video.videoWidth / video.videoHeight\n const rootElementRatio = width / height\n if (nativeVideoRatio > rootElementRatio) {\n return '100%'\n } else {\n return `${height * nativeVideoRatio}px`\n }\n }\n\n const maxPaddingBottom = (video.videoHeight / video.videoWidth) * 100\n // debounce to avoid multiple calls\n const update = debounce(\n ({ width, height }: { width: number; height: number }) => {\n if (paddingWrapper) {\n const pb = (height / width) * 100\n paddingWrapper.style.paddingBottom = `${\n pb > maxPaddingBottom ? maxPaddingBottom : pb\n }%`\n paddingWrapper.style.width = computePaddingWrapperWidth(width, height)\n }\n },\n 100\n )\n\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n // Firefox implements `contentBoxSize` as a single content rect, rather than an array\n const { inlineSize, blockSize } = Array.isArray(entry.contentBoxSize)\n ? entry.contentBoxSize[0]\n : entry.contentBoxSize\n update({ width: inlineSize, height: blockSize })\n } else if (entry.contentRect) {\n update({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n }\n })\n })\n\n return {\n start: () => observer.observe(rootElement),\n stop: () => observer.disconnect(),\n }\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n addSDKPrefix,\n createRootElementResizeObserver,\n}\n","const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n","import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n","import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n LocalOverlay,\n addSDKPrefix,\n createRootElementResizeObserver,\n} from '../../utils/videoElement'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport type { RoomSessionConnection } from '../../BaseRoomSession'\n\nexport const makeVideoElementSaga = ({\n rootElement,\n applyLocalVideoOverlay,\n}: {\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n}) => {\n return function* videoElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n try {\n const layerMap = new Map<string, HTMLDivElement>()\n const videoEl = buildVideo()\n\n /**\n * We used this `LocalOverlay` interface to interact with the localVideo\n * overlay DOM element in here and in the `layoutChangedHandler`.\n * The idea is to avoid APIs like `document.getElementById` because it\n * won't work if the SDK is used within a Shadow DOM tree.\n * Instead of querying the `document`, let's use our `layerMap`.\n */\n const localOverlay: LocalOverlay = {\n // Each `layout.changed` event will update `status`\n status: 'hidden',\n get id() {\n // FIXME: Use `id` until the `memberId` is stable between promote/demote\n return addSDKPrefix(room.id)\n },\n get domElement() {\n return layerMap.get(this.id)\n },\n set domElement(element: HTMLDivElement | undefined) {\n if (element) {\n getLogger().debug('Set localOverlay', element)\n layerMap.set(this.id, element)\n } else {\n getLogger().debug('Remove localOverlay')\n layerMap.delete(this.id)\n }\n },\n hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to hide')\n }\n this.domElement.style.opacity = '0'\n },\n show() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to show')\n }\n if (this.status === 'hidden') {\n return getLogger().info('localOverlay not visible')\n }\n this.domElement.style.opacity = '1'\n },\n setLocalOverlayMediaStream(stream: MediaStream) {\n if (!this.domElement) {\n return getLogger().warn(\n 'Missing localOverlay to set the local overlay stream'\n )\n }\n const localVideo = this.domElement.querySelector('video')\n if (localVideo) {\n localVideo.srcObject = stream\n }\n },\n setLocalOverlayMirror(mirror: boolean) {\n if (!this.domElement || !this.domElement.firstChild) {\n return getLogger().warn('Missing localOverlay to set the mirror')\n }\n const videoEl = this.domElement.firstChild as HTMLVideoElement\n if (mirror ?? room.localOverlay.mirrored) {\n videoEl.style.transform = 'scale(-1, 1)'\n videoEl.style.webkitTransform = 'scale(-1, 1)'\n } else {\n videoEl.style.transform = 'scale(1, 1)'\n videoEl.style.webkitTransform = 'scale(1, 1)'\n }\n },\n }\n\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n localOverlay,\n })\n\n let hasVideoTrack = false\n let lastLayoutChanged: any = null\n\n const _processLayoutChanged = (params: any) => {\n // FIXME: expose a method on BaseConnection\n if (room.peer?.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n } else {\n localOverlay.hide()\n }\n }\n\n // @ts-expect-error\n room.on(`${LOCAL_EVENT_PREFIX}.mirror.video`, (value: boolean) => {\n localOverlay.setLocalOverlayMirror(value)\n })\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed - videoTrack', hasVideoTrack)\n if (hasVideoTrack) {\n _processLayoutChanged(params)\n return\n }\n\n lastLayoutChanged = params\n })\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n room.on('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n getLogger().error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n }\n\n if (room.localStream) {\n localOverlay.setLocalOverlayMediaStream(room.localStream)\n }\n })\n\n room.on('member.updated.video_muted', (params) => {\n try {\n const { member } = params\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted ? localOverlay.hide() : localOverlay.show()\n }\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n })\n\n let videoTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'video': {\n videoTask = runSaga(videoElementSetupWorker, {\n applyLocalVideoOverlay,\n rootElement,\n track: event.track,\n element: videoEl,\n })\n\n hasVideoTrack = true\n if (lastLayoutChanged) {\n _processLayoutChanged(lastLayoutChanged)\n }\n break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the videoEl with the new track.\n */\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n cleanupElement(rootElement)\n layerMap.clear()\n videoTask?.cancel()\n })\n } catch (error) {\n getLogger().error('videoElementSaga', error)\n }\n }\n}\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = room.getAudioEl()\n let audioTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'audio': {\n audioTask = runSaga(audioElementSetupWorker, {\n track: event.track,\n element: audioEl,\n speakerId,\n room,\n })\n break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the audioEl with the new track.\n */\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n audioTask?.cancel()\n })\n } catch (error) {\n getLogger().error('audioElementSaga', error)\n }\n }\n}\n\nfunction* audioElementActionsWatcher({\n element,\n room,\n}: {\n element: HTMLAudioElement\n room: RoomSessionConnection\n}): SagaIterator {\n // TODO: For now we're handling individual actions but in the future\n // we might want to have a single action per custom saga and use it\n // in a similar fashion to `executeAction`\n const setSpeakerActionType = actions.getCustomSagaActionType(\n room.__uuid,\n audioSetSpeakerAction\n )\n\n while (true) {\n const action = yield sagaEffects.take([setSpeakerActionType])\n\n try {\n switch (action.type) {\n case setSpeakerActionType:\n const response = yield sagaEffects.call(\n setMediaElementSinkId,\n element,\n action.payload\n )\n\n room.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n action.payload\n )\n\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: response,\n kind: 'resolve',\n })\n break\n }\n } catch (error) {\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: error,\n kind: 'reject',\n })\n getLogger().error(error)\n }\n }\n}\n\nfunction* audioElementSetupWorker({\n track,\n element,\n speakerId,\n room,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n speakerId?: string\n room: RoomSessionConnection\n}): SagaIterator {\n setAudioMediaTrack({ track, element })\n if (speakerId) {\n // Catch no-op since setMediaElementSinkId already provides logs\n setMediaElementSinkId(element, speakerId).catch(() => {})\n }\n\n yield sagaEffects.fork(audioElementActionsWatcher, {\n element,\n room,\n })\n}\n\nfunction* videoElementSetupWorker({\n rootElement,\n applyLocalVideoOverlay = true,\n track,\n element,\n}: {\n // TODO: we'll move this to a separate type once we define how to\n // dispatch action that only target unique sagas\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n track: MediaStreamTrack\n element: HTMLVideoElement\n}): SagaIterator {\n try {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n element.style.maxHeight = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\n return\n }\n if (rootElement.querySelector('.mcuContent')) {\n getLogger().debug('MCU Content already there')\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(element)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.classList.add('paddingWrapper')\n paddingWrapper.style.paddingBottom = '56.25%'\n paddingWrapper.style.position = 'relative'\n paddingWrapper.style.width = '100%'\n paddingWrapper.appendChild(mcuWrapper)\n\n const layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.classList.add('mcuContent')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.height = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.style.display = 'flex'\n relativeWrapper.style.alignItems = 'center'\n relativeWrapper.style.justifyContent = 'center'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.width = '100%'\n rootElement.style.height = '100%'\n rootElement.appendChild(relativeWrapper)\n\n getLogger().debug('MCU readyState 1 >>', element.readyState)\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n yield sagaEffects.call(waitForVideoReady, { element })\n }\n getLogger().debug('MCU is ready..')\n\n const rootElementResizeObserver = createRootElementResizeObserver({\n rootElement,\n video: element,\n paddingWrapper,\n })\n rootElementResizeObserver.start()\n track.addEventListener('ended', () => {\n if (rootElementResizeObserver) {\n rootElementResizeObserver.stop()\n }\n })\n\n layersWrapper.style.display = 'block'\n } catch (error) {\n getLogger().error('Handle video track error', error)\n }\n}\n","export const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n BaseConnectionState,\n RoomLeft,\n RoomLeftEventParams,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEvent } from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\ntype RoomSessionScreenShareEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionScreenShare) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEvent, () => void>\n\nexport type RoomSessionScreenShareEvents = {\n [k in keyof RoomSessionScreenShareEventsHandlerMap]: RoomSessionScreenShareEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<RoomSessionScreenShareEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionScreenShareEvents>['runWorker']\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<RoomSessionScreenShareEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * Represents a screen sharing.\n */\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n BaseConnectionState,\n RoomLeft,\n RoomLeftEventParams,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEvent } from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\ntype RoomSessionDeviceEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionDevice) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEvent, () => void>\n\nexport type RoomSessionDeviceEvents = {\n [k in keyof RoomSessionDeviceEventsHandlerMap]: RoomSessionDeviceEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<RoomSessionDeviceEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionDeviceEvents>['runWorker']\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<RoomSessionDeviceEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n SwEventChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { RoomSession } from '../RoomSession'\nimport type { VideoMemberListUpdatedParams } from '../utils/interfaces'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(EXTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: RoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n swEventChannel,\n instance,\n}: {\n swEventChannel: SwEventChannel\n instance: any\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n swEventChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<RoomSession> =\n function* membersChangedWorker({\n channels: { swEventChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n swEventChannel,\n instance,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n VideoMemberJoinedEvent,\n componentSelectors,\n componentActions,\n type ReduxComponent,\n} from '@signalwire/core'\n\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype ChildMemberJoinedWorkerOnDone = () => void\ntype ChildMemberJoinedWorkerOnFail = (args: { error: Error }) => void\n\nexport type ChildMemberJoinedWorkerHooks = SDKWorkerHooks<\n ChildMemberJoinedWorkerOnDone,\n ChildMemberJoinedWorkerOnFail\n>\n\nexport const childMemberJoinedWorker: SDKWorker<\n BaseConnection<any>,\n ChildMemberJoinedWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().trace('childMemberJoinedWorker started')\n const { channels, instance, initialState, onDone, onFail } = options\n const { swEventChannel } = channels\n const { parentId } = initialState\n if (!parentId) {\n throw new Error('Missing parentId for childMemberJoinedWorker')\n }\n\n const action: MapToPubSubShape<VideoMemberJoinedEvent> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'video.member.joined') {\n return action.payload.member.parent_id === parentId\n }\n return false\n })\n\n /**\n * On video.member.joined with a parent_id, check if we are the\n * owner of the object comparing parent_id in the state.\n * If so update the state with the room values to update the\n * object.\n */\n const { member } = action.payload\n if (member?.parent_id) {\n const byId: Record<string, ReduxComponent> = yield sagaEffects.select(\n componentSelectors.getComponentsById\n )\n const parent = Object.values(byId).find((row) => {\n return 'memberId' in row && row.memberId === member.parent_id\n })\n if (parent) {\n yield sagaEffects.put(\n componentActions.upsert({\n id: instance.callId,\n roomId: action.payload.room_id,\n roomSessionId: action.payload.room_session_id,\n memberId: member.id,\n })\n )\n\n onDone?.()\n } else {\n onFail?.({ error: new Error('Unknown parent_id') })\n }\n }\n getLogger().trace('childMemberJoinedWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoStreamEvent,\n RoomSessionStream,\n Rooms,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoStreamWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>\n): SagaIterator {\n getLogger().trace('videoStreamWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let streamInstance = get<RoomSessionStream>(payload.stream.id)\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: roomSession.store,\n payload,\n })\n } else {\n streamInstance.setPayload(payload)\n }\n set<RoomSessionStream>(payload.stream.id, streamInstance)\n\n switch (type) {\n case 'video.stream.started':\n roomSession.emit('stream.started', streamInstance)\n break\n case 'video.stream.ended':\n roomSession.emit('stream.ended', streamInstance)\n remove<RoomSessionStream>(payload.stream.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoStreamWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionRecording,\n Rooms,\n VideoRecordingEvent,\n VideoRecordingEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoRecordWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>\n): SagaIterator {\n getLogger().trace('videoRecordWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let recordingInstance = get<RoomSessionRecording>(payload.recording.id)\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: roomSession.store,\n payload,\n })\n } else {\n recordingInstance.setPayload(payload)\n }\n set<RoomSessionRecording>(payload.recording.id, recordingInstance)\n\n const event = stripNamespacePrefix(type) as VideoRecordingEventNames\n\n switch (type) {\n case 'video.recording.started':\n case 'video.recording.updated': {\n roomSession.emit(event, recordingInstance)\n break\n }\n case 'video.recording.ended':\n roomSession.emit(event, recordingInstance)\n remove<RoomSessionRecording>(payload.recording.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoRecordWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionPlayback,\n Rooms,\n VideoPlaybackEvent,\n VideoPlaybackEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoPlaybackWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>\n): SagaIterator {\n getLogger().trace('videoPlaybackWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: roomSession.store,\n payload,\n })\n } else {\n playbackInstance.setPayload(payload)\n }\n set<RoomSessionPlayback>(payload.playback.id, playbackInstance)\n\n const event = stripNamespacePrefix(type) as VideoPlaybackEventNames\n\n switch (type) {\n case 'video.playback.started':\n case 'video.playback.updated': {\n roomSession.emit(event, playbackInstance)\n break\n }\n case 'video.playback.ended':\n roomSession.emit(event, playbackInstance)\n remove<RoomSessionPlayback>(payload.playback.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoPlaybackWorker ended')\n}\n","import {\n MapToPubSubShape,\n SDKActions,\n SDKWorker,\n SagaIterator,\n VideoAPIEventParams,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n MemberPosition,\n VideoAPIEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { RoomSessionConnection } from '../BaseRoomSession'\nimport { videoStreamWorker } from './videoStreamWorker'\nimport { videoRecordWorker } from './videoRecordWorker'\nimport { videoPlaybackWorker } from './videoPlaybackWorker'\n\nexport type VideoWorkerParams<T> = SDKWorkerParams<RoomSessionConnection> & {\n action: T\n}\n\nexport const videoWorker: SDKWorker<RoomSessionConnection> = function* (\n options\n): SagaIterator {\n const { channels, instance: roomSession } = options\n const { swEventChannel } = channels\n\n function* worker(action: MapToPubSubShape<VideoAPIEventParams>) {\n const { type, payload } = action\n\n switch (type) {\n case 'video.room.subscribed':\n yield sagaEffects.spawn(MemberPosition.memberPositionWorker, {\n ...options,\n instance: roomSession,\n initialState: payload,\n })\n break\n case 'video.playback.started':\n case 'video.playback.updated':\n case 'video.playback.ended':\n yield sagaEffects.fork(videoPlaybackWorker, {\n action,\n ...options,\n })\n return // Return since we don't need to handle the raw event for this\n case 'video.recording.started':\n case 'video.recording.updated':\n case 'video.recording.ended':\n yield sagaEffects.fork(videoRecordWorker, {\n action,\n ...options,\n })\n return\n case 'video.stream.ended':\n case 'video.stream.started':\n yield sagaEffects.fork(videoStreamWorker, {\n action,\n ...options,\n })\n return\n case 'video.room.audience_count': {\n roomSession.emit('room.audienceCount', payload)\n return\n }\n case 'video.member.talking': {\n const { member } = payload\n if ('talking' in member) {\n const suffix = member.talking ? 'started' : 'ended'\n roomSession.emit(`member.talking.${suffix}`, payload)\n\n // Keep for backwards compat.\n const deprecatedSuffix = member.talking ? 'start' : 'stop'\n roomSession.emit(`member.talking.${deprecatedSuffix}`, payload)\n }\n break // Break here since we do need the raw event sent to the client\n }\n default:\n break\n }\n\n roomSession.emit(stripNamespacePrefix(type) as VideoAPIEventNames, payload)\n }\n\n const isVideoEvent = (action: SDKActions) => action.type.startsWith('video.')\n\n while (true) {\n const action: MapToPubSubShape<VideoAPIEventParams> =\n yield sagaEffects.take(swEventChannel, isVideoEvent)\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoWorker ended')\n}\n","import {\n connect,\n Rooms,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n VideoAuthorization,\n LOCAL_EVENT_PREFIX,\n validateEventsToSubscribe,\n EventEmitter,\n} from '@signalwire/core'\nimport {\n getDisplayMedia,\n BaseConnection,\n BaseConnectionOptions,\n BaseConnectionStateEventTypes,\n supportsMediaOutput,\n createSpeakerDeviceWatcher,\n getSpeakerById,\n} from '@signalwire/webrtc'\nimport type {\n RoomSessionObjectEvents,\n CreateScreenShareObjectOptions,\n AddDeviceOptions,\n AddCameraOptions,\n AddMicrophoneOptions,\n BaseRoomInterface,\n RoomMethods,\n StartScreenShareOptions,\n RoomSessionConnectionContract,\n BaseRoomSessionJoinParams,\n LocalOverlay,\n} from './utils/interfaces'\nimport { SCREENSHARE_AUDIO_CONSTRAINTS } from './utils/constants'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare,\n RoomSessionScreenShareEvents,\n} from './RoomSessionScreenShare'\nimport {\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDevice,\n RoomSessionDeviceEvents,\n} from './RoomSessionDevice'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<T>\n extends RoomMethods,\n RoomSessionConnectionContract,\n BaseComponentContract,\n BaseConnectionContract<RoomSessionObjectEvents> {\n /**\n * Joins the room session.\n */\n join(options?: BaseRoomSessionJoinParams): Promise<T>\n\n /**\n * Leaves the room. This detaches all the locally originating streams from the\n * room.\n */\n leave(): Promise<void>\n}\n\nexport class RoomSessionConnection\n extends BaseConnection<RoomSessionObjectEvents>\n implements BaseRoomInterface, RoomSessionConnectionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _deviceList = new Set<RoomSessionDevice>()\n private _mirrored: LocalOverlay['mirrored']\n private _audioEl:\n | HTMLAudioElement & {\n sinkId?: string\n setSinkId?: (id: string) => Promise<void>\n }\n\n constructor(\n options: BaseConnection<RoomSessionObjectEvents> & {\n mirrorLocalVideoOverlay: boolean\n }\n ) {\n super(options)\n this._mirrored = options.mirrorLocalVideoOverlay\n\n this.runWorker('videoWorker', {\n worker: workers.videoWorker,\n })\n }\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n get interactivityMode() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.join_as ?? ''\n })\n }\n\n get permissions() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.room?.scopes ?? []\n })\n }\n\n /**\n * This method will be called by `join()` right before the\n * `connect()` happens and it's a way for us to control\n * exactly when the workers are attached.\n * @internal\n */\n protected attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n return new Promise<RoomSessionScreenShare>(async (resolve, reject) => {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n RoomSessionScreenShareEvents,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.once('destroy', () => {\n screenShare.emit('room.left')\n this._screenShareList.delete(screenShare)\n })\n\n try {\n screenShare.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(screenShare),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n return await screenShare.join()\n }\n return resolve(screenShare)\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n reject(error)\n }\n })\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n return new Promise<RoomSessionDevice>(async (resolve, reject) => {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n RoomSessionDeviceEvents,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n })(options)\n\n roomDevice.once('destroy', () => {\n roomDevice.emit('room.left')\n this._deviceList.delete(roomDevice)\n })\n\n try {\n roomDevice.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(roomDevice),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n return await roomDevice.join()\n }\n return resolve(roomDevice)\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n reject(error)\n }\n })\n }\n\n join() {\n return super.invite<BaseRoomSession<this>>()\n }\n\n leave() {\n return this.hangup()\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n const prevId = this._audioEl.sinkId as string\n this.once(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n async (newId: string) => {\n const prevSpeaker = await getSpeakerById(prevId)\n const newSpeaker = await getSpeakerById(newId)\n\n const isSame = newSpeaker?.deviceId === prevSpeaker?.deviceId\n if (!newSpeaker?.deviceId || isSame) return\n\n this.emit('speaker.updated', {\n previous: {\n deviceId: prevSpeaker?.deviceId,\n label: prevSpeaker?.label,\n },\n current: {\n deviceId: newSpeaker.deviceId,\n label: newSpeaker.label,\n },\n })\n }\n )\n\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n private _attachSpeakerTrackListener() {\n if (!supportsMediaOutput()) return\n\n // @TODO: Stop the watcher when user leave/disconnects\n createSpeakerDeviceWatcher().then((deviceWatcher) => {\n deviceWatcher.on('removed', async (data) => {\n const sinkId = this._audioEl.sinkId\n const disconnectedSpeaker = data.changes.find((device) => {\n const payloadDeviceId = device.payload.deviceId\n\n return (\n payloadDeviceId === sinkId ||\n (payloadDeviceId === '' && sinkId === 'default') ||\n (payloadDeviceId === 'default' && sinkId === '')\n )\n })\n if (disconnectedSpeaker) {\n this.emit('speaker.disconnected', {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n })\n\n /**\n * In case the currently in-use speaker disconnects, OS by default fallbacks to the default speaker\n * Set the sink id here to make the SDK consistent with the OS\n */\n await this._audioEl.setSinkId?.('')\n\n const defaultSpeakers = await getSpeakerById('default')\n\n if (!defaultSpeakers?.deviceId) return\n\n // Emit the speaker.updated event since the OS will fallback to the default speaker\n this.emit('speaker.updated', {\n previous: {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n },\n current: {\n deviceId: defaultSpeakers.deviceId,\n label: defaultSpeakers.label,\n },\n })\n }\n })\n })\n }\n\n getAudioEl() {\n if (this._audioEl) return this._audioEl\n this._audioEl = new Audio()\n this._attachSpeakerTrackListener()\n return this._audioEl\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup(id)\n }\n\n /** @internal */\n protected _finalize() {\n this._screenShareList.clear()\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /**\n * @deprecated Use {@link getLayouts} instead. `getLayoutList` will\n * be removed in v3.0.0\n */\n getLayoutList() {\n // @ts-expect-error\n return this.getLayouts()\n }\n\n /**\n * @deprecated Use {@link getMembers} instead. `getMemberList` will\n * be removed in v3.0.0\n */\n getMemberList() {\n // @ts-expect-error\n return this.getMembers()\n }\n\n /**\n * Local video stream overlay\n */\n get localOverlay() {\n return {\n mirrored: this._mirrored,\n setMirrored: (value: boolean) => {\n this._mirrored = value\n this.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.mirror.video`,\n this._mirrored\n )\n },\n }\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video.${event}`\n ) as EventEmitter.EventNames<RoomSessionObjectEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const RoomSessionAPI = extendComponent<\n RoomSessionConnection,\n RoomMethods\n>(RoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n getMeta: Rooms.getMeta,\n setMeta: Rooms.setMeta,\n updateMeta: Rooms.updateMeta,\n deleteMeta: Rooms.deleteMeta,\n getMemberMeta: Rooms.getMemberMeta,\n setMemberMeta: Rooms.setMemberMeta,\n updateMemberMeta: Rooms.updateMemberMeta,\n deleteMemberMeta: Rooms.deleteMemberMeta,\n promote: Rooms.promote,\n demote: Rooms.demote,\n getStreams: Rooms.getStreams,\n startStream: Rooms.startStream,\n // lock: Rooms.lock,\n // unlock: Rooms.unlock,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions\n): BaseRoomSession<RoomSessionType> => {\n const room = connect<\n RoomSessionObjectEventsHandlerMapping,\n RoomSessionConnection,\n BaseRoomSession<RoomSessionType>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: RoomSessionAPI,\n })(params)\n\n return room\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomsSubscribedEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomsWorker = function* (\n options: VideoManagerWorkerParams<\n MapToPubSubShape<VideoManagerRoomsSubscribedEvent>\n >\n): SagaIterator {\n getLogger().trace('videoManagerRoomsWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n const modPayload = {\n rooms: payload.rooms.map((row) => toExternalJSON(row)),\n }\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n modPayload\n )\n\n getLogger().trace('videoManagerRoomsWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomWorker = function* (\n options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>\n): SagaIterator {\n getLogger().trace('videoManagerRoomWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n toExternalJSON(payload)\n )\n\n getLogger().trace('videoManagerRoomWorker ended')\n}\n","import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n SDKWorkerParams,\n} from '@signalwire/core'\nimport type { VideoManager } from '../VideoManager'\nimport { videoManagerRoomsWorker } from './videoManagerRoomsWorker'\nimport { videoManagerRoomWorker } from './videoManagerRoomWorker'\n\nexport type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {\n action: T\n}\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const {\n channels: { swEventChannel },\n } = options\n\n function* worker(action: MapToPubSubShape<VideoManagerEvent>) {\n const { type } = action\n\n switch (type) {\n case 'video-manager.rooms.subscribed':\n yield sagaEffects.fork(videoManagerRoomsWorker, {\n action,\n ...options,\n })\n break\n case 'video-manager.room.added':\n case 'video-manager.room.deleted':\n case 'video-manager.room.ended':\n case 'video-manager.room.started':\n case 'video-manager.room.updated':\n yield sagaEffects.fork(videoManagerRoomWorker, {\n action,\n ...options,\n })\n break\n default:\n getLogger().warn(`Unknown video-manager event: \"${type}\"`)\n break\n }\n }\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoManagerWorker ended')\n}\n","import {\n BaseComponentOptions,\n VideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n VideoManagerRoomEntity,\n validateEventsToSubscribe,\n EventEmitter,\n BaseConsumer,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: VideoManagerRoomEntity) => void\n>\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n constructor(options: BaseComponentOptions) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video-manager.${event}`\n ) as EventEmitter.EventNames<VideoManagerEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const createVideoManagerObject = (params: BaseComponentOptions) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n","import {\n BaseClient,\n ClientEvents,\n ClientContract,\n actions,\n Chat as ChatNamespace,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport type { CustomSaga } from '@signalwire/core'\nimport { ConnectionOptions } from '@signalwire/webrtc'\nimport {\n makeVideoElementSaga,\n makeAudioElementSaga,\n} from './features/mediaElements/mediaElementsSagas'\nimport {\n createBaseRoomSessionObject,\n RoomSessionConnection,\n} from './BaseRoomSession'\nimport { VideoManager, createVideoManagerObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\nimport type { Client as PubSubClient } from './pubSub/Client'\nimport type { RoomSession } from './RoomSession'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI<RoomSessionType>['rooms']\n chat: ClientAPI<RoomSessionType>['chat']\n pubSub: ClientAPI<RoomSessionType>['pubSub']\n}\n\nexport interface MakeRoomOptions extends ConnectionOptions {\n /** HTML element in which to display the video stream */\n rootElement?: HTMLElement\n /** Whether to apply the local-overlay on top of your video. Default: `true`. */\n applyLocalVideoOverlay?: boolean\n /** Whether to mirror the local video overlay. Default: `false`. */\n mirrorLocalVideoOverlay?: boolean\n /** Whether to stop the camera when the member is muted. Default: `true`. */\n stopCameraWhileMuted?: boolean\n /** Whether to stop the microphone when the member is muted. Default: `true`. */\n stopMicrophoneWhileMuted?: boolean\n /** Local media stream to override the local video and audio stream tracks */\n localStream?: MediaStream\n}\n\nexport class ClientAPI<\n RoomSessionType = RoomSession\n> extends BaseClient<ClientEvents> {\n private _videoManager: VideoManager\n private _chat: ChatClient\n private _pubSub: PubSubClient\n\n get rooms() {\n return {\n makeRoomObject: (makeRoomOptions: MakeRoomOptions) => {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n // TODO: This might not be needed here. We can initiate these sagas in the BaseRoomSession constructor.\n const customSagas: Array<CustomSaga<RoomSessionConnection>> = []\n\n /**\n * By default the SDK will attach the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n customSagas.push(\n makeAudioElementSaga({\n speakerId: options.speakerId,\n })\n )\n\n /**\n * If the user provides a `roomElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n customSagas.push(\n makeVideoElementSaga({\n rootElement,\n applyLocalVideoOverlay,\n })\n )\n }\n\n const room = createBaseRoomSessionObject<RoomSessionType>({\n ...options,\n store: this.store,\n customSagas,\n })\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audio_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'audio_muted' in member) {\n member.audio_muted\n ? room.stopOutboundAudio()\n : room.restoreOutboundAudio()\n }\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n })\n }\n\n /**\n * Stop and Restore outbound video on video_muted event\n */\n if (stopCameraWhileMuted) {\n room.on('member.updated.video_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted\n ? room.stopOutboundVideo()\n : room.restoreOutboundVideo()\n }\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n })\n }\n\n return room\n },\n }\n }\n\n get chat() {\n if (!this._chat) {\n this._chat = ChatNamespace.createBaseChatObject<ChatClient>({\n store: this.store,\n })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n","function e(e){this.message=e}e.prototype=new Error,e.prototype.name=\"InvalidCharacterError\";var r=\"undefined\"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,\"\");if(t.length%4==1)throw new e(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var n,o,a=0,i=0,c=\"\";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(o);return c};function t(e){var t=e.replace(/-/g,\"+\").replace(/_/g,\"/\");switch(t.length%4){case 0:break;case 2:t+=\"==\";break;case 3:t+=\"=\";break;default:throw\"Illegal base64url string!\"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t=\"0\"+t),\"%\"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if(\"string\"!=typeof e)throw new n(\"Invalid token specified\");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(\".\")[o]))}catch(e){throw new n(\"Invalid token specified: \"+e.message)}}n.prototype=new Error,n.prototype.name=\"InvalidTokenError\";export default o;export{n as InvalidTokenError};\n//# sourceMappingURL=jwt-decode.esm.js.map\n","import jwtDecode from 'jwt-decode'\nimport { getLogger } from '@signalwire/core'\n\n/**\n * Note: ready to support RN with a \"storage.native.ts\" file.\n */\nexport const getStorage = () => {\n if (window && window.sessionStorage) {\n return window.sessionStorage\n }\n return undefined\n}\n\nexport const sessionStorageManager = (token: string) => {\n let roomName: string = ''\n try {\n const jwtPayload = jwtDecode<{ r: string; ja: string }>(token)\n roomName = jwtPayload?.r ?? ''\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[sessionStorageManager] error decoding JWT', token)\n }\n roomName = ''\n }\n\n const valid = Boolean(roomName)\n return {\n authStateKey: valid && `as-${roomName}`,\n protocolKey: valid && `pt-${roomName}`,\n callIdKey: valid && `ci-${roomName}`,\n }\n}\n","import { SWCloseEvent as CoreCloseEvent } from '@signalwire/core'\n\nconst SwCloseEvent =\n typeof CloseEvent === 'function' ? CloseEvent : CoreCloseEvent\n\nexport { SwCloseEvent }\n","import jwtDecode from 'jwt-decode'\nimport {\n BaseJWTSession,\n getLogger,\n SessionOptions,\n SwAuthorizationState,\n type SWCloseEvent,\n} from '@signalwire/core'\nimport { getStorage, sessionStorageManager } from './utils/storage'\nimport { SwCloseEvent } from './utils/CloseEvent'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public CloseEventConstructor = SwCloseEvent\n public agent = process.env.SDK_PKG_AGENT!\n\n private tokenTyp: string\n\n constructor(public options: SessionOptions) {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<{ ch?: string; typ: string }>(options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: options.host || decodedJwt?.ch,\n })\n this.tokenTyp = decodedJwt.typ ?? 'VRT'\n }\n\n get allowReattach() {\n // @ts-expect-error\n return this.options?.reattach !== false && this.isVRT()\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowReattach) {\n return ''\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Search protocol for', protocolKey)\n return getStorage()?.getItem(protocolKey) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowReattach) {\n return\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Persist protocol', protocolKey, this.relayProtocol)\n getStorage()?.setItem(protocolKey, this.relayProtocol)\n }\n }\n\n protected override async retrieveSwAuthorizationState() {\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n return getStorage()?.getItem(authStateKey) ?? ''\n }\n return ''\n }\n\n protected override async persistSwAuthorizationState(\n state: SwAuthorizationState\n ) {\n if (!this.allowReattach) {\n return\n }\n\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n this.logger.trace('Persist auth state', authStateKey, state)\n getStorage()?.setItem(authStateKey, state)\n }\n }\n\n protected override _onSocketClose(event: SWCloseEvent) {\n if (this.status === 'unknown') {\n const { protocolKey, authStateKey, callIdKey } = sessionStorageManager(\n this.options.token\n )\n this.logger.debug('Cleaning up storage')\n if (protocolKey) {\n this.logger.debug('Remove protocolKey', protocolKey)\n getStorage()?.removeItem(protocolKey)\n }\n if (authStateKey) {\n this.logger.debug('Remove authStateKey', authStateKey)\n getStorage()?.removeItem(authStateKey)\n }\n if (callIdKey) {\n this.logger.debug('Remove callIdKey', callIdKey)\n getStorage()?.removeItem(callIdKey)\n }\n }\n\n super._onSocketClose(event)\n }\n\n private isVRT() {\n return this.tokenTyp === 'VRT'\n }\n}\n","import {\n ClientEvents,\n configureStore,\n connect,\n getEventEmitter,\n UserOptions,\n} from '@signalwire/core'\nimport { ClientAPI, Client } from './Client'\nimport { JWTSession } from './JWTSession'\n\n/**\n * With Video.createClient() you can establish a WebSocket connection\n * with SignalWire and interact with the client.\n *\n * ## Examples\n * Create a client\n *\n * @example\n * ```js\n * try {\n * const client = Video.createClient({\n * token: '<YourJWT>',\n * })\n *\n * await client.connect()\n * // Your client is ready now..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @internal\n */\nexport const createClient = <RoomSessionType>(userOptions: UserOptions) => {\n const baseUserOptions = {\n ...userOptions,\n emitter: getEventEmitter<ClientEvents>(),\n }\n const store = configureStore({\n userOptions: baseUserOptions,\n SessionConstructor: JWTSession,\n })\n const client = connect<\n ClientEvents,\n ClientAPI<RoomSessionType>,\n Client<RoomSessionType>\n >({\n store,\n Component: ClientAPI,\n })(baseUserOptions)\n\n return client\n}\n","import { UserOptions, getLogger } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\n\n/**\n * @internal\n * @deprecated Use {@link RoomSession} instead.\n **/\nexport interface Room extends BaseRoomSession<Room> {}\n\nexport interface CreateRoomObjectOptions\n extends UserOptions,\n Omit<MakeRoomOptions, 'rootElement'> {\n /** Id of the HTML element in which to display the video stream */\n rootElementId?: string\n /** Whether to automatically join the room session. */\n autoJoin?: boolean\n}\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * Using Video.createRoomObject() you can create a `RoomObject` to join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.createRoomObject({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * roomObj.join()\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const createRoomObject = (\n roomOptions: CreateRoomObjectOptions\n): Promise<Room> => {\n return new Promise(async (resolve, reject) => {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElementId,\n applyLocalVideoOverlay = true,\n autoJoin = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<Room>({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n roomObject.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n","import {\n UserOptions,\n getLogger,\n VideoAuthorization,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport { checkMediaParams, getJoinMediaParams } from './utils/roomSession'\nimport type { MakeRoomOptions } from './Client'\nimport type {\n BaseRoomSessionJoinParams,\n RoomSessionObjectEvents,\n} from './utils/interfaces'\nimport { getStorage, sessionStorageManager } from './utils/storage'\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'getMeta',\n 'setMeta',\n 'updateMeta',\n 'deleteMeta',\n 'getMemberMeta',\n 'setMemberMeta',\n 'updateMemberMeta',\n 'deleteMemberMeta',\n 'promote',\n 'demote',\n 'lock',\n 'unlock',\n]\n\n/**\n * List of events that the SDK must subscribe at the invite time.\n * ie. ScreenShare/AdditionaDevice are based on the member.joined logic.\n */\nconst REQUIRED_EVENTS: (keyof RoomSessionObjectEvents)[] = [\n 'member.joined',\n 'layout.changed',\n]\nconst noop = () => {}\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\nexport interface RoomSession extends BaseRoomSession<RoomSession> {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join({ receiveAudio: true, sendVideo: false })\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio: audioFromConstructor = true,\n video: videoFromConstructor = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n mirrorLocalVideoOverlay = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n ...userOptions\n } = roomOptions\n\n const deprecatedParams = ['audio', 'video']\n deprecatedParams.forEach((param) => {\n if (param in roomOptions) {\n getLogger().warn(\n `The '${param}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`\n )\n }\n })\n\n // @ts-expect-error - true by default\n const allowReattach = roomOptions?.reattach !== false\n\n const { callIdKey } = sessionStorageManager(userOptions.token)\n const reattachManager = {\n joined: ({ call_id }: VideoRoomSubscribedEventParams) => {\n if (allowReattach && callIdKey) {\n getStorage()?.setItem(callIdKey, call_id)\n }\n },\n init: () => {\n if (allowReattach) {\n room.on('room.subscribed', reattachManager.joined)\n }\n room.options.prevCallId = reattachManager.getPrevCallId()\n },\n destroy: () => {\n if (!allowReattach) {\n return\n }\n\n room.off('room.subscribed', reattachManager.joined)\n if (callIdKey) {\n getStorage()?.removeItem(callIdKey)\n }\n },\n getPrevCallId: () => {\n if (!allowReattach || !callIdKey) {\n return\n }\n\n return getStorage()?.getItem(callIdKey) ?? undefined\n },\n }\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n // audio,\n // video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n mirrorLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n prevCallId: reattachManager.getPrevCallId(),\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n room.emit('room.left', { reason: room.leaveReason })\n\n // Remove callId to reattach\n reattachManager.destroy()\n client.disconnect()\n })\n\n // @ts-expect-error\n client.session.once('session.disconnected', () => {\n room.destroy()\n })\n\n const join = (params?: BaseRoomSessionJoinParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n // Fallback to the constructor values for backwards compat.\n const audio = params?.audio ?? audioFromConstructor\n const video = params?.video ?? videoFromConstructor\n\n // @ts-expect-error\n const authState: VideoAuthorization = client._sessionAuthState\n getLogger().debug('getJoinMediaParams authState?', authState)\n if (authState && authState.type === 'video') {\n const mediaOptions = getJoinMediaParams({\n authState,\n // constructor values override the send\n sendAudio: Boolean(audio),\n sendVideo: Boolean(video),\n ...params,\n })\n\n if (!checkMediaParams(mediaOptions)) {\n client.disconnect()\n return reject(\n new Error(\n `Invalid arguments to join the room. The token used has join_as: '${\n authState.join_as\n }'. \\n${JSON.stringify(params, null, 2)}\\n`\n )\n )\n }\n getLogger().debug('Set mediaOptions', mediaOptions)\n\n /**\n * audio and video might be objects with MediaStreamConstraints\n * so if we must send media, we make sure to use the user's\n * preferences.\n * Note: params.sendAudio: `true` will override audio: `false` so\n * we're using `||` instead of `??` for that reason.\n */\n // @ts-expect-error\n room.updateMediaOptions({\n audio: mediaOptions.mustSendAudio ? audio || true : false,\n video: mediaOptions.mustSendVideo ? video || true : false,\n negotiateAudio: mediaOptions.mustRecvAudio,\n negotiateVideo: mediaOptions.mustRecvVideo,\n })\n }\n\n room.once('room.subscribed', () => {\n resolve(room)\n })\n\n // Hijack previous callId if present\n reattachManager.init()\n\n REQUIRED_EVENTS.forEach((event) => room.once(event, noop))\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n","import { getLogger } from '@signalwire/core'\nimport type { VideoAuthorization } from '@signalwire/core'\nimport type { BaseRoomSessionJoinParams } from './interfaces'\n\ntype GetJoinMediaParamsOptions = BaseRoomSessionJoinParams & {\n authState: VideoAuthorization\n}\n/**\n * getJoinMediaParams returns whether the Join method must send/recv\n * audio and video.\n * Based on values on the Auth block (media allowed and join_as type)\n * it matches the user's preferences and return an object that tells\n * if the negotiation has to include sendrecv/sendonly or recvonly\n * for audio and video.\n */\nexport const getJoinMediaParams = (options: GetJoinMediaParamsOptions) => {\n const {\n authState,\n audio = true,\n video = true,\n sendAudio,\n sendVideo,\n receiveAudio,\n receiveVideo,\n } = options\n getLogger().debug('getJoinMediaParams options', { ...options })\n const { audio_allowed, video_allowed, join_as } = authState\n // Fallback to 'member' in case of null/undefined\n const joinAs = join_as ?? 'member'\n const canSend = joinAs === 'member'\n\n const canSendAudio = canSend && audio_allowed === 'both'\n const canSendVideo = canSend && video_allowed === 'both'\n const canReceiveAudio = audio_allowed !== 'none'\n const canReceiveVideo = video_allowed !== 'none'\n\n const reqToSendAudio = Boolean(sendAudio ?? audio)\n const reqToSendVideo = Boolean(sendVideo ?? video)\n const reqToReceiveAudio = Boolean(receiveAudio ?? audio)\n const reqToReceiveVideo = Boolean(receiveVideo ?? video)\n\n if (!canSendAudio && reqToSendAudio) {\n getLogger().info(\n 'Not allowed to send audio on this room. Default values will be used.'\n )\n }\n if (!canSendVideo && reqToSendVideo) {\n getLogger().info(\n 'Not allowed to send video on this room. Default values will be used.'\n )\n }\n if (!canReceiveAudio && reqToReceiveAudio) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n if (!canReceiveVideo && reqToReceiveVideo) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n return {\n mustSendAudio: canSendAudio && reqToSendAudio,\n mustSendVideo: canSendVideo && reqToSendVideo,\n mustRecvAudio: canReceiveAudio && reqToReceiveAudio,\n mustRecvVideo: canReceiveVideo && reqToReceiveVideo,\n }\n}\n\nexport const checkMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n","import { CreateRoomObjectOptions, createRoomObject } from './createRoomObject'\n\n/**\n * Using Video.joinRoom() you can automatically join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.joinRoom({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * // You have joined the room..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const joinRoom = (roomOptions: CreateRoomObjectOptions) => {\n return createRoomObject({\n ...roomOptions,\n autoJoin: true,\n })\n}\n","import { createHttpClient } from './createHttpClient'\n\ninterface SWClientOptions {\n httpHost?: string\n accessToken: string\n rootElement?: HTMLElement\n}\n\ninterface RegisterDeviceParams {\n deviceType: 'iOS' | 'Android' | 'Desktop'\n deviceToken: string\n}\n\n// TODO: extends from a Base class to share from core\nexport class SWClient {\n private httpClient: ReturnType<typeof createHttpClient>\n\n constructor(public options: SWClientOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.accessToken}`,\n },\n })\n }\n\n get httpHost() {\n return this.options.httpHost ?? 'fabric.signalwire.com'\n }\n\n async getAddresses() {\n const path = '/addresses' as const\n const { body } = await this.httpClient<any>(path)\n const anotherPage = async (url: string) => {\n const { search } = new URL(url)\n const { body } = await this.httpClient<any>(`${path}${search}`)\n return buildResult(body)\n }\n\n const buildResult = (body: any) => {\n return {\n addresses: body.data,\n nextPage: async () => {\n const { next } = body.links\n return next ? anotherPage(next) : undefined\n },\n prevPage: async () => {\n const { prev } = body.links\n return prev ? anotherPage(prev) : undefined\n },\n }\n }\n\n return buildResult(body)\n }\n\n async registerDevice({ deviceType, deviceToken }: RegisterDeviceParams) {\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<any>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n async unregisterDevice({ id }: { id: string }) {\n const path = `/subscriber/devices/${id}` as const\n return await this.httpClient<any>(path, {\n method: 'DELETE',\n })\n }\n}\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n // VideoMemberJoinedEvent,\n // componentSelectors,\n // componentActions,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype WSClientWorkerOnDone = () => void\ntype WSClientWorkerOnFail = (args: { error: Error }) => void\n\nexport type WSClientWorkerHooks = SDKWorkerHooks<\n WSClientWorkerOnDone,\n WSClientWorkerOnFail\n>\n\nexport const WSClientWorker: SDKWorker<\n ReturnType<typeof createClient<BaseConnection<any>>>,\n WSClientWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().debug('WSClientWorker started')\n const { channels, instance } = options\n const { swEventChannel } = channels\n getLogger().debug('WSClientWorker instance', instance)\n while (true) {\n const action: MapToPubSubShape<any> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n getLogger().debug('WSClientWorker action', action)\n if (action.type === 'webrtc.message') {\n return action.payload.method === 'verto.invite'\n }\n return false\n }\n )\n getLogger().debug('Build new call to answer', action)\n\n // TODO: invoke WSClient function to build and answer the invite\n // instance.buildInboundCall(action)\n }\n\n getLogger().trace('WSClientWorker ended')\n}\n","import { type UserOptions, getLogger, VertoSubscribe } from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { WSClientWorker } from './WSClientWorker'\n\ninterface PushNotification {\n encryption_type: 'aes_256_gcm'\n notification_uuid: string\n with_video: 'true' | 'false'\n incoming_caller_name: string\n incoming_caller_id: string\n tag: string\n invite: string\n title: string\n type: 'call_invite'\n iv: string\n version: string\n decrypted: Record<string, any>\n}\n\ninterface WSClientOptions extends UserOptions {\n rootElement?: HTMLElement\n}\n\nexport class WSClient {\n private wsClient: ReturnType<typeof createClient>\n private logger = getLogger()\n\n constructor(public options: WSClientOptions) {\n this.wsClient = createClient({\n host: this.options.host,\n token: this.options.token,\n debug: {\n logWsTraffic: true,\n },\n logLevel: 'debug',\n })\n }\n\n connect() {\n // @ts-ignore\n this.wsClient.runWorker('WSClientWorker', {\n worker: WSClientWorker,\n })\n return this.wsClient.connect()\n }\n\n disconnect() {\n return this.wsClient.disconnect()\n }\n\n async dial(params: { to: string; nodeId?: string }) {\n return new Promise(async (resolve, reject) => {\n try {\n console.log('WSClient dial with:', params)\n\n await this.connect()\n\n // const {\n // audio: audioFromConstructor = true,\n // video: videoFromConstructor = true,\n // iceServers,\n // rootElement,\n // applyLocalVideoOverlay = true,\n // stopCameraWhileMuted = true,\n // stopMicrophoneWhileMuted = true,\n // speakerId,\n // destinationNumber,\n // watchMediaPackets,\n // watchMediaPacketsTimeout,\n // ...userOptions\n // } = params\n\n const call = this.wsClient.rooms.makeRoomObject({\n // audio,\n // video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n // iceServers,\n rootElement: this.options.rootElement,\n applyLocalVideoOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n // speakerId,\n destinationNumber: params.to,\n watchMediaPackets: false,\n // watchMediaPacketsTimeout:,\n nodeId: params.nodeId,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n })\n\n this.wsClient.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n })\n\n // @ts-expect-error\n call.attachPreConnectWorkers()\n\n // @ts-expect-error\n call.start = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n call.once('verto.display', () => resolve(call))\n call.once('room.subscribed', () => resolve(call))\n\n await call.join()\n } catch (error) {\n getLogger().error('WSClient call start', error)\n\n reject(error)\n }\n })\n }\n\n resolve(call)\n } catch (error) {\n getLogger().error('WSClient dial', error)\n\n reject(error)\n }\n })\n }\n\n handlePushNotification(payload: PushNotification) {\n return new Promise(async (resolve, reject) => {\n const { decrypted, type } = payload\n if (type !== 'call_invite') {\n this.logger.warn('Unknown notification type', payload)\n return\n }\n this.logger.debug('handlePushNotification', payload)\n const { params: jsonrpc, node_id: nodeId } = decrypted\n const {\n params: {\n callID,\n sdp,\n caller_id_name,\n caller_id_number,\n callee_id_name,\n callee_id_number,\n display_direction,\n },\n } = jsonrpc\n this.logger.debug('handlePushNotification data', {\n callID,\n sdp,\n caller_id_name,\n caller_id_number,\n callee_id_name,\n callee_id_number,\n display_direction,\n })\n try {\n // Connect the client first\n await this.connect()\n\n // Catch the error temporarly\n try {\n // Send verto.subscribe\n await this.executeVertoSubscribe(callID, nodeId)\n } catch (error) {\n this.logger.warn('Verto Subscribe', error)\n }\n\n // Build the Call object and return to the user\n\n // const {\n // audio: audioFromConstructor = true,\n // video: videoFromConstructor = true,\n // iceServers,\n // rootElement,\n // applyLocalVideoOverlay = true,\n // stopCameraWhileMuted = true,\n // stopMicrophoneWhileMuted = true,\n // speakerId,\n // destinationNumber,\n // watchMediaPackets,\n // watchMediaPacketsTimeout,\n // ...userOptions\n // } = params\n\n const call = this.wsClient.rooms.makeRoomObject({\n negotiateAudio: true,\n negotiateVideo: true,\n rootElement: this.options.rootElement,\n applyLocalVideoOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n // speakerId,\n watchMediaPackets: false,\n // watchMediaPacketsTimeout:,\n\n remoteSdp: sdp,\n prevCallId: callID,\n nodeId,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n getLogger().debug('RTC Connection Destroyed')\n })\n\n // @ts-expect-error\n call.attachPreConnectWorkers()\n\n // // @ts-expect-error\n // call.attachOnSubscribedWorkers(payload)\n\n getLogger().debug('Resolving Call', call)\n resolve({ resultType: 'inboundCall', resultObject: call })\n } catch (error) {\n reject(error)\n }\n })\n }\n\n private async executeVertoSubscribe(callId: string, nodeId: string) {\n try {\n // @ts-expect-error\n return await this.wsClient.execute({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n subscribe: [],\n message: VertoSubscribe({\n sessid: callId,\n eventChannel: [],\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n updateToken(token: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.wsClient.once('session.auth_error', (error) => {\n reject(error)\n })\n this.wsClient.once('session.connected', () => {\n resolve()\n })\n\n // @ts-expect-error\n this.wsClient.reauthenticate(token)\n })\n }\n}\n","import { type UserOptions } from '@signalwire/core'\nimport { createHttpClient } from './createHttpClient'\n\ninterface RegisterDeviceParams {\n deviceType: 'iOS' | 'Android' | 'Desktop'\n deviceToken: string\n}\n\n// TODO: extends from a Base class to share from core\nexport class HTTPClient {\n private httpClient: ReturnType<typeof createHttpClient>\n\n constructor(public options: UserOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n })\n }\n\n get httpHost() {\n const { host } = this.options\n if (!host) {\n return 'fabric.signalwire.com'\n }\n return `fabric.${host.split('.').splice(1).join('.')}`\n }\n\n public async getAddresses() {\n const path = '/addresses' as const\n const { body } = await this.httpClient<any>(path)\n const anotherPage = async (url: string) => {\n const { search } = new URL(url)\n const { body } = await this.httpClient<any>(`${path}${search}`)\n return buildResult(body)\n }\n\n const buildResult = (body: any) => {\n return {\n addresses: body.data,\n nextPage: async () => {\n const { next } = body.links\n return next ? anotherPage(next) : undefined\n },\n prevPage: async () => {\n const { prev } = body.links\n return prev ? anotherPage(prev) : undefined\n },\n }\n }\n\n return buildResult(body)\n }\n\n public async registerDevice({\n deviceType,\n deviceToken,\n }: RegisterDeviceParams) {\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<any>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n public async unregisterDevice({ id }: { id: string }) {\n const path = `/subscriber/devices/${id}` as const\n return await this.httpClient<any>(path, {\n method: 'DELETE',\n })\n }\n}\n","import { type UserOptions } from '@signalwire/core'\nimport { HTTPClient } from './HTTPClient'\nimport { WSClient } from './WSClient'\n\ninterface SignalWireOptions extends UserOptions {\n rootElement?: HTMLElement\n}\n\ninterface SignalWireContract {\n httpHost: HTTPClient['httpHost']\n getAddresses: HTTPClient['getAddresses']\n registerDevice: HTTPClient['registerDevice']\n unregisterDevice: HTTPClient['unregisterDevice']\n connect: WSClient['connect']\n disconnect: WSClient['disconnect']\n dial: WSClient['dial']\n handlePushNotification: WSClient['handlePushNotification']\n updateToken: WSClient['updateToken']\n}\n\nexport const SignalWire = (\n options: SignalWireOptions\n): Promise<SignalWireContract> => {\n return new Promise(async (resolve, reject) => {\n try {\n const httpClient = new HTTPClient(options)\n const wsClient = new WSClient(options)\n\n resolve({\n httpHost: httpClient.httpHost,\n getAddresses: httpClient.getAddresses.bind(httpClient),\n registerDevice: httpClient.registerDevice.bind(httpClient),\n unregisterDevice: httpClient.unregisterDevice.bind(httpClient),\n connect: wsClient.connect.bind(wsClient),\n disconnect: wsClient.disconnect.bind(wsClient),\n dial: wsClient.dial.bind(wsClient),\n handlePushNotification: wsClient.handlePushNotification.bind(wsClient),\n updateToken: wsClient.updateToken.bind(wsClient),\n // @ts-expect-error\n __httpClient: httpClient,\n __wsClient: wsClient,\n })\n } catch (error) {\n reject(error)\n }\n })\n}\n","import { createHttpClient } from './createHttpClient'\nimport { buildCall } from './buildCall'\n\ninterface ClientOptions {\n host?: string\n accessToken: string\n}\n\n/**\n *\n *\n * // TODO: Remove this file\n * Replaced by SWClient.ts\n *\n */\nexport class Client {\n private httpClient: ReturnType<typeof createHttpClient>\n\n constructor(public options: ClientOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.host}`,\n headers: {\n Authorization: `Bearer ${this.options.accessToken}`,\n },\n })\n }\n\n get host() {\n return this.options.host ?? 'fabric.signalwire.com'\n }\n\n async getAddresses() {\n const path = '/addresses' as const\n const { body } = await this.httpClient<any>(path)\n const anotherPage = async (url: string) => {\n const { search } = new URL(url)\n const { body } = await this.httpClient<any>(`${path}${search}`)\n return buildResult(body)\n }\n\n const buildResult = (body: any) => {\n return {\n addresses: body.data,\n nextPage: async () => {\n const { next } = body.links\n return next ? anotherPage(next) : undefined\n },\n prevPage: async () => {\n const { prev } = body.links\n return prev ? anotherPage(prev) : undefined\n },\n }\n }\n\n return buildResult(body)\n }\n\n async createCall({\n uri,\n ...userParams\n }: {\n uri: string\n rootElement: HTMLElement\n }) {\n const path = '/call' as const\n const { body } = await this.httpClient<any>(path, {\n method: 'POST',\n body: { uri },\n })\n\n console.log('Dial Response', body)\n return buildCall({\n ...body,\n userParams: {\n host: this.host.includes('swire') ? 'relay.swire.io' : undefined,\n ...userParams,\n },\n })\n }\n}\n","import { MakeRoomOptions } from '../Client'\nimport { RoomSession } from '../video'\n\ntype Strategy = 'room'\ntype StrategyParams = RoomStrategyParams\ntype RoomStrategyParams = {\n token: string\n}\ninterface FabricCallResponse {\n strategy: Strategy\n params: StrategyParams\n userParams: MakeRoomOptions\n}\n\nexport const buildCall = ({\n strategy,\n params,\n userParams,\n}: FabricCallResponse) => {\n let obj: RoomSession\n let start: (...args: any[]) => void\n switch (strategy) {\n case 'room':\n obj = new RoomSession({\n token: params.token,\n debug: {\n logWsTraffic: true,\n },\n logLevel: 'debug',\n watchMediaPackets: false,\n ...userParams,\n })\n start = (joinParams: any) => {\n return new Promise((resolve, reject) => {\n obj.once('room.joined', (params) => resolve(params))\n // @ts-ignore\n obj.emitter.once('verto.display', (params) => resolve(params))\n return obj.join(joinParams).catch((error) => reject(error))\n })\n }\n break\n // case 'voice':\n // case 'script':\n // case 'whatever':\n default:\n throw new Error(`Unknown strategy: '${strategy}'`)\n }\n\n const interceptors = {\n start,\n }\n\n return new Proxy(obj, {\n get(target: typeof obj, prop: keyof typeof obj, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n","import type {\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends ChatNamespace.BaseChatApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends ChatContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'getAllowedChannels',\n 'setMemberState',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { Chat } from '@signalwire/js'\n *\n * const chatClient = new Chat.Client({\n * token: '<your_chat_token>', // get this from the REST APIs\n * })\n *\n * await chatClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * chatClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await chatClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a chat\n * Client object.\n */\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n","import { Chat } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport ChatMember = Chat.ChatMember\nimport ChatMessage = Chat.ChatMessage\n\nexport * from './Client'\n\nexport {\n ChatMember,\n ChatMessage,\n PagingCursor\n}\n","import type {\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends PubSubNamespace.BasePubSubApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'getAllowedChannels',\n 'subscribe',\n 'publish',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient<Client>(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n","import { PubSub } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\n\nexport {\n PubSubMessage,\n PagingCursor\n}\n","import { stopStream } from './primitives';\nimport { getUserMedia } from './getUserMedia';\n/**\n * Prompts the user to grant permissions for the devices matching the specified set of constraints.\n * @param constraints an optional [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * To only request audio permissions:\n *\n * ```typescript\n * await SignalWire.WebRTC.requestPermissions({audio: true, video: false})\n * ```\n *\n * @example\n * To request permissions for both audio and video, specifying constraints for the video:\n * ```typescript\n * const constraints = {\n * audio: true,\n * video: {\n * width: { min: 1024, ideal: 1280, max: 1920 },\n * height: { min: 576, ideal: 720, max: 1080 }\n * }\n * }\n * await SignalWire.WebRTC.requestPermissions(constraints)\n * ```\n */\nexport const requestPermissions = async (constraints) => {\n try {\n const stream = await getUserMedia(constraints);\n stopStream(stream);\n }\n catch (error) {\n throw error;\n }\n};\n//# sourceMappingURL=requestPermissions.js.map"],"names":["root","definition","this","noop","undefinedType","isIE","window","navigator","test","userAgent","logMethods","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","log","trace","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","undefined","realMethod","Logger","name","defaultLevel","factory","currentLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","location","indexOf","encodeURIComponent","exec","slice","levels","TRACE","DEBUG","INFO","WARN","ERROR","SILENT","getLevel","setLevel","persist","toUpperCase","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","initialLevel","defaultLogger","_loggersByName","getLogger","TypeError","logger","_log","noConflict","getLoggers","module","exports","getRandomValues","rnds8","Uint8Array","rng","crypto","Error","REGEX","byteToHex","push","toString","unsafeStringify","arr","offset","toLowerCase","DNS","URL","v35","version","hashfunc","generateUUID","value","namespace","buf","_namespace","str","unescape","bytes","charCodeAt","stringToBytes","uuid","validate","v","parseInt","parse","set","err","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","a","b","s","t","num","cnt","md5ff","c","d","md5gg","md5hh","md5ii","msg","input","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","native","randomUUID","v4","options","rnds","random","f","z","ROTL","n","_typeof","Symbol","iterator","constructor","_defineProperty","key","arg","hint","prim","toPrimitive","res","String","toPropertyKey","Object","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread2","target","source","forEach","getOwnPropertyDescriptors","defineProperties","formatProdErrorMessage","code","K","H","Array","isArray","N","Math","ceil","M","j","pow","floor","W","T","$$observable","observable","randomString","substring","split","join","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","subscribe","listener","isSubscribed","index","splice","dispatch","action","proto","getPrototypeOf","isPlainObject","type","listeners","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","next","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","state","hasChanged","nextState","_i","_key","previousStateForKey","nextStateForKey","bindActionCreator","actionCreator","compose","_len","funcs","reduce","applyMiddleware","middlewares","store","_dispatch","middlewareAPI","chain","map","middleware","_objectSpread","actionCreators","boundActionCreators","createSymbol","CANCEL","CHANNEL_END_TYPE","IO","MATCH","MULTICAST","SAGA_ACTION","SELF_CANCELLATION","TASK","TASK_CANCEL","TERMINATE","SAGA_LOCATION","_extends","assign","hasOwnProperty","undef","notUndef","func","string","array","promise","p","then","it","throw","pattern","pat","symbol","every","channel","ch","take","close","stringableFunc","Boolean","multicast","kTrue","konst","identity","assignWithSymbols","flatMap","mapper","concat","remove","item","once","fn","called","kThrow","kReturn","done","makeIterator","thro","meta","return","isSagaIterator","logError","error","sagaStack","createEmptyArray","wrapSagaDispatch","shouldTerminate","shouldCancel","shouldComplete","createAllStyleChildCallbacks","shape","parentCallback","completed","totalCount","completedCount","results","childCallbacks","chCbAtKey","isErr","cancel","getMetaInfo","getLocation","instrumented","zeroBuffer","isEmpty","put","none","expanding","initialSize","limit","overflowAction","pushIndex","popIndex","flush","items","doubledLimit","ringBuffer","TAKE","PUT","ALL","CALL","FORK","SELECT","CANCELLED","makeEffect","payload","combinator","detach","eff","detached","patternOrChannel","multicastPattern","warn","channel$1","getFnCallDescriptor","fnDescriptor","args","context","fork","_len3","_key3","spawn","_len4","_key4","select","selector","_len5","_key5","cancelled","queue","semaphore","task","suspend","release","asap","immediately","shift","patterns","some","matcher","predicate","_predicate","wildcard","matcherCreator","string$1","array$1","symbol$1","END","isEnd","buffer$1","closed","takers","cb","taker","eventChannel","buffer","chan","multicastChannel","currentTakers","nextTakers","ensureCanMutateNextTakers","stdChannel","RUNNING","ABORTED","DONE","resolvePromise","cancelPromise","_effectRunnerMap","current","nextSagaId","cancelSingleTask","taskToCancel","isRunning","effectRunnerMap","env","_ref3","_ref3$channel","maybe","takeCb","resolve","result","effects","_ref11","digestEffect","effectId","_ref12","response","childCbs","_ref4","_ref5","proc","_ref6","cpsCb","_ref7","_ref8","parent","taskIterator","resolved","createTaskIterator","getIteratorMetaInfo","child","addTask","isAborted","abort","taskOrTasks","_ref9","joinSingleTask","taskToJoin","joiner","joiners","_ref10","_ref13","_ref14","match","CANCELLED$1","data","_ref15","isCancelled","prop","_ref16","props","_ref17","formatLocation","fileName","lineNumber","sagaLocationAsString","sagaMeta","cancelledTasksAsString","cancelledTasks","crashedEffect","addSagaFrame","frame","clear","setCrashedEffect","effect","firstSaga","otherSagas","crashedEffectLocation","iterator$1","parentContext","parentEffectId","isRoot","cont","finalRunEffect","finalizeRunEffect","currCb","effectRunner","executingContext","mainTask","status","_task","taskResult","taskError","deferredEnd","cancelledDueToErrorTasks","create","onAbort","tasks","getTasks","cancelAll","forkQueue","end","onError","reject","id","setContext","toPromise","def","Promise","newTask","label","effectSettled","sagaMonitor","effectRejected","effectResolved","effectTriggered","effectCancelled","runSaga","saga","_ref$channel","_ref$context","effectMiddlewares","_ref$onError","rootSagaStarted","actionDispatched","runEffect","sagaMiddlewareFactory","_temp","boundRunSaga","excluded","sourceKeys","_objectWithoutPropertiesLoose","sagaMiddleware","run","has","prefix","Events","EE","addListener","emitter","event","evt","_events","_eventsCount","clearEvent","EventEmitter","__proto__","eventNames","events","names","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","on","removeAllListeners","off","prefixed","__defProp","__defProps","__getOwnPropDesc","__getOwnPropDescs","__getOwnPropNames","getOwnPropertyNames","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","__spreadValues","__spreadProps","__objRest","exclude","__export","all2","get","__copyProps","to","from","except","desc","__reExport","mod","secondTarget","__publicField","LOCAL_EVENT_PREFIX","SYNTHETIC_EVENT_PREFIX","PRODUCT_PREFIX_PUBSUB","originalFactory","logLevel","rawMethod","unshift","Date","toISOString","userLogger","defaultLoggerLevel","debugOptions","getLoggerInstance","wsTraffic","logWsTraffic","shouldStringify","JSON","stringify","info","Proxy","receiver","Reflect","UPPERCASE_REGEX","WEBRTC_EVENT_TYPES","isWebrtcEventType","eventType","includes","whitelistCodeRegex","parseResponse","nodeId","node_id","nestedResult","jsonrpc","DEFAULT_OPTIONS","propsToUpdateValue","toExternalJSON","__sw_symbol","__sw_proxy","entries","fromSnakeToCamelCase","endsWith","isTimestampProperty","timestamp","date","isNaN","getTime","toDateObject","part","fc","trim","remainingChars","substr","toInternalAction","event_type","params","vertoRPC","extendComponent","klass","methods","stripNamespacePrefix","regex","RegExp","replace","PROTOCOL_PATTERN","timeoutPromise","time","exception","timer","race","_resolve","setTimeout","finally","clearTimeout","WITH_CUSTOM_EVENT_NAMES","CLIENT_SIDE_EVENT_NAMES","validateEventsToSubscribe","valid","internalEvent","eventParts","cleanupEventNamespace","isSyntheticEvent","isLocalEvent","isSessionEvent","find","withCustomName","startsWith","Set","isSATAuth","makeRPCRequest","_a","makeRPCResponse","DEFAULT_CONNECT_VERSION","major","minor","revision","RPCConnect","tmpMap","destinationNumber","remoteCallerName","remoteCallerNumber","callerName","callerNumber","filterVertoParams","dialogParams","buildVertoRPCMessage","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoAnswer","VertoSubscribe","VertoPong","VertoResult","actions_exports","authErrorAction","authExpiringAction","authSuccessAction","createAction","destroyAction","getCustomSagaActionType","initAction","makeCustomSagaAction","reauthAction","sessionDisconnectedAction","sessionForceCloseAction","sessionReconnectingAction","socketMessageAction","toolkit_exports","prepareAction","prepared","configureStore","redux_star","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","IS_PRODUCTION","curriedGetDefaultMiddleware","devTools","enhancers","rootReducer2","baseProto","finalMiddleware","middlewareEnhancer","finalCompose","compose2","storeEnhancers","formatCustomSagaAction","executeReducerBuilderCallback","builderCallback","actionsMap","actionMatchers","defaultCaseReducer","builder","addCase","typeOrActionCreator","addMatcher","addDefaultCase","createDestroyableSlice","initialState","extraReducers","reducerNames","sliceCaseReducersByName","sliceCaseReducersByType","buildReducer","finalCaseReducers","mapOrBuilderCallback","getInitialState","finalActionMatchers","finalDefaultCaseReducer","caseReducers","reducer2","cr","previousState","caseReducer","createReducer","_reducer","reducerName","maybeReducerWithPrepare","prepareCallback","prepare","actions","createSlice","authorizingAction","sessionSlice","protocol","iceServers","authStatus","authState","authError","authCount","connected","_b","authorization","ice_servers","updateAuthState","sessionActions","sessionReducer","SW_SYMBOL","BaseSession","Map","for","host","sessionChannel","_host","checkWebSocketHost","_sessionChannel","_onSocketOpen","_onSocketError","_onSocketClose","_onSocketMessage","execute","connect","wsOpenHandler","_a2","_socket","removeEventListener","wsCloseHandler","wsErrorHandler","rpcConnectResult","_rpcConnectResult","relayProtocol","signature","jti","connecting","readyState","closing","_status","idle","ready","token","WebSocketConstructor","CloseEventConstructor","_clearTimers","_removeSocketListeners","destroySocket","_clearCheckPingTimer","_createSocket","_addSocketListeners","addEventListener","async","_checkCurrentStatus","message","_requests","rpcRequest","_send","_executeTimeoutMs","_executeTimeoutError","catch","_executeConnectionClosed","_swConnectError","_closeConnection","_addToExecuteQueue","agent","connectVersion","authentication","project","_relayProtocolIsValid","topics","contexts","forceClose","authenticate","_flushExecuteQueue","reason","_clearPendingRequests","_reconnectTimer","size","decode","isJSONRPCRequest","isJSONRPCResponse","request","delete","parseRPCResponse","_pingHandler","_payload","encode","safeParseJson","persistSwAuthorizationState","_","send","_executeQueue","add","_checkPingTimer","_checkPingDelay","now","BaseJWTSession","super","_checkTokenExpiration","reauthenticate","expiresAt","fabric_subscriber","expires_at","parsed","expiresIn","expired","_expiredDiffSeconds","jwt_token","prevProtocol","retrieveRelayProtocol","authorizationState","retrieveSwAuthorizationState","authorization_state","persistRelayProtocol","project_id","_checkTokenExpirationTimer","refreshTokenFn","_onRefreshToken","onRefreshToken","_refreshTokenNotificationDiff","_checkTokenExpirationDelay","redux_exports","configureStore2","createCatchableSaga","createRestartableSaga","componentSlice","byId","upsert","cleanup","componentId","ids","componentActions","componentReducer","rootReducer","components","session","sagaHelpers_exports","defaultCatchHandler","errorHandler","isWebrtcEvent","isVideoEvent","isSwAuthorizationState","sessionChannelWatcher","swEventChannel","swEventWorker","broadcastParams","onSwAuthorizationState","sessionChannelWorkerCatchable","AuthError","setPrototypeOf","HttpError","initSessionSaga","initSession","sessionEmitter","userOptions","channels","customTasks","workers","call2","all","fork2","sessionStatusTask","sessionStatusWatcher","take2","disconnect","reauthenticateWorker","put2","sessionAuthErrorSaga","sessionSelectors_exports","getAuthError","getAuthState","getAuthStatus","getIceServers","getSession","sessionListeners","Component","customSagas","sessionKeys","instance","cacheMap","storeUnsubscribe","reduxKey","cacheKey","updatedValue","fnName","taskList","destroyer","getEventEmitter","SessionConstructor","runSagaMiddleware","createSagaMiddleware","getDefaultMiddleware","getSession2","useSession","instanceMap","useInstanceMap","setDebugOptions","rootSaga_default","executeActionWorker","onDone","onFail","requestId","RPCExecute","call3","SW_SYMBOL2","BaseComponent","eventEmitter","__uuid","_destroyer","eventName","sessionEventNames","getSubscriptions","destroy","detachWorkers","transformParams","transformResolve","transformReject","runWorker","worker","triggerCustomSaga","dispatchId","_customSagaTriggers","settleCustomSagaTrigger","kind","selectorFn","getStateProperty","param","_sessionAuthStatus","_sessionAuthState","_waitUntilSessionAuthorized","authStatus2","_workers","_setWorker","_attachWorker","_runningWorkers","BaseClient","BaseConsumer","resetLatestExecuteParams","_latestExecuteParams","shouldExecuteSubscribe","execParams","subscriptions","subscribeMethod","subscribeParams","event_channel","INTERNAL_MEMBER_UPDATABLE_PROPS","audio_muted","video_muted","deaf","visible","input_volume","output_volume","input_sensitivity","MEMBER_UPDATABLE_PROPS","componentSelectors_exports","getComponent","getComponentsById","getComponentsToCleanup","toCleanup","responses","errors","rooms_exports","RoomSessionPlaybackAPI","RoomSessionRecordingAPI","RoomSessionStreamAPI","audioMuteMember","audioUnmuteMember","createRoomSessionPlaybackObject","createRoomSessionRecordingObject","createRoomSessionStreamObject","deafMember","deleteMemberMeta","deleteMeta","demote","getLayouts","getMemberMeta","getMembers","getMeta","getPlaybacks","getRecordings","getStreams","hideVideoMuted","lock","play","promote","removeAllMembers","removeMember","setDeaf","setHideVideoMuted","setInputSensitivityMember","setInputVolumeMember","setLayout","setMemberMeta","setMemberPosition","setMeta","setOutputVolumeMember","setPositions","showVideoMuted","startRecording","startStream","undeafMember","unlock","updateMemberMeta","updateMeta","videoMuteMember","videoUnmuteMember","baseCodeTransform","createRoomMethod","room_session_id","roomSessionId","createRoomMemberMethod","memberId","rest","member_id","layouts","members","recordings","recordingInstances","recording","recordingInstance","setPayload","room_id","roomId","playbacks","playbackInstances","playback","playbackInstance","seekPosition","currentTimecode","seek_position","createRoomMetaMethod","streams","streamInstances","stream","streamInstance","mediaAllowed","joinAudioMuted","joinVideoMuted","media_allowed","join_audio_muted","join_video_muted","duration","startedAt","started_at","endedAt","ended_at","recording_id","url","volume","position","seekable","playback_id","timecode","abs","stream_id","chat_exports","BaseChatAPI","BaseChatConsumer","ChatMember","ChatMessage","createBaseChatObject","getMemberState","getMembers2","getMessages","publish","setMemberState","baseCodeTransform2","createChatMethod","createChatMemberMethod","messages","cursor","member","transformParamChannels","list","toInternalChatChannels","pubSub_exports","BasePubSubConsumer","PubSubMessage","createBasePubSubObject","pubSubWorker","client","channel3","restMessage","externalJSON","pubSubMessage","isPubSubEvent","sagaEffects.take","sagaEffects.fork","toInternalPubSubChannels","initWorker","_getChannelsParam","_channels","_setSubscribeParams","_getSubscribeParams","_getUnsubscribeParams","channelsParam","_checkMissingSubscriptions","eventNamesWithPrefix","updateToken","content","publishedAt","chatWorker","chatMessage","isChatEvent2","memberPosition_exports","MEMBER_POSITION_COMPOUND_EVENTS","memberPositionWorker","memberUpdatedWorker","defaultDispatcher","memberPositionLayoutChangedWorker","memberList","dispatcher","processedMembers","layout","layers","layer","memberEventParams","current_position","mutateMemberCurrentPosition","currentPosition","updatedMemberEventParams","updated","memberUpdatedPayload","initializeMemberList","addToMemberList","action2","fork3","room_session","configureFullStack","configureJestStore","createMockedLogger","createSessionChannel","createSwEventChannel","rpcConnectResultVRT","wait","PROJECT_ID","TOKEN","fatal","jest","mockImplementation","ms","scopes","scope_id","resource","join_as","user_name","room","display_name","audio_allowed","video_allowed","urls","credential","credentialType","username","multicastChannel2","channel2","selectors","http","init","fetch","ok","errorResponse","json","errorMessage","parsedBody","createHttpClient","baseUrl","timeout","globalOptions","fetcher","path","headers","body","reqInit","getRequestInit","timerId","controller","AbortController","signal","getUrl","searchParams","append","supportsMediaDevices","mediaDevices","getMediaDevicesApi","getSupportedConstraints","streamIsValid","MediaStream","supportsMediaOutput","HTMLMediaElement","setMediaElementSinkId","el","deviceId","setSinkId","stopStream","getTracks","stopTrack","track","stop","dispatchEvent","Event","PERMISSIONS_MAPPING","camera","microphone","speaker","_getMediaDeviceKindByName","enumerateDevices","enumerateDevicesByKind","filterByKind","devices","_error","checkPermissions","permissions","query","_legacyCheckPermissions","checkCameraPermissions","checkMicrophonePermissions","checkSpeakerPermissions","getUserMedia","constraints","audio","video","useTimeout","promises","_useTimeoutForGUM","constraint","getDisplayMedia","getDevicesWithPermissions","fullList","getDevices","_filterDevices","found","groupId","targets","checkDefault","excludeDefault","getSpeakerDevices","assureDeviceId","deviceLabel","_deviceInfoToMap","deviceInfo","TARGET_PERMISSIONS_MAP","DEFAULT_TARGETS","ALLOWED_TARGETS_MSG","CHECK_SUPPORT_MAP","createDeviceWatcher","permission","supported","unsupported","checkTargetPermissions","needPermissionsTarget","filteredTargets","unsupportedTargets","needPermissions","validateTargets","currentDevices","kinds","knownDevices","oldDevices","newDevices","changes","removals","updates","additions","newDevice","oldDevice","removed","added","_getDeviceListDiff","hasAddedDevices","hasRemovedDevices","hasUpdatedDevices","createSpeakerDeviceWatcher","isMediaStream","getSpeakerById","_getUserMedia","getMediaConstraints","micId","micLabel","newMicId","exact","camId","camLabel","newCamId","SDPUtils","localCName","generateIdentifier","splitLines","blob","line","splitSections","getDescription","sections","getMediaSections","matchPrefix","parseCandidate","parts","candidate","foundation","component","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","sdp","parseIceOptions","parseRtpMap","payloadType","clockRate","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","parameters","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","description","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","sessionVersion","netType","addressType","isValidSDP","_isAudioLine","_isVideoLine","sdpStereoHack","endOfLine","sdpLines","opusIndex","findIndex","opusPayload","_getCodecPayloadType","fmtpLineIndex","RTCPeer","_negotiating","_processingRemoteSDP","_restartingIce","_onIce","_onEndedTrackHandler","prevCallId","localStream","_localStream","rtcConfigPolyfill","config","watchMediaPacketsTimeout","remoteStream","_remoteStream","isOffer","isAnswer","isSimulcast","simulcast","isSfu","sfu","localVideoTrack","videoSender","_getSenderByKind","localAudioTrack","audioSender","remoteVideoTrack","videoReceiver","_getReceiverByKind","remoteAudioTrack","audioReceiver","hasAudioSender","hasVideoSender","hasAudioReceiver","hasVideoReceiver","rtcPeerConfig","bundlePolicy","sdpSemantics","localSdp","localDescription","remoteSdp","remoteDescription","hasIceServers","getConfiguration","stopTrackSender","sender","removeTrack","newTrack","replaceTrack","addTrack","getDeviceId","getSettings","getTrackSettings","getDeviceLabel","restartIceWithRelayOnly","iceTransportPolicy","newConfig","setConfiguration","restartIce","triggerResume","_resumeTimer","clearTimers","leaveReason","setState","_closeWSConnection","resetNeedResume","clearResumeTimer","watchMediaPackets","startWatchMediaPackets","stopWatchMediaPackets","_mediaWatcher","rtcPeer","previousAudioValue","previousVideoValue","clearTimer","meter","audioPacketsReceived","videoPacketsReceived","stats","getStats","audioTrackId","videoTrackId","report","trackIdentifier","packetsReceived","lastPacketReceivedTimestamp","connectionState","start","watchRTCPeerMediaPackets","newConstraints","getConstraints","screenShare","applyConstraints","getSenders","getReceivers","force","additionalDevice","getTransceivers","tr","offerOptions","voiceActivityDetection","_supportsAddTransceiver","offerToReceiveAudio","negotiateAudio","offerToReceiveVideo","negotiateVideo","offer","createOffer","_setLocalDescription","_setRemoteDescription","answer","createAnswer","_sdpReady","iceGatheringState","_iceTimeout","_onIceTimeout","maxIceGatheringTimeout","onRemoteBye","_rejectStartMethod","_resolveStartMethod","hangup","_setupRTCPeerConnection","RTCPeerConnection","_attachListeners","_retrieveLocalStream","hasLocalTracks","audioTracks","getAudioTracks","videoTracks","getVideoTracks","addTransceiver","audioTransceiverParams","videoTransceiverParams","sendEncodings","rid","active","scaleResolutionDownBy","Number","msStreamsNumber","addStream","_checkMediaToNegotiate","startNegotiation","detachAndStop","transceiver","_c","_sdpIsValid","onLocalSDPReady","section","sdpHasValidCandidates","_forceNegotiation","iceGatheringTimeout","useStereo","googleMaxBitrate","googleMinBitrate","googleStartBitrate","max","min","sdpBitrateHack","setLocalDescription","localOffer","offerLines","answerLines","answerAudioIndex","answerVideoIndex","audioLines","videoLines","sdpMediaOrderHack","sessionDescr","setRemoteDescription","signalingState","emitMediaConnected","_connectionStateTimer","maxConnectionStateTimeout","clearConnectionStateTimer","iceConnectionState","_attachAudioTrackListener","_attachVideoTrackListener","clearWatchMediaPacketsTimer","_watchMediaPacketsTimer","mediaTrack","_detachAudioTrackListener","_detachVideoTrackListener","isWebrtcAction","vertoEventWorker","rtcPeerId","catchableWorker","sagaHelpers","jsonrpcId","callID","peer","getRTCPeerById","activeRTCPeer","onRemoteSdp","sagaEffects.put","sagaEffects.call","_getRPCMethod","onVertoBye","byeCause","cause","byeCauseCode","causeCode","redirectDestination","pongParams","__rest","mediaParams","applyMediaConstraints","setActiveRTCPeer","roomSubscribedWorker","call_id","clonedPayload","previewUrl","preview_url","transformPayload","Rooms","promoteDemoteWorker","sagaEffects.select","updateMediaOptions","_triggerNewRTCPeer","sessionAuthWorker","resume","AUDIO_CONSTRAINTS","echoCancellation","noiseSuppression","autoGainControl","AUDIO_CONSTRAINTS_SCREENSHARE","googAutoGainControl","VIDEO_CONSTRAINTS","width","ideal","height","aspectRatio","DEFAULT_CALL_OPTIONS","attach","userVariables","requestTimeout","autoApplyMediaParams","BaseConnection","gotEarly","doReinvite","prevState","rtcPeerMap","resuming","executeInvite","activeRTCPeerId","_checkDefaultMediaConstraints","_initPeer","trying","callId","componentSelectors","pingSupported","cameraId","cameraLabel","microphoneId","microphoneLabel","withAudio","withVideo","oldPeerId","appendRTCPeer","setLocalStream","prevAudioTracks","newAudioTracks","prevVideoTracks","newVideoTracks","updateStream","vertoExecute","_buildPeer","updateCamera","updateConstraints","updateMicrophone","manageSendersWithConstraints","stopOutboundAudio","stopOutboundVideo","attempt","newStream","oldConstraints","prevVideoTrack","prevAudioTrack","tracks","currentDirection","previous","runRTCPeerWorkers","workers.vertoEventWorker","workers.roomSubscribedWorker","workers.promoteDemoteWorker","invite","mungedSDP","_mungeSDP","_watchSessionAuth","executeUpdateMedia","executeAnswer","sessionAuthTask","workers.sessionAuthWorker","ssOpts","positions","dtmf","doReinviteWithRelayOnly","restoreOutboundAudio","restoreTrackSender","restoreOutboundVideo","_finalize","sdpRemoveLocalCandidates","buildVideo","createElement","muted","autoplay","playsInline","waitForVideoReady","element","_getLocationStyles","top","left","setVideoMediaTrack","srcObject","createRootElementResizeObserver","rootElement","paddingWrapper","maxPaddingBottom","videoHeight","videoWidth","update","wait2","callFirst","debouncedFn","debounceWrapper","callNow","call4","debounce","pb","style","paddingBottom","nativeVideoRatio","computePaddingWrapperWidth","ResizeObserver","entry","contentBoxSize","inlineSize","blockSize","contentRect","observe","setAudioMediaTrack","playsinline","audioSetSpeakerAction","makeVideoElementSaga","applyLocalVideoOverlay","layerMap","videoEl","localOverlay","domElement","hide","opacity","show","setLocalOverlayMediaStream","localVideo","querySelector","setLocalOverlayMirror","mirror","firstChild","mirrored","transform","webkitTransform","layoutChangedHandler","myMemberId","myLayer","overflow","_buildLayer","disablePictureInPicture","pointerEvents","objectFit","appendChild","mcuLayers","exists","hasVideo","enabled","makeLayoutChangedHandler","hasVideoTrack","lastLayoutChanged","_processLayoutChanged","videoTask","m","videoElementSetupWorker","removeChild","cleanupElement","audioElementActionsWatcher","setSpeakerActionType","audioElementSetupWorker","speakerId","maxHeight","mcuWrapper","right","bottom","classList","layersWrapper","display","relativeWrapper","margin","alignItems","justifyContent","HAVE_NOTHING","rootElementResizeObserver","SCREENSHARE_AUDIO_CONSTRAINTS","RoomSessionScreenShareAPI","leave","audioMute","audioUnmute","videoMute","videoUnmute","setMicrophoneVolume","setInputVolume","setInputSensitivity","RoomSessionDeviceAPI","EXTERNAL_MEMBER_LIST_UPDATED_EVENT","SYNTHETIC_MEMBER_LIST_UPDATED_EVENT","toSyntheticEvent","letter","fromCamelToSnakeCase","getNamespacedEvent","toInternalEventName","MEMBER_LIST_EVENTS","isMemberListEvent","getUpdatedMembers","actionMembers","getMembersFromAction","values","membersListUpdatedWatcher","pubSubAction","memberListUpdatedWorker","shouldHandleMemberList","getMemberListEventsToSubscribe","eventBridgeHandler","initMemberListSubscriptions","childMemberJoinedWorker","parentId","parent_id","row","videoStreamWorker","roomSession","videoRecordWorker","videoPlaybackWorker","videoWorker","sagaEffects.spawn","MemberPosition","talking","RoomSessionAPI","_screenShareList","_deviceList","_mirrored","_audioEl","mirrorLocalVideoOverlay","workers.videoWorker","screenShareList","deviceList","interactivityMode","attachPreConnectWorkers","workers.memberListUpdatedWorker","opts","startScreenShare","autoJoin","displayStream","recoverCall","memberCallId","workers.childMemberJoinedWorker","addCamera","addDevice","addMicrophone","roomDevice","updateSpeaker","prevId","sinkId","newId","prevSpeaker","newSpeaker","isSame","_attachSpeakerTrackListener","deviceWatcher","disconnectedSpeaker","device","payloadDeviceId","defaultSpeakers","getAudioEl","Audio","getLayoutList","getMemberList","setMirrored","undeaf","setOutputVolume","setSpeakerVolume","videoManagerRoomsWorker","modPayload","rooms","videoManagerRoomWorker","videoManagerWorker","VideoManagerAPI","ClientAPI","_videoManager","_chat","_pubSub","makeRoomObject","makeRoomOptions","stopCameraWhileMuted","stopMicrophoneWhileMuted","audioEl","audioTask","makeAudioElementSaga","chat","ChatNamespace","pubSub","PubSubNamespace","videoManager","manager","property","createVideoManagerObject","r","atob","o","fromCharCode","decodeURIComponent","header","getStorage","sessionStorage","sessionStorageManager","roomName","jwtPayload","jwtDecode","authStateKey","protocolKey","callIdKey","SwCloseEvent","CloseEvent","wasClean","JWTSession","WebSocket","tokenTyp","decodedJwt","typ","allowReattach","reattach","isVRT","getItem","setItem","createClient","baseUserOptions","createRoomObject","roomOptions","rootElementId","getElementById","roomObject","UNSAFE_PROP_ACCESS","REQUIRED_EVENTS","RoomSession","audioFromConstructor","videoFromConstructor","reattachManager","joined","getPrevCallId","interceptors","mediaOptions","sendAudio","sendVideo","receiveAudio","receiveVideo","canSend","canSendAudio","canSendVideo","canReceiveAudio","canReceiveVideo","reqToSendAudio","reqToSendVideo","reqToReceiveAudio","reqToReceiveVideo","mustSendAudio","mustSendVideo","mustRecvAudio","mustRecvVideo","getJoinMediaParams","SWClient","httpClient","httpHost","Authorization","accessToken","anotherPage","search","buildResult","addresses","nextPage","links","prevPage","prev","deviceType","deviceToken","device_type","device_token","WSClientWorker","WSClient","wsClient","handlePushNotification","decrypted","caller_id_name","caller_id_number","callee_id_name","callee_id_number","display_direction","executeVertoSubscribe","resultType","resultObject","sessid","HTTPClient","SignalWire","getAddresses","registerDevice","unregisterDevice","dial","__httpClient","__wsClient","userParams","strategy","joinParams","buildCall","INTERCEPTED_METHODS","Chat","chatOptions","_session","createInterceptor","PubSub","pubSubOptions","getMicrophoneAnalyzerMediaStream","audioContext","AudioContext","webkitAudioContext","analyser","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","createAnalyzer","rafId","createMediaStreamSource","startMetering","dataArray","frequencyBinCount","getByteFrequencyData","latestVol","final","requestAnimationFrame","cancelAnimationFrame"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../../../node_modules/loglevel/lib/loglevel.js","../../core/node_modules/uuid/dist/esm-browser/rng.js","../../core/node_modules/uuid/dist/esm-browser/regex.js","../../core/node_modules/uuid/dist/esm-browser/stringify.js","../../core/node_modules/uuid/dist/esm-browser/v35.js","../../core/node_modules/uuid/dist/esm-browser/parse.js","../../core/node_modules/uuid/dist/esm-browser/validate.js","../../core/node_modules/uuid/dist/esm-browser/md5.js","../../core/node_modules/uuid/dist/esm-browser/v3.js","../../core/node_modules/uuid/dist/esm-browser/native.js","../../core/node_modules/uuid/dist/esm-browser/v4.js","../../core/node_modules/uuid/dist/esm-browser/sha1.js","../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../node_modules/redux/es/redux.js","../../core/node_modules/uuid/dist/esm-browser/v5.js","../../../node_modules/@redux-saga/symbols/dist/redux-saga-symbols.esm.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@redux-saga/is/dist/redux-saga-is.esm.js","../../../node_modules/@redux-saga/core/dist/io-c3792963.js","../../../node_modules/@redux-saga/core/dist/redux-saga-core.esm.js","../../../node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/eventemitter3/index.js","../../core/dist/index.esm.js","../src/fabric/createHttpClient.ts","../../webrtc/dist/mjs/webrtc/src/utils/primitives.js","../../webrtc/dist/mjs/webrtc/src/utils/enumerateDevices.js","../../webrtc/dist/mjs/webrtc/src/utils/permissions.js","../../webrtc/dist/mjs/webrtc/src/utils/getUserMedia.js","../../webrtc/dist/mjs/webrtc/src/utils/getDisplayMedia.js","../../webrtc/dist/mjs/webrtc/src/utils/deviceHelpers.js","../../webrtc/dist/mjs/webrtc/src/utils/helpers.js","../../../node_modules/sdp/sdp.js","../../webrtc/dist/mjs/webrtc/src/utils/sdpHelpers.js","../../webrtc/dist/mjs/webrtc/src/RTCPeer.js","../../webrtc/dist/mjs/webrtc/src/utils/watchRTCPeerMediaPackets.js","../../webrtc/dist/mjs/webrtc/src/workers/vertoEventWorker.js","../../../node_modules/tslib/tslib.es6.js","../../webrtc/dist/mjs/webrtc/src/workers/roomSubscribedWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/promoteDemoteWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/sessionAuthWorker.js","../../webrtc/dist/mjs/webrtc/src/BaseConnection.js","../src/utils/videoElement.ts","../src/utils/audioElement.ts","../src/features/actions.ts","../src/features/mediaElements/mediaElementsSagas.ts","../src/utils/constants.ts","../src/RoomSessionScreenShare.ts","../src/RoomSessionDevice.ts","../src/video/memberListUpdatedWorker.ts","../src/video/childMemberJoinedWorker.ts","../src/video/videoStreamWorker.ts","../src/video/videoRecordWorker.ts","../src/video/videoPlaybackWorker.ts","../src/video/videoWorker.ts","../src/BaseRoomSession.ts","../src/cantina/workers/videoManagerRoomsWorker.ts","../src/cantina/workers/videoManagerRoomWorker.ts","../src/cantina/workers/videoManagerWorker.ts","../src/cantina/VideoManager.ts","../src/Client.ts","../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../src/utils/storage.ts","../src/utils/CloseEvent.ts","../src/JWTSession.ts","../src/createClient.ts","../src/createRoomObject.ts","../src/RoomSession.ts","../src/utils/roomSession.ts","../src/joinRoom.ts","../src/fabric/SWClient.ts","../src/fabric/WSClientWorker.ts","../src/fabric/WSClient.ts","../src/fabric/HTTPClient.ts","../src/fabric/SignalWire.ts","../src/fabric/Client.ts","../src/fabric/buildCall.ts","../src/chat/Client.ts","../src/chat/index.ts","../src/pubSub/Client.ts","../src/pubSub/index.ts","../../webrtc/dist/mjs/webrtc/src/utils/requestPermissions.js"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = level;\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n self.setLevel(defaultLevel, false);\n clearPersistedLevel();\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import { unsafeStringify } from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n var _namespace;\n\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (let i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n const output = [];\n const length32 = input.length * 32;\n const hexTab = '0123456789abcdef';\n\n for (let i = 0; i < length32; i += 8) {\n const x = input[i >> 5] >>> i % 32 & 0xff;\n const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a;\n const oldb = b;\n const oldc = c;\n const oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n const length8 = input.length * 8;\n const output = new Uint32Array(getOutputLength(length8));\n\n for (let i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n const lsw = (x & 0xffff) + (y & 0xffff);\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nconst v3 = v35('v3', 0x30, md5);\nexport default v3;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (let i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n const l = bytes.length / 4 + 2;\n const N = Math.ceil(l / 16);\n const M = new Array(N);\n\n for (let i = 0; i < N; ++i) {\n const arr = new Uint32Array(16);\n\n for (let j = 0; j < 16; ++j) {\n arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];\n }\n\n M[i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (let i = 0; i < N; ++i) {\n const W = new Uint32Array(80);\n\n for (let t = 0; t < 16; ++t) {\n W[t] = M[i][t];\n }\n\n for (let t = 16; t < 80; ++t) {\n W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n }\n\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n let e = H[4];\n\n for (let t = 0; t < 80; ++t) {\n const s = Math.floor(t / 20);\n const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n INIT: \"@@redux/INIT\" + randomString(),\n REPLACE: \"@@redux/REPLACE\" + randomString(),\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n var proto = obj;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n var type = typeof val;\n\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n var constructorName = ctorName(val);\n\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n } // other\n\n\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n var typeOfVal = typeof val;\n\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n\n return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\n\n function getState() {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\n\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n var isSubscribed = true;\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n isSubscribed = false;\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n currentListeners = null;\n };\n }\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\n\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\n\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n }\n\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n\n dispatch({\n type: ActionTypes.REPLACE\n });\n }\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\n\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n } // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n\n\n dispatch({\n type: ActionTypes.INIT\n });\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n\n\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n }\n\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n }\n });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n // keys multiple times.\n\n var unexpectedKeyCache;\n\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError;\n\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination(state, action) {\n if (state === void 0) {\n state = {};\n }\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n\n if (typeof nextStateForKey === 'undefined') {\n var actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n }\n\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n }\n\n var boundActionCreators = {};\n\n for (var key in actionCreators) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n var store = createStore.apply(void 0, arguments);\n\n var _dispatch = function dispatch() {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(void 0, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\n return _objectSpread(_objectSpread({}, store), {}, {\n dispatch: _dispatch\n });\n };\n };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nconst v5 = v35('v5', 0x50, sha1);\nexport default v5;","var createSymbol = function createSymbol(name) {\n return \"@@redux-saga/\" + name;\n};\n\nvar CANCEL =\n/*#__PURE__*/\ncreateSymbol('CANCEL_PROMISE');\nvar CHANNEL_END_TYPE =\n/*#__PURE__*/\ncreateSymbol('CHANNEL_END');\nvar IO =\n/*#__PURE__*/\ncreateSymbol('IO');\nvar MATCH =\n/*#__PURE__*/\ncreateSymbol('MATCH');\nvar MULTICAST =\n/*#__PURE__*/\ncreateSymbol('MULTICAST');\nvar SAGA_ACTION =\n/*#__PURE__*/\ncreateSymbol('SAGA_ACTION');\nvar SELF_CANCELLATION =\n/*#__PURE__*/\ncreateSymbol('SELF_CANCELLATION');\nvar TASK =\n/*#__PURE__*/\ncreateSymbol('TASK');\nvar TASK_CANCEL =\n/*#__PURE__*/\ncreateSymbol('TASK_CANCEL');\nvar TERMINATE =\n/*#__PURE__*/\ncreateSymbol('TERMINATE');\nvar SAGA_LOCATION =\n/*#__PURE__*/\ncreateSymbol('LOCATION');\n\nexport { CANCEL, CHANNEL_END_TYPE, IO, MATCH, MULTICAST, SAGA_ACTION, SAGA_LOCATION, SELF_CANCELLATION, TASK, TASK_CANCEL, TERMINATE };\n","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import { TASK, SAGA_ACTION, MULTICAST, IO } from '@redux-saga/symbols';\n\nvar undef = function undef(v) {\n return v === null || v === undefined;\n};\nvar notUndef = function notUndef(v) {\n return v !== null && v !== undefined;\n};\nvar func = function func(f) {\n return typeof f === 'function';\n};\nvar number = function number(n) {\n return typeof n === 'number';\n};\nvar string = function string(s) {\n return typeof s === 'string';\n};\nvar array = Array.isArray;\nvar object = function object(obj) {\n return obj && !array(obj) && typeof obj === 'object';\n};\nvar promise = function promise(p) {\n return p && func(p.then);\n};\nvar iterator = function iterator(it) {\n return it && func(it.next) && func(it.throw);\n};\nvar iterable = function iterable(it) {\n return it && func(Symbol) ? func(it[Symbol.iterator]) : array(it);\n};\nvar task = function task(t) {\n return t && t[TASK];\n};\nvar sagaAction = function sagaAction(a) {\n return Boolean(a && a[SAGA_ACTION]);\n};\nvar observable = function observable(ob) {\n return ob && func(ob.subscribe);\n};\nvar buffer = function buffer(buf) {\n return buf && func(buf.isEmpty) && func(buf.take) && func(buf.put);\n};\nvar pattern = function pattern(pat) {\n return pat && (string(pat) || symbol(pat) || func(pat) || array(pat) && pat.every(pattern));\n};\nvar channel = function channel(ch) {\n return ch && func(ch.take) && func(ch.close);\n};\nvar stringableFunc = function stringableFunc(f) {\n return func(f) && f.hasOwnProperty('toString');\n};\nvar symbol = function symbol(sym) {\n return Boolean(sym) && typeof Symbol === 'function' && sym.constructor === Symbol && sym !== Symbol.prototype;\n};\nvar multicast = function multicast(ch) {\n return channel(ch) && ch[MULTICAST];\n};\nvar effect = function effect(eff) {\n return eff && eff[IO];\n};\n\nexport { array, buffer, channel, effect, func, iterable, iterator, multicast, notUndef, number, object, observable, pattern, promise, sagaAction, string, stringableFunc, symbol, task, undef };\n","import { TASK_CANCEL, TERMINATE, SAGA_LOCATION, SAGA_ACTION, IO, SELF_CANCELLATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport { array, notUndef, pattern, multicast, channel, undef, effect, task, func, buffer, string, object } from '@redux-saga/is';\nimport delayP from '@redux-saga/delay-p';\n\nvar konst = function konst(v) {\n return function () {\n return v;\n };\n};\nvar kTrue =\n/*#__PURE__*/\nkonst(true);\n\nvar noop = function noop() {};\n\nif (process.env.NODE_ENV !== 'production' && typeof Proxy !== 'undefined') {\n noop =\n /*#__PURE__*/\n new Proxy(noop, {\n set: function set() {\n throw internalErr('There was an attempt to assign a property to internal `noop` function.');\n }\n });\n}\nvar identity = function identity(v) {\n return v;\n};\nvar hasSymbol = typeof Symbol === 'function';\nvar asyncIteratorSymbol = hasSymbol && Symbol.asyncIterator ? Symbol.asyncIterator : '@@asyncIterator';\nfunction check(value, predicate, error) {\n if (!predicate(value)) {\n throw new Error(error);\n }\n}\nvar assignWithSymbols = function assignWithSymbols(target, source) {\n _extends(target, source);\n\n if (Object.getOwnPropertySymbols) {\n Object.getOwnPropertySymbols(source).forEach(function (s) {\n target[s] = source[s];\n });\n }\n};\nvar flatMap = function flatMap(mapper, arr) {\n var _ref;\n\n return (_ref = []).concat.apply(_ref, arr.map(mapper));\n};\nfunction remove(array, item) {\n var index = array.indexOf(item);\n\n if (index >= 0) {\n array.splice(index, 1);\n }\n}\nfunction once(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n\n called = true;\n fn();\n };\n}\n\nvar kThrow = function kThrow(err) {\n throw err;\n};\n\nvar kReturn = function kReturn(value) {\n return {\n value: value,\n done: true\n };\n};\n\nfunction makeIterator(next, thro, name) {\n if (thro === void 0) {\n thro = kThrow;\n }\n\n if (name === void 0) {\n name = 'iterator';\n }\n\n var iterator = {\n meta: {\n name: name\n },\n next: next,\n throw: thro,\n return: kReturn,\n isSagaIterator: true\n };\n\n if (typeof Symbol !== 'undefined') {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n}\nfunction logError(error, _ref2) {\n var sagaStack = _ref2.sagaStack;\n\n /*eslint-disable no-console*/\n console.error(error);\n console.error(sagaStack);\n}\nvar internalErr = function internalErr(err) {\n return new Error(\"\\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\\n Error: \" + err + \"\\n\");\n};\nvar createSetContextWarning = function createSetContextWarning(ctx, props) {\n return (ctx ? ctx + '.' : '') + \"setContext(props): argument \" + props + \" is not a plain object\";\n};\nvar FROZEN_ACTION_ERROR = \"You can't put (a.k.a. dispatch from saga) frozen actions.\\nWe have to define a special non-enumerable property on those actions for scheduling purposes.\\nOtherwise you wouldn't be able to communicate properly between sagas & other subscribers (action ordering would become far less predictable).\\nIf you are using redux and you care about this behaviour (frozen actions),\\nthen you might want to switch to freezing actions in a middleware rather than in action creator.\\nExample implementation:\\n\\nconst freezeActions = store => next => action => next(Object.freeze(action))\\n\"; // creates empty, but not-holey array\n\nvar createEmptyArray = function createEmptyArray(n) {\n return Array.apply(null, new Array(n));\n};\nvar wrapSagaDispatch = function wrapSagaDispatch(dispatch) {\n return function (action) {\n if (process.env.NODE_ENV !== 'production') {\n check(action, function (ac) {\n return !Object.isFrozen(ac);\n }, FROZEN_ACTION_ERROR);\n }\n\n return dispatch(Object.defineProperty(action, SAGA_ACTION, {\n value: true\n }));\n };\n};\nvar shouldTerminate = function shouldTerminate(res) {\n return res === TERMINATE;\n};\nvar shouldCancel = function shouldCancel(res) {\n return res === TASK_CANCEL;\n};\nvar shouldComplete = function shouldComplete(res) {\n return shouldTerminate(res) || shouldCancel(res);\n};\nfunction createAllStyleChildCallbacks(shape, parentCallback) {\n var keys = Object.keys(shape);\n var totalCount = keys.length;\n\n if (process.env.NODE_ENV !== 'production') {\n check(totalCount, function (c) {\n return c > 0;\n }, 'createAllStyleChildCallbacks: get an empty array or object');\n }\n\n var completedCount = 0;\n var completed;\n var results = array(shape) ? createEmptyArray(totalCount) : {};\n var childCallbacks = {};\n\n function checkEnd() {\n if (completedCount === totalCount) {\n completed = true;\n parentCallback(results);\n }\n }\n\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n parentCallback.cancel();\n parentCallback(res, isErr);\n } else {\n results[key] = res;\n completedCount++;\n checkEnd();\n }\n };\n\n chCbAtKey.cancel = noop;\n childCallbacks[key] = chCbAtKey;\n });\n\n parentCallback.cancel = function () {\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCallbacks[key].cancel();\n });\n }\n };\n\n return childCallbacks;\n}\nfunction getMetaInfo(fn) {\n return {\n name: fn.name || 'anonymous',\n location: getLocation(fn)\n };\n}\nfunction getLocation(instrumented) {\n return instrumented[SAGA_LOCATION];\n}\n\nvar BUFFER_OVERFLOW = \"Channel's Buffer overflow!\";\nvar ON_OVERFLOW_THROW = 1;\nvar ON_OVERFLOW_DROP = 2;\nvar ON_OVERFLOW_SLIDE = 3;\nvar ON_OVERFLOW_EXPAND = 4;\nvar zeroBuffer = {\n isEmpty: kTrue,\n put: noop,\n take: noop\n};\n\nfunction ringBuffer(limit, overflowAction) {\n if (limit === void 0) {\n limit = 10;\n }\n\n var arr = new Array(limit);\n var length = 0;\n var pushIndex = 0;\n var popIndex = 0;\n\n var push = function push(it) {\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n length++;\n };\n\n var take = function take() {\n if (length != 0) {\n var it = arr[popIndex];\n arr[popIndex] = null;\n length--;\n popIndex = (popIndex + 1) % limit;\n return it;\n }\n };\n\n var flush = function flush() {\n var items = [];\n\n while (length) {\n items.push(take());\n }\n\n return items;\n };\n\n return {\n isEmpty: function isEmpty() {\n return length == 0;\n },\n put: function put(it) {\n if (length < limit) {\n push(it);\n } else {\n var doubledLimit;\n\n switch (overflowAction) {\n case ON_OVERFLOW_THROW:\n throw new Error(BUFFER_OVERFLOW);\n\n case ON_OVERFLOW_SLIDE:\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n popIndex = pushIndex;\n break;\n\n case ON_OVERFLOW_EXPAND:\n doubledLimit = 2 * limit;\n arr = flush();\n length = arr.length;\n pushIndex = arr.length;\n popIndex = 0;\n arr.length = doubledLimit;\n limit = doubledLimit;\n push(it);\n break;\n\n default: // DROP\n\n }\n }\n },\n take: take,\n flush: flush\n };\n}\n\nvar none = function none() {\n return zeroBuffer;\n};\nvar fixed = function fixed(limit) {\n return ringBuffer(limit, ON_OVERFLOW_THROW);\n};\nvar dropping = function dropping(limit) {\n return ringBuffer(limit, ON_OVERFLOW_DROP);\n};\nvar sliding = function sliding(limit) {\n return ringBuffer(limit, ON_OVERFLOW_SLIDE);\n};\nvar expanding = function expanding(initialSize) {\n return ringBuffer(initialSize, ON_OVERFLOW_EXPAND);\n};\n\nvar buffers = /*#__PURE__*/Object.freeze({\n __proto__: null,\n none: none,\n fixed: fixed,\n dropping: dropping,\n sliding: sliding,\n expanding: expanding\n});\n\nvar TAKE = 'TAKE';\nvar PUT = 'PUT';\nvar ALL = 'ALL';\nvar RACE = 'RACE';\nvar CALL = 'CALL';\nvar CPS = 'CPS';\nvar FORK = 'FORK';\nvar JOIN = 'JOIN';\nvar CANCEL = 'CANCEL';\nvar SELECT = 'SELECT';\nvar ACTION_CHANNEL = 'ACTION_CHANNEL';\nvar CANCELLED = 'CANCELLED';\nvar FLUSH = 'FLUSH';\nvar GET_CONTEXT = 'GET_CONTEXT';\nvar SET_CONTEXT = 'SET_CONTEXT';\n\nvar effectTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n TAKE: TAKE,\n PUT: PUT,\n ALL: ALL,\n RACE: RACE,\n CALL: CALL,\n CPS: CPS,\n FORK: FORK,\n JOIN: JOIN,\n CANCEL: CANCEL,\n SELECT: SELECT,\n ACTION_CHANNEL: ACTION_CHANNEL,\n CANCELLED: CANCELLED,\n FLUSH: FLUSH,\n GET_CONTEXT: GET_CONTEXT,\n SET_CONTEXT: SET_CONTEXT\n});\n\nvar TEST_HINT = '\\n(HINT: if you are getting these errors in tests, consider using createMockTask from @redux-saga/testing-utils)';\n\nvar makeEffect = function makeEffect(type, payload) {\n var _ref;\n\n return _ref = {}, _ref[IO] = true, _ref.combinator = false, _ref.type = type, _ref.payload = payload, _ref;\n};\n\nvar isForkEffect = function isForkEffect(eff) {\n return effect(eff) && eff.type === FORK;\n};\n\nvar detach = function detach(eff) {\n if (process.env.NODE_ENV !== 'production') {\n check(eff, isForkEffect, 'detach(eff): argument must be a fork effect');\n }\n\n return makeEffect(FORK, _extends({}, eff.payload, {\n detached: true\n }));\n};\nfunction take(patternOrChannel, multicastPattern) {\n if (patternOrChannel === void 0) {\n patternOrChannel = '*';\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'take(patternOrChannel): patternOrChannel is undefined');\n }\n\n if (pattern(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(pattern) takes one argument but two were provided. Consider passing an array for listening to several action types\");\n }\n\n return makeEffect(TAKE, {\n pattern: patternOrChannel\n });\n }\n\n if (multicast(patternOrChannel) && notUndef(multicastPattern) && pattern(multicastPattern)) {\n return makeEffect(TAKE, {\n channel: patternOrChannel,\n pattern: multicastPattern\n });\n }\n\n if (channel(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(channel) takes one argument but two were provided. Second argument is ignored.\");\n }\n\n return makeEffect(TAKE, {\n channel: patternOrChannel\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\"take(patternOrChannel): argument \" + patternOrChannel + \" is not valid channel or a valid pattern\");\n }\n}\nvar takeMaybe = function takeMaybe() {\n var eff = take.apply(void 0, arguments);\n eff.payload.maybe = true;\n return eff;\n};\nfunction put(channel$1, action) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n check(channel$1, notUndef, 'put(channel, action): argument channel is undefined');\n check(channel$1, channel, \"put(channel, action): argument \" + channel$1 + \" is not a valid channel\");\n check(action, notUndef, 'put(channel, action): argument action is undefined');\n } else {\n check(channel$1, notUndef, 'put(action): argument action is undefined');\n }\n }\n\n if (undef(action)) {\n action = channel$1; // `undefined` instead of `null` to make default parameter work\n\n channel$1 = undefined;\n }\n\n return makeEffect(PUT, {\n channel: channel$1,\n action: action\n });\n}\nvar putResolve = function putResolve() {\n var eff = put.apply(void 0, arguments);\n eff.payload.resolve = true;\n return eff;\n};\nfunction all(effects) {\n var eff = makeEffect(ALL, effects);\n eff.combinator = true;\n return eff;\n}\nfunction race(effects) {\n var eff = makeEffect(RACE, effects);\n eff.combinator = true;\n return eff;\n} // this match getFnCallDescriptor logic\n\nvar validateFnDescriptor = function validateFnDescriptor(effectName, fnDescriptor) {\n check(fnDescriptor, notUndef, effectName + \": argument fn is undefined or null\");\n\n if (func(fnDescriptor)) {\n return;\n }\n\n var context = null;\n var fn;\n\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n check(fn, notUndef, effectName + \": argument of type [context, fn] has undefined or null `fn`\");\n } else if (object(fnDescriptor)) {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n check(fn, notUndef, effectName + \": argument of type {context, fn} has undefined or null `fn`\");\n } else {\n check(fnDescriptor, func, effectName + \": argument fn is not function\");\n return;\n }\n\n if (context && string(fn)) {\n check(context[fn], func, effectName + \": context arguments has no such method - \\\"\" + fn + \"\\\"\");\n return;\n }\n\n check(fn, func, effectName + \": unpacked fn argument (from [context, fn] or {context, fn}) is not a function\");\n};\n\nfunction getFnCallDescriptor(fnDescriptor, args) {\n var context = null;\n var fn;\n\n if (func(fnDescriptor)) {\n fn = fnDescriptor;\n } else {\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n } else {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n }\n\n if (context && string(fn) && func(context[fn])) {\n fn = context[fn];\n }\n }\n\n return {\n context: context,\n fn: fn,\n args: args\n };\n}\n\nvar isNotDelayEffect = function isNotDelayEffect(fn) {\n return fn !== delay;\n};\n\nfunction call(fnDescriptor) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var arg0 = typeof args[0] === 'number' ? args[0] : 'ms';\n check(fnDescriptor, isNotDelayEffect, \"instead of writing `yield call(delay, \" + arg0 + \")` where delay is an effect from `redux-saga/effects` you should write `yield delay(\" + arg0 + \")`\");\n validateFnDescriptor('call', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction apply(context, fn, args) {\n if (args === void 0) {\n args = [];\n }\n\n var fnDescriptor = [context, fn];\n\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('apply', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor([context, fn], args));\n}\nfunction cps(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('cps', fnDescriptor);\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return makeEffect(CPS, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction fork(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('fork', fnDescriptor);\n check(fnDescriptor, function (arg) {\n return !effect(arg);\n }, 'fork: argument must not be an effect');\n }\n\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return makeEffect(FORK, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction spawn(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('spawn', fnDescriptor);\n }\n\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n\n return detach(fork.apply(void 0, [fnDescriptor].concat(args)));\n}\nfunction join(taskOrTasks) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('join(...tasks) is not supported any more. Please use join([...tasks]) to join multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"join([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else {\n check(taskOrTasks, task, \"join(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(JOIN, taskOrTasks);\n}\nfunction cancel(taskOrTasks) {\n if (taskOrTasks === void 0) {\n taskOrTasks = SELF_CANCELLATION;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('cancel(...tasks) is not supported any more. Please use cancel([...tasks]) to cancel multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"cancel([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else if (taskOrTasks !== SELF_CANCELLATION && notUndef(taskOrTasks)) {\n check(taskOrTasks, task, \"cancel(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(CANCEL, taskOrTasks);\n}\nfunction select(selector) {\n if (selector === void 0) {\n selector = identity;\n }\n\n for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n args[_key5 - 1] = arguments[_key5];\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'select(selector, [...]): argument selector is undefined');\n check(selector, func, \"select(selector, [...]): argument \" + selector + \" is not a function\");\n }\n\n return makeEffect(SELECT, {\n selector: selector,\n args: args\n });\n}\n/**\n channel(pattern, [buffer]) => creates a proxy channel for store actions\n**/\n\nfunction actionChannel(pattern$1, buffer$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(pattern$1, pattern, 'actionChannel(pattern,...): argument pattern is not valid');\n\n if (arguments.length > 1) {\n check(buffer$1, notUndef, 'actionChannel(pattern, buffer): argument buffer is undefined');\n check(buffer$1, buffer, \"actionChannel(pattern, buffer): argument \" + buffer$1 + \" is not a valid buffer\");\n }\n }\n\n return makeEffect(ACTION_CHANNEL, {\n pattern: pattern$1,\n buffer: buffer$1\n });\n}\nfunction cancelled() {\n return makeEffect(CANCELLED, {});\n}\nfunction flush(channel$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(channel$1, channel, \"flush(channel): argument \" + channel$1 + \" is not valid channel\");\n }\n\n return makeEffect(FLUSH, channel$1);\n}\nfunction getContext(prop) {\n if (process.env.NODE_ENV !== 'production') {\n check(prop, string, \"getContext(prop): argument \" + prop + \" is not a string\");\n }\n\n return makeEffect(GET_CONTEXT, prop);\n}\nfunction setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning(null, props));\n }\n\n return makeEffect(SET_CONTEXT, props);\n}\nvar delay =\n/*#__PURE__*/\ncall.bind(null, delayP);\n\nexport { apply as $, ALL as A, logError as B, CALL as C, wrapSagaDispatch as D, identity as E, FORK as F, GET_CONTEXT as G, buffers as H, detach as I, JOIN as J, take as K, fork as L, cancel as M, call as N, delay as O, PUT as P, actionChannel as Q, RACE as R, SELECT as S, TAKE as T, sliding as U, race as V, effectTypes as W, takeMaybe as X, put as Y, putResolve as Z, all as _, CPS as a, cps as a0, spawn as a1, join as a2, select as a3, cancelled as a4, flush as a5, getContext as a6, setContext as a7, CANCEL as b, check as c, ACTION_CHANNEL as d, expanding as e, CANCELLED as f, FLUSH as g, SET_CONTEXT as h, internalErr as i, getMetaInfo as j, kTrue as k, createAllStyleChildCallbacks as l, createEmptyArray as m, none as n, once as o, assignWithSymbols as p, makeIterator as q, remove as r, shouldComplete as s, noop as t, flatMap as u, getLocation as v, createSetContextWarning as w, asyncIteratorSymbol as x, shouldCancel as y, shouldTerminate as z };\n","import { CHANNEL_END_TYPE, MULTICAST, MATCH, SAGA_ACTION, CANCEL, SELF_CANCELLATION, TERMINATE, TASK, TASK_CANCEL, IO } from '@redux-saga/symbols';\nexport { CANCEL, SAGA_LOCATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport { string as string$1, array as array$1, stringableFunc, func, symbol as symbol$1, buffer, notUndef, promise, iterator, undef, object, channel as channel$1 } from '@redux-saga/is';\nimport { k as kTrue, e as expanding, c as check, o as once, r as remove, n as none, i as internalErr, T as TAKE, P as PUT, A as ALL, R as RACE, C as CALL, a as CPS, F as FORK, J as JOIN, b as CANCEL$1, S as SELECT, d as ACTION_CHANNEL, f as CANCELLED$1, g as FLUSH, G as GET_CONTEXT, h as SET_CONTEXT, j as getMetaInfo, l as createAllStyleChildCallbacks, m as createEmptyArray, p as assignWithSymbols, q as makeIterator, s as shouldComplete, t as noop, u as flatMap, v as getLocation, w as createSetContextWarning, x as asyncIteratorSymbol, y as shouldCancel, z as shouldTerminate, B as logError, D as wrapSagaDispatch, E as identity } from './io-c3792963.js';\nexport { H as buffers, I as detach } from './io-c3792963.js';\nimport { compose } from 'redux';\nimport deferred from '@redux-saga/deferred';\nimport '@redux-saga/delay-p';\n\nvar queue = [];\n/**\n Variable to hold a counting semaphore\n - Incrementing adds a lock and puts the scheduler in a `suspended` state (if it's not\n already suspended)\n - Decrementing releases a lock. Zero locks puts the scheduler in a `released` state. This\n triggers flushing the queued tasks.\n**/\n\nvar semaphore = 0;\n/**\n Executes a task 'atomically'. Tasks scheduled during this execution will be queued\n and flushed after this task has finished (assuming the scheduler endup in a released\n state).\n**/\n\nfunction exec(task) {\n try {\n suspend();\n task();\n } finally {\n release();\n }\n}\n/**\n Executes or queues a task depending on the state of the scheduler (`suspended` or `released`)\n**/\n\n\nfunction asap(task) {\n queue.push(task);\n\n if (!semaphore) {\n suspend();\n flush();\n }\n}\n/**\n * Puts the scheduler in a `suspended` state and executes a task immediately.\n */\n\nfunction immediately(task) {\n try {\n suspend();\n return task();\n } finally {\n flush();\n }\n}\n/**\n Puts the scheduler in a `suspended` state. Scheduled tasks will be queued until the\n scheduler is released.\n**/\n\nfunction suspend() {\n semaphore++;\n}\n/**\n Puts the scheduler in a `released` state.\n**/\n\n\nfunction release() {\n semaphore--;\n}\n/**\n Releases the current lock. Executes all queued tasks if the scheduler is in the released state.\n**/\n\n\nfunction flush() {\n release();\n var task;\n\n while (!semaphore && (task = queue.shift()) !== undefined) {\n exec(task);\n }\n}\n\nvar array = function array(patterns) {\n return function (input) {\n return patterns.some(function (p) {\n return matcher(p)(input);\n });\n };\n};\nvar predicate = function predicate(_predicate) {\n return function (input) {\n return _predicate(input);\n };\n};\nvar string = function string(pattern) {\n return function (input) {\n return input.type === String(pattern);\n };\n};\nvar symbol = function symbol(pattern) {\n return function (input) {\n return input.type === pattern;\n };\n};\nvar wildcard = function wildcard() {\n return kTrue;\n};\nfunction matcher(pattern) {\n // prettier-ignore\n var matcherCreator = pattern === '*' ? wildcard : string$1(pattern) ? string : array$1(pattern) ? array : stringableFunc(pattern) ? string : func(pattern) ? predicate : symbol$1(pattern) ? symbol : null;\n\n if (matcherCreator === null) {\n throw new Error(\"invalid pattern: \" + pattern);\n }\n\n return matcherCreator(pattern);\n}\n\nvar END = {\n type: CHANNEL_END_TYPE\n};\nvar isEnd = function isEnd(a) {\n return a && a.type === CHANNEL_END_TYPE;\n};\nvar CLOSED_CHANNEL_WITH_TAKERS = 'Cannot have a closed channel with pending takers';\nvar INVALID_BUFFER = 'invalid buffer passed to channel factory function';\nvar UNDEFINED_INPUT_ERROR = \"Saga or channel was provided with an undefined action\\nHints:\\n - check that your Action Creator returns a non-undefined value\\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners\";\nfunction channel(buffer$1) {\n if (buffer$1 === void 0) {\n buffer$1 = expanding();\n }\n\n var closed = false;\n var takers = [];\n\n if (process.env.NODE_ENV !== 'production') {\n check(buffer$1, buffer, INVALID_BUFFER);\n }\n\n function checkForbiddenStates() {\n if (closed && takers.length) {\n throw internalErr(CLOSED_CHANNEL_WITH_TAKERS);\n }\n\n if (takers.length && !buffer$1.isEmpty()) {\n throw internalErr('Cannot have pending takers with non empty buffer');\n }\n }\n\n function put(input) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(input, notUndef, UNDEFINED_INPUT_ERROR);\n }\n\n if (closed) {\n return;\n }\n\n if (takers.length === 0) {\n return buffer$1.put(input);\n }\n\n var cb = takers.shift();\n cb(input);\n }\n\n function take(cb) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(cb, func, \"channel.take's callback must be a function\");\n }\n\n if (closed && buffer$1.isEmpty()) {\n cb(END);\n } else if (!buffer$1.isEmpty()) {\n cb(buffer$1.take());\n } else {\n takers.push(cb);\n\n cb.cancel = function () {\n remove(takers, cb);\n };\n }\n }\n\n function flush(cb) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(cb, func, \"channel.flush' callback must be a function\");\n }\n\n if (closed && buffer$1.isEmpty()) {\n cb(END);\n return;\n }\n\n cb(buffer$1.flush());\n }\n\n function close() {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n if (closed) {\n return;\n }\n\n closed = true;\n var arr = takers;\n takers = [];\n\n for (var i = 0, len = arr.length; i < len; i++) {\n var taker = arr[i];\n taker(END);\n }\n }\n\n return {\n take: take,\n put: put,\n flush: flush,\n close: close\n };\n}\nfunction eventChannel(subscribe, buffer) {\n if (buffer === void 0) {\n buffer = none();\n }\n\n var closed = false;\n var unsubscribe;\n var chan = channel(buffer);\n\n var close = function close() {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (func(unsubscribe)) {\n unsubscribe();\n }\n\n chan.close();\n };\n\n unsubscribe = subscribe(function (input) {\n if (isEnd(input)) {\n close();\n return;\n }\n\n chan.put(input);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n check(unsubscribe, func, 'in eventChannel: subscribe should return a function to unsubscribe');\n }\n\n unsubscribe = once(unsubscribe);\n\n if (closed) {\n unsubscribe();\n }\n\n return {\n take: chan.take,\n flush: chan.flush,\n close: close\n };\n}\nfunction multicastChannel() {\n var _ref;\n\n var closed = false;\n var currentTakers = [];\n var nextTakers = currentTakers;\n\n function checkForbiddenStates() {\n if (closed && nextTakers.length) {\n throw internalErr(CLOSED_CHANNEL_WITH_TAKERS);\n }\n }\n\n var ensureCanMutateNextTakers = function ensureCanMutateNextTakers() {\n if (nextTakers !== currentTakers) {\n return;\n }\n\n nextTakers = currentTakers.slice();\n };\n\n var close = function close() {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n closed = true;\n var takers = currentTakers = nextTakers;\n nextTakers = [];\n takers.forEach(function (taker) {\n taker(END);\n });\n };\n\n return _ref = {}, _ref[MULTICAST] = true, _ref.put = function put(input) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(input, notUndef, UNDEFINED_INPUT_ERROR);\n }\n\n if (closed) {\n return;\n }\n\n if (isEnd(input)) {\n close();\n return;\n }\n\n var takers = currentTakers = nextTakers;\n\n for (var i = 0, len = takers.length; i < len; i++) {\n var taker = takers[i];\n\n if (taker[MATCH](input)) {\n taker.cancel();\n taker(input);\n }\n }\n }, _ref.take = function take(cb, matcher) {\n if (matcher === void 0) {\n matcher = wildcard;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n if (closed) {\n cb(END);\n return;\n }\n\n cb[MATCH] = matcher;\n ensureCanMutateNextTakers();\n nextTakers.push(cb);\n cb.cancel = once(function () {\n ensureCanMutateNextTakers();\n remove(nextTakers, cb);\n });\n }, _ref.close = close, _ref;\n}\nfunction stdChannel() {\n var chan = multicastChannel();\n var put = chan.put;\n\n chan.put = function (input) {\n if (input[SAGA_ACTION]) {\n put(input);\n return;\n }\n\n asap(function () {\n put(input);\n });\n };\n\n return chan;\n}\n\nvar RUNNING = 0;\nvar CANCELLED = 1;\nvar ABORTED = 2;\nvar DONE = 3;\n\nfunction resolvePromise(promise, cb) {\n var cancelPromise = promise[CANCEL];\n\n if (func(cancelPromise)) {\n cb.cancel = cancelPromise;\n }\n\n promise.then(cb, function (error) {\n cb(error, true);\n });\n}\n\nvar current = 0;\nvar nextSagaId = (function () {\n return ++current;\n});\n\nvar _effectRunnerMap;\n\nfunction getIteratorMetaInfo(iterator, fn) {\n if (iterator.isSagaIterator) {\n return {\n name: iterator.meta.name\n };\n }\n\n return getMetaInfo(fn);\n}\n\nfunction createTaskIterator(_ref) {\n var context = _ref.context,\n fn = _ref.fn,\n args = _ref.args;\n\n // catch synchronous failures; see #152 and #441\n try {\n var result = fn.apply(context, args); // i.e. a generator function returns an iterator\n\n if (iterator(result)) {\n return result;\n }\n\n var resolved = false;\n\n var next = function next(arg) {\n if (!resolved) {\n resolved = true; // Only promises returned from fork will be interpreted. See #1573\n\n return {\n value: result,\n done: !promise(result)\n };\n } else {\n return {\n value: arg,\n done: true\n };\n }\n };\n\n return makeIterator(next);\n } catch (err) {\n // do not bubble up synchronous failures for detached forks\n // instead create a failed task. See #152 and #441\n return makeIterator(function () {\n throw err;\n });\n }\n}\n\nfunction runPutEffect(env, _ref2, cb) {\n var channel = _ref2.channel,\n action = _ref2.action,\n resolve = _ref2.resolve;\n\n /**\n Schedule the put in case another saga is holding a lock.\n The put will be executed atomically. ie nested puts will execute after\n this put has terminated.\n **/\n asap(function () {\n var result;\n\n try {\n result = (channel ? channel.put : env.dispatch)(action);\n } catch (error) {\n cb(error, true);\n return;\n }\n\n if (resolve && promise(result)) {\n resolvePromise(result, cb);\n } else {\n cb(result);\n }\n }); // Put effects are non cancellables\n}\n\nfunction runTakeEffect(env, _ref3, cb) {\n var _ref3$channel = _ref3.channel,\n channel = _ref3$channel === void 0 ? env.channel : _ref3$channel,\n pattern = _ref3.pattern,\n maybe = _ref3.maybe;\n\n var takeCb = function takeCb(input) {\n if (input instanceof Error) {\n cb(input, true);\n return;\n }\n\n if (isEnd(input) && !maybe) {\n cb(TERMINATE);\n return;\n }\n\n cb(input);\n };\n\n try {\n channel.take(takeCb, notUndef(pattern) ? matcher(pattern) : null);\n } catch (err) {\n cb(err, true);\n return;\n }\n\n cb.cancel = takeCb.cancel;\n}\n\nfunction runCallEffect(env, _ref4, cb, _ref5) {\n var context = _ref4.context,\n fn = _ref4.fn,\n args = _ref4.args;\n var task = _ref5.task;\n\n // catch synchronous failures; see #152\n try {\n var result = fn.apply(context, args);\n\n if (promise(result)) {\n resolvePromise(result, cb);\n return;\n }\n\n if (iterator(result)) {\n // resolve iterator\n proc(env, result, task.context, current, getMetaInfo(fn),\n /* isRoot */\n false, cb);\n return;\n }\n\n cb(result);\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runCPSEffect(env, _ref6, cb) {\n var context = _ref6.context,\n fn = _ref6.fn,\n args = _ref6.args;\n\n // CPS (ie node style functions) can define their own cancellation logic\n // by setting cancel field on the cb\n // catch synchronous failures; see #152\n try {\n var cpsCb = function cpsCb(err, res) {\n if (undef(err)) {\n cb(res);\n } else {\n cb(err, true);\n }\n };\n\n fn.apply(context, args.concat(cpsCb));\n\n if (cpsCb.cancel) {\n cb.cancel = cpsCb.cancel;\n }\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runForkEffect(env, _ref7, cb, _ref8) {\n var context = _ref7.context,\n fn = _ref7.fn,\n args = _ref7.args,\n detached = _ref7.detached;\n var parent = _ref8.task;\n var taskIterator = createTaskIterator({\n context: context,\n fn: fn,\n args: args\n });\n var meta = getIteratorMetaInfo(taskIterator, fn);\n immediately(function () {\n var child = proc(env, taskIterator, parent.context, current, meta, detached, undefined);\n\n if (detached) {\n cb(child);\n } else {\n if (child.isRunning()) {\n parent.queue.addTask(child);\n cb(child);\n } else if (child.isAborted()) {\n parent.queue.abort(child.error());\n } else {\n cb(child);\n }\n }\n }); // Fork effects are non cancellables\n}\n\nfunction runJoinEffect(env, taskOrTasks, cb, _ref9) {\n var task = _ref9.task;\n\n var joinSingleTask = function joinSingleTask(taskToJoin, cb) {\n if (taskToJoin.isRunning()) {\n var joiner = {\n task: task,\n cb: cb\n };\n\n cb.cancel = function () {\n if (taskToJoin.isRunning()) remove(taskToJoin.joiners, joiner);\n };\n\n taskToJoin.joiners.push(joiner);\n } else {\n if (taskToJoin.isAborted()) {\n cb(taskToJoin.error(), true);\n } else {\n cb(taskToJoin.result());\n }\n }\n };\n\n if (array$1(taskOrTasks)) {\n if (taskOrTasks.length === 0) {\n cb([]);\n return;\n }\n\n var childCallbacks = createAllStyleChildCallbacks(taskOrTasks, cb);\n taskOrTasks.forEach(function (t, i) {\n joinSingleTask(t, childCallbacks[i]);\n });\n } else {\n joinSingleTask(taskOrTasks, cb);\n }\n}\n\nfunction cancelSingleTask(taskToCancel) {\n if (taskToCancel.isRunning()) {\n taskToCancel.cancel();\n }\n}\n\nfunction runCancelEffect(env, taskOrTasks, cb, _ref10) {\n var task = _ref10.task;\n\n if (taskOrTasks === SELF_CANCELLATION) {\n cancelSingleTask(task);\n } else if (array$1(taskOrTasks)) {\n taskOrTasks.forEach(cancelSingleTask);\n } else {\n cancelSingleTask(taskOrTasks);\n }\n\n cb(); // cancel effects are non cancellables\n}\n\nfunction runAllEffect(env, effects, cb, _ref11) {\n var digestEffect = _ref11.digestEffect;\n var effectId = current;\n var keys = Object.keys(effects);\n\n if (keys.length === 0) {\n cb(array$1(effects) ? [] : {});\n return;\n }\n\n var childCallbacks = createAllStyleChildCallbacks(effects, cb);\n keys.forEach(function (key) {\n digestEffect(effects[key], effectId, childCallbacks[key], key);\n });\n}\n\nfunction runRaceEffect(env, effects, cb, _ref12) {\n var digestEffect = _ref12.digestEffect;\n var effectId = current;\n var keys = Object.keys(effects);\n var response = array$1(effects) ? createEmptyArray(keys.length) : {};\n var childCbs = {};\n var completed = false;\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n // Race Auto cancellation\n cb.cancel();\n cb(res, isErr);\n } else {\n cb.cancel();\n completed = true;\n response[key] = res;\n cb(response);\n }\n };\n\n chCbAtKey.cancel = noop;\n childCbs[key] = chCbAtKey;\n });\n\n cb.cancel = function () {\n // prevents unnecessary cancellation\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCbs[key].cancel();\n });\n }\n };\n\n keys.forEach(function (key) {\n if (completed) {\n return;\n }\n\n digestEffect(effects[key], effectId, childCbs[key], key);\n });\n}\n\nfunction runSelectEffect(env, _ref13, cb) {\n var selector = _ref13.selector,\n args = _ref13.args;\n\n try {\n var state = selector.apply(void 0, [env.getState()].concat(args));\n cb(state);\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runChannelEffect(env, _ref14, cb) {\n var pattern = _ref14.pattern,\n buffer = _ref14.buffer;\n var chan = channel(buffer);\n var match = matcher(pattern);\n\n var taker = function taker(action) {\n if (!isEnd(action)) {\n env.channel.take(taker, match);\n }\n\n chan.put(action);\n };\n\n var close = chan.close;\n\n chan.close = function () {\n taker.cancel();\n close();\n };\n\n env.channel.take(taker, match);\n cb(chan);\n}\n\nfunction runCancelledEffect(env, data, cb, _ref15) {\n var task = _ref15.task;\n cb(task.isCancelled());\n}\n\nfunction runFlushEffect(env, channel, cb) {\n channel.flush(cb);\n}\n\nfunction runGetContextEffect(env, prop, cb, _ref16) {\n var task = _ref16.task;\n cb(task.context[prop]);\n}\n\nfunction runSetContextEffect(env, props, cb, _ref17) {\n var task = _ref17.task;\n assignWithSymbols(task.context, props);\n cb();\n}\n\nvar effectRunnerMap = (_effectRunnerMap = {}, _effectRunnerMap[TAKE] = runTakeEffect, _effectRunnerMap[PUT] = runPutEffect, _effectRunnerMap[ALL] = runAllEffect, _effectRunnerMap[RACE] = runRaceEffect, _effectRunnerMap[CALL] = runCallEffect, _effectRunnerMap[CPS] = runCPSEffect, _effectRunnerMap[FORK] = runForkEffect, _effectRunnerMap[JOIN] = runJoinEffect, _effectRunnerMap[CANCEL$1] = runCancelEffect, _effectRunnerMap[SELECT] = runSelectEffect, _effectRunnerMap[ACTION_CHANNEL] = runChannelEffect, _effectRunnerMap[CANCELLED$1] = runCancelledEffect, _effectRunnerMap[FLUSH] = runFlushEffect, _effectRunnerMap[GET_CONTEXT] = runGetContextEffect, _effectRunnerMap[SET_CONTEXT] = runSetContextEffect, _effectRunnerMap);\n\n/**\n Used to track a parent task and its forks\n In the fork model, forked tasks are attached by default to their parent\n We model this using the concept of Parent task && main Task\n main task is the main flow of the current Generator, the parent tasks is the\n aggregation of the main tasks + all its forked tasks.\n Thus the whole model represents an execution tree with multiple branches (vs the\n linear execution tree in sequential (non parallel) programming)\n\n A parent tasks has the following semantics\n - It completes if all its forks either complete or all cancelled\n - If it's cancelled, all forks are cancelled as well\n - It aborts if any uncaught error bubbles up from forks\n - If it completes, the return value is the one returned by the main task\n **/\n\nfunction forkQueue(mainTask, onAbort, cont) {\n var tasks = [];\n var result;\n var completed = false;\n addTask(mainTask);\n\n var getTasks = function getTasks() {\n return tasks;\n };\n\n function abort(err) {\n onAbort();\n cancelAll();\n cont(err, true);\n }\n\n function addTask(task) {\n tasks.push(task);\n\n task.cont = function (res, isErr) {\n if (completed) {\n return;\n }\n\n remove(tasks, task);\n task.cont = noop;\n\n if (isErr) {\n abort(res);\n } else {\n if (task === mainTask) {\n result = res;\n }\n\n if (!tasks.length) {\n completed = true;\n cont(result);\n }\n }\n };\n }\n\n function cancelAll() {\n if (completed) {\n return;\n }\n\n completed = true;\n tasks.forEach(function (t) {\n t.cont = noop;\n t.cancel();\n });\n tasks = [];\n }\n\n return {\n addTask: addTask,\n cancelAll: cancelAll,\n abort: abort,\n getTasks: getTasks\n };\n}\n\n// there can be only a single saga error created at any given moment\n\nfunction formatLocation(fileName, lineNumber) {\n return fileName + \"?\" + lineNumber;\n}\n\nfunction effectLocationAsString(effect) {\n var location = getLocation(effect);\n\n if (location) {\n var code = location.code,\n fileName = location.fileName,\n lineNumber = location.lineNumber;\n var source = code + \" \" + formatLocation(fileName, lineNumber);\n return source;\n }\n\n return '';\n}\n\nfunction sagaLocationAsString(sagaMeta) {\n var name = sagaMeta.name,\n location = sagaMeta.location;\n\n if (location) {\n return name + \" \" + formatLocation(location.fileName, location.lineNumber);\n }\n\n return name;\n}\n\nfunction cancelledTasksAsString(sagaStack) {\n var cancelledTasks = flatMap(function (i) {\n return i.cancelledTasks;\n }, sagaStack);\n\n if (!cancelledTasks.length) {\n return '';\n }\n\n return ['Tasks cancelled due to error:'].concat(cancelledTasks).join('\\n');\n}\n\nvar crashedEffect = null;\nvar sagaStack = [];\nvar addSagaFrame = function addSagaFrame(frame) {\n frame.crashedEffect = crashedEffect;\n sagaStack.push(frame);\n};\nvar clear = function clear() {\n crashedEffect = null;\n sagaStack.length = 0;\n}; // this sets crashed effect for the soon-to-be-reported saga frame\n// this slightly streatches the singleton nature of this module into wrong direction\n// as it's even less obvious what's the data flow here, but it is what it is for now\n\nvar setCrashedEffect = function setCrashedEffect(effect) {\n crashedEffect = effect;\n};\n/**\n @returns {string}\n\n @example\n The above error occurred in task errorInPutSaga {pathToFile}\n when executing effect put({type: 'REDUCER_ACTION_ERROR_IN_PUT'}) {pathToFile}\n created by fetchSaga {pathToFile}\n created by rootSaga {pathToFile}\n*/\n\nvar toString = function toString() {\n var firstSaga = sagaStack[0],\n otherSagas = sagaStack.slice(1);\n var crashedEffectLocation = firstSaga.crashedEffect ? effectLocationAsString(firstSaga.crashedEffect) : null;\n var errorMessage = \"The above error occurred in task \" + sagaLocationAsString(firstSaga.meta) + (crashedEffectLocation ? \" \\n when executing effect \" + crashedEffectLocation : '');\n return [errorMessage].concat(otherSagas.map(function (s) {\n return \" created by \" + sagaLocationAsString(s.meta);\n }), [cancelledTasksAsString(sagaStack)]).join('\\n');\n};\n\nfunction newTask(env, mainTask, parentContext, parentEffectId, meta, isRoot, cont) {\n var _task;\n\n if (cont === void 0) {\n cont = noop;\n }\n\n var status = RUNNING;\n var taskResult;\n var taskError;\n var deferredEnd = null;\n var cancelledDueToErrorTasks = [];\n var context = Object.create(parentContext);\n var queue = forkQueue(mainTask, function onAbort() {\n cancelledDueToErrorTasks.push.apply(cancelledDueToErrorTasks, queue.getTasks().map(function (t) {\n return t.meta.name;\n }));\n }, end);\n /**\n This may be called by a parent generator to trigger/propagate cancellation\n cancel all pending tasks (including the main task), then end the current task.\n Cancellation propagates down to the whole execution tree held by this Parent task\n It's also propagated to all joiners of this task and their execution tree/joiners\n Cancellation is noop for terminated/Cancelled tasks tasks\n **/\n\n function cancel() {\n if (status === RUNNING) {\n // Setting status to CANCELLED does not necessarily mean that the task/iterators are stopped\n // effects in the iterator's finally block will still be executed\n status = CANCELLED;\n queue.cancelAll(); // Ending with a TASK_CANCEL will propagate the Cancellation to all joiners\n\n end(TASK_CANCEL, false);\n }\n }\n\n function end(result, isErr) {\n if (!isErr) {\n // The status here may be RUNNING or CANCELLED\n // If the status is CANCELLED, then we do not need to change it here\n if (result === TASK_CANCEL) {\n status = CANCELLED;\n } else if (status !== CANCELLED) {\n status = DONE;\n }\n\n taskResult = result;\n deferredEnd && deferredEnd.resolve(result);\n } else {\n status = ABORTED;\n addSagaFrame({\n meta: meta,\n cancelledTasks: cancelledDueToErrorTasks\n });\n\n if (task.isRoot) {\n var sagaStack = toString(); // we've dumped the saga stack to string and are passing it to user's code\n // we know that it won't be needed anymore and we need to clear it\n\n clear();\n env.onError(result, {\n sagaStack: sagaStack\n });\n }\n\n taskError = result;\n deferredEnd && deferredEnd.reject(result);\n }\n\n task.cont(result, isErr);\n task.joiners.forEach(function (joiner) {\n joiner.cb(result, isErr);\n });\n task.joiners = null;\n }\n\n function setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning('task', props));\n }\n\n assignWithSymbols(context, props);\n }\n\n function toPromise() {\n if (deferredEnd) {\n return deferredEnd.promise;\n }\n\n deferredEnd = deferred();\n\n if (status === ABORTED) {\n deferredEnd.reject(taskError);\n } else if (status !== RUNNING) {\n deferredEnd.resolve(taskResult);\n }\n\n return deferredEnd.promise;\n }\n\n var task = (_task = {}, _task[TASK] = true, _task.id = parentEffectId, _task.meta = meta, _task.isRoot = isRoot, _task.context = context, _task.joiners = [], _task.queue = queue, _task.cancel = cancel, _task.cont = cont, _task.end = end, _task.setContext = setContext, _task.toPromise = toPromise, _task.isRunning = function isRunning() {\n return status === RUNNING;\n }, _task.isCancelled = function isCancelled() {\n return status === CANCELLED || status === RUNNING && mainTask.status === CANCELLED;\n }, _task.isAborted = function isAborted() {\n return status === ABORTED;\n }, _task.result = function result() {\n return taskResult;\n }, _task.error = function error() {\n return taskError;\n }, _task);\n return task;\n}\n\nfunction proc(env, iterator$1, parentContext, parentEffectId, meta, isRoot, cont) {\n if (process.env.NODE_ENV !== 'production' && iterator$1[asyncIteratorSymbol]) {\n throw new Error(\"redux-saga doesn't support async generators, please use only regular ones\");\n }\n\n var finalRunEffect = env.finalizeRunEffect(runEffect);\n /**\n Tracks the current effect cancellation\n Each time the generator progresses. calling runEffect will set a new value\n on it. It allows propagating cancellation to child effects\n **/\n\n next.cancel = noop;\n /** Creates a main task to track the main flow */\n\n var mainTask = {\n meta: meta,\n cancel: cancelMain,\n status: RUNNING\n };\n /**\n Creates a new task descriptor for this generator.\n A task is the aggregation of it's mainTask and all it's forked tasks.\n **/\n\n var task = newTask(env, mainTask, parentContext, parentEffectId, meta, isRoot, cont);\n var executingContext = {\n task: task,\n digestEffect: digestEffect\n };\n /**\n cancellation of the main task. We'll simply resume the Generator with a TASK_CANCEL\n **/\n\n function cancelMain() {\n if (mainTask.status === RUNNING) {\n mainTask.status = CANCELLED;\n next(TASK_CANCEL);\n }\n }\n /**\n attaches cancellation logic to this task's continuation\n this will permit cancellation to propagate down the call chain\n **/\n\n\n if (cont) {\n cont.cancel = task.cancel;\n } // kicks up the generator\n\n\n next(); // then return the task descriptor to the caller\n\n return task;\n /**\n * This is the generator driver\n * It's a recursive async/continuation function which calls itself\n * until the generator terminates or throws\n * @param {internal commands(TASK_CANCEL | TERMINATE) | any} arg - value, generator will be resumed with.\n * @param {boolean} isErr - the flag shows if effect finished with an error\n *\n * receives either (command | effect result, false) or (any thrown thing, true)\n */\n\n function next(arg, isErr) {\n try {\n var result;\n\n if (isErr) {\n result = iterator$1.throw(arg); // user handled the error, we can clear bookkept values\n\n clear();\n } else if (shouldCancel(arg)) {\n /**\n getting TASK_CANCEL automatically cancels the main task\n We can get this value here\n - By cancelling the parent task manually\n - By joining a Cancelled task\n **/\n mainTask.status = CANCELLED;\n /**\n Cancels the current effect; this will propagate the cancellation down to any called tasks\n **/\n\n next.cancel();\n /**\n If this Generator has a `return` method then invokes it\n This will jump to the finally block\n **/\n\n result = func(iterator$1.return) ? iterator$1.return(TASK_CANCEL) : {\n done: true,\n value: TASK_CANCEL\n };\n } else if (shouldTerminate(arg)) {\n // We get TERMINATE flag, i.e. by taking from a channel that ended using `take` (and not `takem` used to trap End of channels)\n result = func(iterator$1.return) ? iterator$1.return() : {\n done: true\n };\n } else {\n result = iterator$1.next(arg);\n }\n\n if (!result.done) {\n digestEffect(result.value, parentEffectId, next);\n } else {\n /**\n This Generator has ended, terminate the main task and notify the fork queue\n **/\n if (mainTask.status !== CANCELLED) {\n mainTask.status = DONE;\n }\n\n mainTask.cont(result.value);\n }\n } catch (error) {\n if (mainTask.status === CANCELLED) {\n throw error;\n }\n\n mainTask.status = ABORTED;\n mainTask.cont(error, true);\n }\n }\n\n function runEffect(effect, effectId, currCb) {\n /**\n each effect runner must attach its own logic of cancellation to the provided callback\n it allows this generator to propagate cancellation downward.\n ATTENTION! effect runners must setup the cancel logic by setting cb.cancel = [cancelMethod]\n And the setup must occur before calling the callback\n This is a sort of inversion of control: called async functions are responsible\n of completing the flow by calling the provided continuation; while caller functions\n are responsible for aborting the current flow by calling the attached cancel function\n Library users can attach their own cancellation logic to promises by defining a\n promise[CANCEL] method in their returned promises\n ATTENTION! calling cancel must have no effect on an already completed or cancelled effect\n **/\n if (promise(effect)) {\n resolvePromise(effect, currCb);\n } else if (iterator(effect)) {\n // resolve iterator\n proc(env, effect, task.context, effectId, meta,\n /* isRoot */\n false, currCb);\n } else if (effect && effect[IO]) {\n var effectRunner = effectRunnerMap[effect.type];\n effectRunner(env, effect.payload, currCb, executingContext);\n } else {\n // anything else returned as is\n currCb(effect);\n }\n }\n\n function digestEffect(effect, parentEffectId, cb, label) {\n if (label === void 0) {\n label = '';\n }\n\n var effectId = nextSagaId();\n env.sagaMonitor && env.sagaMonitor.effectTriggered({\n effectId: effectId,\n parentEffectId: parentEffectId,\n label: label,\n effect: effect\n });\n /**\n completion callback and cancel callback are mutually exclusive\n We can't cancel an already completed effect\n And We can't complete an already cancelled effectId\n **/\n\n var effectSettled; // Completion callback passed to the appropriate effect runner\n\n function currCb(res, isErr) {\n if (effectSettled) {\n return;\n }\n\n effectSettled = true;\n cb.cancel = noop; // defensive measure\n\n if (env.sagaMonitor) {\n if (isErr) {\n env.sagaMonitor.effectRejected(effectId, res);\n } else {\n env.sagaMonitor.effectResolved(effectId, res);\n }\n }\n\n if (isErr) {\n setCrashedEffect(effect);\n }\n\n cb(res, isErr);\n } // tracks down the current cancel\n\n\n currCb.cancel = noop; // setup cancellation logic on the parent cb\n\n cb.cancel = function () {\n // prevents cancelling an already completed effect\n if (effectSettled) {\n return;\n }\n\n effectSettled = true;\n currCb.cancel(); // propagates cancel downward\n\n currCb.cancel = noop; // defensive measure\n\n env.sagaMonitor && env.sagaMonitor.effectCancelled(effectId);\n };\n\n finalRunEffect(effect, effectId, currCb);\n }\n}\n\nvar RUN_SAGA_SIGNATURE = 'runSaga(options, saga, ...args)';\nvar NON_GENERATOR_ERR = RUN_SAGA_SIGNATURE + \": saga argument must be a Generator function!\";\nfunction runSaga(_ref, saga) {\n var _ref$channel = _ref.channel,\n channel = _ref$channel === void 0 ? stdChannel() : _ref$channel,\n dispatch = _ref.dispatch,\n getState = _ref.getState,\n _ref$context = _ref.context,\n context = _ref$context === void 0 ? {} : _ref$context,\n sagaMonitor = _ref.sagaMonitor,\n effectMiddlewares = _ref.effectMiddlewares,\n _ref$onError = _ref.onError,\n onError = _ref$onError === void 0 ? logError : _ref$onError;\n\n if (process.env.NODE_ENV !== 'production') {\n check(saga, func, NON_GENERATOR_ERR);\n }\n\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n var iterator$1 = saga.apply(void 0, args);\n\n if (process.env.NODE_ENV !== 'production') {\n check(iterator$1, iterator, NON_GENERATOR_ERR);\n }\n\n var effectId = nextSagaId();\n\n if (sagaMonitor) {\n // monitors are expected to have a certain interface, let's fill-in any missing ones\n sagaMonitor.rootSagaStarted = sagaMonitor.rootSagaStarted || noop;\n sagaMonitor.effectTriggered = sagaMonitor.effectTriggered || noop;\n sagaMonitor.effectResolved = sagaMonitor.effectResolved || noop;\n sagaMonitor.effectRejected = sagaMonitor.effectRejected || noop;\n sagaMonitor.effectCancelled = sagaMonitor.effectCancelled || noop;\n sagaMonitor.actionDispatched = sagaMonitor.actionDispatched || noop;\n sagaMonitor.rootSagaStarted({\n effectId: effectId,\n saga: saga,\n args: args\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (notUndef(dispatch)) {\n check(dispatch, func, 'dispatch must be a function');\n }\n\n if (notUndef(getState)) {\n check(getState, func, 'getState must be a function');\n }\n\n if (notUndef(effectMiddlewares)) {\n var MIDDLEWARE_TYPE_ERROR = 'effectMiddlewares must be an array of functions';\n check(effectMiddlewares, array$1, MIDDLEWARE_TYPE_ERROR);\n effectMiddlewares.forEach(function (effectMiddleware) {\n return check(effectMiddleware, func, MIDDLEWARE_TYPE_ERROR);\n });\n }\n\n check(onError, func, 'onError passed to the redux-saga is not a function!');\n }\n\n var finalizeRunEffect;\n\n if (effectMiddlewares) {\n var middleware = compose.apply(void 0, effectMiddlewares);\n\n finalizeRunEffect = function finalizeRunEffect(runEffect) {\n return function (effect, effectId, currCb) {\n var plainRunEffect = function plainRunEffect(eff) {\n return runEffect(eff, effectId, currCb);\n };\n\n return middleware(plainRunEffect)(effect);\n };\n };\n } else {\n finalizeRunEffect = identity;\n }\n\n var env = {\n channel: channel,\n dispatch: wrapSagaDispatch(dispatch),\n getState: getState,\n sagaMonitor: sagaMonitor,\n onError: onError,\n finalizeRunEffect: finalizeRunEffect\n };\n return immediately(function () {\n var task = proc(env, iterator$1, context, effectId, getMetaInfo(saga),\n /* isRoot */\n true, undefined);\n\n if (sagaMonitor) {\n sagaMonitor.effectResolved(effectId, task);\n }\n\n return task;\n });\n}\n\nfunction sagaMiddlewareFactory(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$context = _ref.context,\n context = _ref$context === void 0 ? {} : _ref$context,\n _ref$channel = _ref.channel,\n channel = _ref$channel === void 0 ? stdChannel() : _ref$channel,\n sagaMonitor = _ref.sagaMonitor,\n options = _objectWithoutPropertiesLoose(_ref, [\"context\", \"channel\", \"sagaMonitor\"]);\n\n var boundRunSaga;\n\n if (process.env.NODE_ENV !== 'production') {\n check(channel, channel$1, 'options.channel passed to the Saga middleware is not a channel');\n }\n\n function sagaMiddleware(_ref2) {\n var getState = _ref2.getState,\n dispatch = _ref2.dispatch;\n boundRunSaga = runSaga.bind(null, _extends({}, options, {\n context: context,\n channel: channel,\n dispatch: dispatch,\n getState: getState,\n sagaMonitor: sagaMonitor\n }));\n return function (next) {\n return function (action) {\n if (sagaMonitor && sagaMonitor.actionDispatched) {\n sagaMonitor.actionDispatched(action);\n }\n\n var result = next(action); // hit reducers\n\n channel.put(action);\n return result;\n };\n };\n }\n\n sagaMiddleware.run = function () {\n if (process.env.NODE_ENV !== 'production' && !boundRunSaga) {\n throw new Error('Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware');\n }\n\n return boundRunSaga.apply(void 0, arguments);\n };\n\n sagaMiddleware.setContext = function (props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning('sagaMiddleware', props));\n }\n\n assignWithSymbols(context, props);\n };\n\n return sagaMiddleware;\n}\n\nexport default sagaMiddlewareFactory;\nexport { END, channel, eventChannel, isEnd, multicastChannel, runSaga, stdChannel };\n","function deferred() {\n var def = {};\n def.promise = new Promise(function (resolve, reject) {\n def.resolve = resolve;\n def.reject = reject;\n });\n return def;\n}\nfunction arrayOfDeferred(length) {\n var arr = [];\n\n for (var i = 0; i < length; i++) {\n arr.push(deferred());\n }\n\n return arr;\n}\n\nexport default deferred;\nexport { arrayOfDeferred };\n","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nvar __export = (target, all2) => {\n for (var name in all2)\n __defProp(target, name, { get: all2[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, \"default\"), secondTarget && __copyProps(secondTarget, mod, \"default\"));\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/utils/constants.ts\nvar DEFAULT_HOST = \"wss://relay.signalwire.com\";\nvar EVENT_NAMESPACE_DIVIDER = \":\";\nvar LOCAL_EVENT_PREFIX = \"__local__\";\nvar SYNTHETIC_EVENT_PREFIX = \"__synthetic__\";\nvar PRODUCT_PREFIX_VIDEO = \"video\";\nvar PRODUCT_PREFIX_CHAT = \"chat\";\nvar PRODUCT_PREFIX_PUBSUB = \"chat\";\nvar GLOBAL_VIDEO_EVENTS = [\"room.started\", \"room.ended\"];\nvar INTERNAL_GLOBAL_VIDEO_EVENTS = GLOBAL_VIDEO_EVENTS.map((event) => `${PRODUCT_PREFIX_VIDEO}.${event}`);\n\n// src/utils/logger.ts\nimport log from \"loglevel\";\nvar datetime = () => new Date().toISOString();\nvar defaultLogger = log.getLogger(\"signalwire\");\nvar originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return function(...args) {\n args.unshift(datetime(), \"-\");\n rawMethod.apply(void 0, args);\n };\n};\nvar defaultLoggerLevel = process.env.NODE_ENV === \"development\" ? defaultLogger.levels.DEBUG : defaultLogger.getLevel();\ndefaultLogger.setLevel(defaultLoggerLevel);\nvar userLogger;\nvar setLogger = (logger) => {\n userLogger = logger;\n};\nvar debugOptions = {};\nvar setDebugOptions = (options) => {\n if (options == null) {\n debugOptions = {};\n return;\n }\n Object.assign(debugOptions, options);\n};\nvar getLoggerInstance = () => {\n return userLogger != null ? userLogger : defaultLogger;\n};\nvar shouldStringify = (payload) => {\n if (\"method\" in payload && payload.method === \"signalwire.ping\") {\n return false;\n }\n return true;\n};\nvar wsTraffic = ({ type, payload }) => {\n const logger = getLoggerInstance();\n const { logWsTraffic } = debugOptions || {};\n if (!logWsTraffic) {\n return void 0;\n }\n const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;\n return logger.info(`${type.toUpperCase()}: \n`, msg, \"\\n\");\n};\nvar getLogger = () => {\n const logger = getLoggerInstance();\n return new Proxy(logger, {\n get(target, prop, receiver) {\n if (prop === \"wsTraffic\") {\n return wsTraffic;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n};\n\n// src/utils/common.ts\nvar UPPERCASE_REGEX = /[A-Z]/g;\nvar fromCamelToSnakeCase = (event) => {\n return event.replace(UPPERCASE_REGEX, (letter) => {\n return `_${letter.toLowerCase()}`;\n });\n};\nvar WEBRTC_EVENT_TYPES = [\n \"webrtc.message\"\n];\nvar isWebrtcEventType = (eventType) => {\n return WEBRTC_EVENT_TYPES.includes(eventType);\n};\n\n// src/utils/index.ts\nimport { v4 } from \"uuid\";\n\n// src/utils/parseRPCResponse.ts\nvar parseRPCResponse = ({\n response,\n request\n}) => {\n const { result = {}, error } = response;\n if (error) {\n return {\n error\n };\n }\n switch (request.method) {\n case \"signalwire.connect\":\n return { result };\n default:\n return parseResponse(response);\n }\n};\nvar whitelistCodeRegex = /^2[0-9][0-9]$/;\nvar parseResponse = (response, nodeId) => {\n const { result = {}, error } = response;\n if (error) {\n return { error };\n }\n const { code, node_id, result: nestedResult = null } = result;\n if (code && !whitelistCodeRegex.test(code)) {\n return { error: result };\n }\n if (nestedResult === null) {\n if (nodeId) {\n result.node_id = nodeId;\n }\n return { result };\n }\n if (nestedResult) {\n if (nestedResult.jsonrpc) {\n return parseResponse(nestedResult, node_id);\n }\n return { result: nestedResult };\n }\n return { result };\n};\n\n// src/utils/toExternalJSON.ts\nvar toDateObject = (timestamp) => {\n if (typeof timestamp === \"undefined\") {\n return timestamp;\n }\n const date = new Date(timestamp * 1e3);\n if (isNaN(date.getTime())) {\n return timestamp;\n }\n return date;\n};\nvar DEFAULT_OPTIONS = {\n propsToUpdateValue: [\n \"updated\",\n \"layers\",\n \"members\",\n \"recordings\",\n \"playbacks\"\n ]\n};\nvar isTimestampProperty = (prop) => {\n return prop.endsWith(\"At\");\n};\nvar toExternalJSON = (input, options = DEFAULT_OPTIONS) => {\n if ((input == null ? void 0 : input.__sw_symbol) || (input == null ? void 0 : input.__sw_proxy)) {\n return input;\n }\n return Object.entries(input).reduce((reducer, [key, value]) => {\n const prop = fromSnakeToCamelCase(key);\n const propType = typeof value;\n if (propType === \"object\" && value) {\n if (Array.isArray(value)) {\n if (options.propsToUpdateValue.includes(key)) {\n reducer[prop] = value.map((v) => {\n if (typeof v === \"string\") {\n return fromSnakeToCamelCase(v);\n }\n return toExternalJSON(v);\n });\n } else {\n reducer[prop] = value;\n }\n } else {\n reducer[prop] = toExternalJSON(value);\n }\n } else {\n if (isTimestampProperty(prop)) {\n reducer[prop] = toDateObject(value);\n } else {\n reducer[prop] = value;\n }\n }\n return reducer;\n }, {});\n};\nvar fromSnakeToCamelCase = (input) => {\n if (!input.includes(\"_\")) {\n return input;\n }\n return input.split(\"_\").reduce((reducer, part, index) => {\n const fc = part.trim().charAt(0);\n const remainingChars = part.substr(1).toLowerCase();\n return `${reducer}${index === 0 ? fc.toLowerCase() : fc.toUpperCase()}${remainingChars}`;\n }, \"\");\n};\n\n// src/utils/toInternalEventName.ts\nvar toInternalEventName = ({\n event,\n namespace\n}) => {\n if (typeof event === \"string\") {\n event = getNamespacedEvent({\n event,\n namespace\n });\n event = fromCamelToSnakeCase(event);\n }\n return event;\n};\nvar getNamespacedEvent = ({\n namespace,\n event\n}) => {\n if (!namespace || event.startsWith(namespace)) {\n return event;\n }\n return `${namespace}${EVENT_NAMESPACE_DIVIDER}${event}`;\n};\n\n// src/utils/toInternalAction.ts\nvar toInternalAction = (event) => {\n const { event_type, params, node_id } = event;\n if (event_type === \"queuing.relay.tasks\") {\n return {\n type: event_type,\n payload: event\n };\n }\n if (isWebrtcEventType(event_type) && (params == null ? void 0 : params.jsonrpc)) {\n const vertoRPC = params;\n if (vertoRPC.params) {\n vertoRPC.params.nodeId = node_id;\n }\n return {\n type: event_type,\n payload: vertoRPC\n };\n }\n return {\n type: event_type,\n payload: params\n };\n};\n\n// src/utils/toSnakeCaseKeys.ts\nvar toSnakeCaseKeys = (obj, transform = (value) => value, result = {}) => {\n if (Array.isArray(obj)) {\n result = obj.map((item, index) => {\n if (typeof item === \"object\") {\n return toSnakeCaseKeys(item, transform, result[index]);\n }\n return item;\n });\n } else {\n Object.keys(obj).forEach((key) => {\n const newKey = fromCamelToSnakeCase(key);\n if (obj[key] && typeof obj[key] === \"object\") {\n result[newKey] = toSnakeCaseKeys(obj[key], transform, result[newKey]);\n } else {\n result[newKey] = transform(obj[key]);\n }\n });\n }\n return result;\n};\n\n// src/utils/extendComponent.ts\nvar extendComponent = (klass, methods) => {\n Object.keys(methods).forEach((methodName) => {\n if (klass.prototype.hasOwnProperty(methodName)) {\n throw new Error(`[extendComponent] Duplicated method name: ${methodName}`);\n }\n });\n Object.defineProperties(klass.prototype, methods);\n return klass;\n};\n\n// src/utils/debounce.ts\nfunction debounce(fn, wait2 = 0, callFirst) {\n let timeout = null;\n let debouncedFn = null;\n const clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n debouncedFn = null;\n timeout = null;\n }\n };\n const flush = function() {\n const call4 = debouncedFn;\n clear();\n if (call4) {\n call4();\n }\n };\n const debounceWrapper = function() {\n if (!wait2) {\n return fn.apply(this, arguments);\n }\n const context = this;\n const args = arguments;\n const callNow = callFirst && !timeout;\n clear();\n debouncedFn = function() {\n fn.apply(context, args);\n };\n timeout = setTimeout(function() {\n timeout = null;\n if (!callNow) {\n const call4 = debouncedFn;\n debouncedFn = null;\n return call4 == null ? void 0 : call4();\n }\n }, wait2);\n if (callNow && debouncedFn) {\n return debouncedFn();\n }\n };\n debounceWrapper.cancel = clear;\n debounceWrapper.flush = flush;\n return debounceWrapper;\n}\n\n// src/utils/SWCloseEvent.ts\nvar SWCloseEvent = class {\n constructor(type, options = {}) {\n this.type = type;\n __publicField(this, \"code\");\n __publicField(this, \"reason\");\n __publicField(this, \"wasClean\");\n this.code = options.code === void 0 ? 0 : options.code;\n this.reason = options.reason === void 0 ? \"\" : options.reason;\n this.wasClean = options.wasClean === void 0 ? false : options.wasClean;\n }\n};\n\n// src/utils/eventUtils.ts\nvar stripNamespacePrefix = (event, namespace) => {\n if (namespace && typeof namespace === \"string\") {\n const regex = new RegExp(`^${namespace}.`);\n return event.replace(regex, \"\");\n }\n const items = event.split(\".\");\n if (items.length > 1) {\n items.shift();\n return items.join(\".\");\n }\n return event;\n};\n\n// src/utils/index.ts\nvar safeParseJson = (value) => {\n if (typeof value !== \"string\") {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch (error) {\n return value;\n }\n};\nvar PROTOCOL_PATTERN = /^(ws|wss):\\/\\//;\nvar checkWebSocketHost = (host) => {\n const protocol = PROTOCOL_PATTERN.test(host) ? \"\" : \"wss://\";\n return `${protocol}${host}`;\n};\nvar timeoutPromise = (promise, time, exception) => {\n let timer = null;\n return Promise.race([\n promise,\n new Promise((_resolve, reject) => timer = setTimeout(reject, time, exception))\n ]).finally(() => clearTimeout(timer));\n};\nvar isGlobalEvent = (event) => {\n return GLOBAL_VIDEO_EVENTS.includes(event);\n};\nvar isSyntheticEvent = (event) => {\n return event.includes(SYNTHETIC_EVENT_PREFIX);\n};\nvar isSessionEvent = (event) => {\n return event.includes(\"session.\");\n};\nvar cleanupEventNamespace = (event) => {\n const eventParts = event.split(EVENT_NAMESPACE_DIVIDER);\n return eventParts[eventParts.length - 1];\n};\nvar WITH_CUSTOM_EVENT_NAMES = [\n \"video.member.updated\",\n \"video.member.talking\"\n];\nvar CLIENT_SIDE_EVENT_NAMES = [\n \"video.room.joined\",\n \"video.track\",\n \"video.active\",\n \"video.answering\",\n \"video.destroy\",\n \"video.early\",\n \"video.hangup\",\n \"video.held\",\n \"video.new\",\n \"video.purge\",\n \"video.recovering\",\n \"video.requesting\",\n \"video.ringing\",\n \"video.trying\",\n \"video.media.connected\",\n \"video.media.reconnecting\",\n \"video.media.disconnected\",\n \"video.microphone.updated\",\n \"video.camera.updated\",\n \"video.speaker.updated\",\n \"video.microphone.disconnected\",\n \"video.camera.disconnected\",\n \"video.speaker.disconnected\"\n];\nvar validateEventsToSubscribe = (events) => {\n const valid = events.map((internalEvent) => {\n if (typeof internalEvent === \"string\") {\n const event = cleanupEventNamespace(internalEvent);\n if (CLIENT_SIDE_EVENT_NAMES.includes(event) || isSyntheticEvent(event) || isLocalEvent(event) || isSessionEvent(event)) {\n return null;\n }\n const found = WITH_CUSTOM_EVENT_NAMES.find((withCustomName) => {\n return event.startsWith(withCustomName);\n });\n return found || event;\n }\n return internalEvent;\n });\n return Array.from(new Set(valid)).filter(Boolean);\n};\nvar isLocalEvent = (event) => {\n return event.includes(LOCAL_EVENT_PREFIX);\n};\nvar toLocalEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(LOCAL_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar toSyntheticEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(SYNTHETIC_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar isJSONRPCRequest = (e) => {\n return Boolean(e.method);\n};\nvar isJSONRPCResponse = (e) => {\n return !isJSONRPCRequest(e);\n};\nvar isSATAuth = (e) => {\n return typeof e !== \"undefined\" && \"jti\" in e;\n};\n\n// src/RPCMessages/helpers.ts\nvar makeRPCRequest = (params) => {\n var _a;\n return __spreadValues({\n jsonrpc: \"2.0\",\n id: (_a = params.id) != null ? _a : v4()\n }, params);\n};\nvar makeRPCResponse = (params) => {\n return __spreadValues({\n jsonrpc: \"2.0\"\n }, params);\n};\n\n// src/RPCMessages/RPCConnect.ts\nvar DEFAULT_CONNECT_VERSION = {\n major: 3,\n minor: 0,\n revision: 0\n};\nvar RPCConnect = (params) => {\n return makeRPCRequest({\n method: \"signalwire.connect\",\n params: __spreadValues({\n version: DEFAULT_CONNECT_VERSION\n }, params)\n });\n};\n\n// src/RPCMessages/RPCReauthenticate.ts\nvar RPCReauthenticate = (authentication) => {\n return makeRPCRequest({\n method: \"signalwire.reauthenticate\",\n params: {\n authentication\n }\n });\n};\n\n// src/RPCMessages/RPCPing.ts\nvar RPCPing = () => {\n return makeRPCRequest({\n method: \"signalwire.ping\",\n params: {\n timestamp: Date.now() / 1e3\n }\n });\n};\nvar RPCPingResponse = (id, timestamp) => {\n return makeRPCResponse({\n id,\n result: {\n timestamp: timestamp || Date.now() / 1e3\n }\n });\n};\n\n// src/RPCMessages/RPCExecute.ts\nvar RPCExecute = ({ method, params }) => {\n return makeRPCRequest({\n method,\n params\n });\n};\n\n// src/RPCMessages/RPCDisconnect.ts\nvar RPCDisconnectResponse = (id) => {\n return makeRPCResponse({\n id,\n result: {}\n });\n};\n\n// src/RPCMessages/VertoMessages.ts\nvar tmpMap = {\n id: \"callID\",\n destinationNumber: \"destination_number\",\n remoteCallerName: \"remote_caller_id_name\",\n remoteCallerNumber: \"remote_caller_id_number\",\n callerName: \"caller_id_name\",\n callerNumber: \"caller_id_number\"\n};\nvar filterVertoParams = (params) => {\n if (params.hasOwnProperty(\"dialogParams\")) {\n const _a = params.dialogParams, {\n remoteSdp,\n localStream,\n remoteStream\n } = _a, dialogParams = __objRest(_a, [\n \"remoteSdp\",\n \"localStream\",\n \"remoteStream\"\n ]);\n for (const key in tmpMap) {\n if (key && dialogParams.hasOwnProperty(key)) {\n dialogParams[tmpMap[key]] = dialogParams[key];\n delete dialogParams[key];\n }\n }\n params.dialogParams = dialogParams;\n }\n return params;\n};\nvar buildVertoRPCMessage = (method) => {\n return (params = {}) => {\n return makeRPCRequest({\n method,\n params: filterVertoParams(params)\n });\n };\n};\nvar VertoInvite = buildVertoRPCMessage(\"verto.invite\");\nvar VertoBye = buildVertoRPCMessage(\"verto.bye\");\nvar VertoAttach = buildVertoRPCMessage(\"verto.attach\");\nvar VertoModify = buildVertoRPCMessage(\"verto.modify\");\nvar VertoInfo = buildVertoRPCMessage(\"verto.info\");\nvar VertoAnswer = buildVertoRPCMessage(\"verto.answer\");\nvar VertoSubscribe = buildVertoRPCMessage(\"verto.subscribe\");\nvar VertoPong = buildVertoRPCMessage(\"verto.pong\");\nvar VertoResult = (id, method) => {\n return makeRPCResponse({\n id,\n result: {\n method\n }\n });\n};\n\n// src/redux/actions.ts\nvar actions_exports = {};\n__export(actions_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n createAction: () => createAction,\n destroyAction: () => destroyAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\n\n// src/redux/toolkit/index.ts\nvar toolkit_exports = {};\n__export(toolkit_exports, {\n configureStore: () => configureStore,\n createAction: () => createAction\n});\n__reExport(toolkit_exports, redux_star);\nimport * as redux_star from \"redux\";\n\n// src/redux/toolkit/createAction.ts\nfunction createAction(type, prepareAction) {\n function actionCreator(...args) {\n if (prepareAction) {\n let prepared = prepareAction(...args);\n if (!prepared) {\n throw new Error(\"prepareAction did not return an object\");\n }\n return __spreadValues(__spreadValues({\n type,\n payload: prepared.payload\n }, \"meta\" in prepared && { meta: prepared.meta }), \"error\" in prepared && { error: prepared.error });\n }\n return { type, payload: args[0] };\n }\n actionCreator.toString = () => `${type}`;\n actionCreator.type = type;\n actionCreator.match = (action) => action.type === type;\n return actionCreator;\n}\n\n// src/redux/toolkit/configureStore.ts\nimport { createStore, compose as compose2, applyMiddleware, combineReducers } from \"redux\";\n\n// src/redux/toolkit/devtoolsExtension.ts\nimport { compose } from \"redux\";\nvar composeWithDevTools = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {\n if (arguments.length === 0)\n return void 0;\n if (typeof arguments[0] === \"object\")\n return compose;\n return compose.apply(null, arguments);\n};\nvar devToolsEnhancer = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() {\n return function(noop) {\n return noop;\n };\n};\n\n// src/redux/toolkit/isPlainObject.ts\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null)\n return false;\n let proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n let baseProto = proto;\n while (Object.getPrototypeOf(baseProto) !== null) {\n baseProto = Object.getPrototypeOf(baseProto);\n }\n return proto === baseProto;\n}\n\n// src/redux/toolkit/getDefaultMiddleware.ts\nfunction curryGetDefaultMiddleware() {\n return function curriedGetDefaultMiddleware() {\n return [];\n };\n}\n\n// src/redux/toolkit/configureStore.ts\nvar IS_PRODUCTION = process.env.NODE_ENV === \"production\";\nfunction configureStore(options) {\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware();\n const {\n reducer = void 0,\n middleware = curriedGetDefaultMiddleware(),\n devTools = true,\n preloadedState = void 0,\n enhancers = void 0\n } = options || {};\n let rootReducer2;\n if (typeof reducer === \"function\") {\n rootReducer2 = reducer;\n } else if (isPlainObject(reducer)) {\n rootReducer2 = combineReducers(reducer);\n } else {\n throw new Error('\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');\n }\n let finalMiddleware = middleware;\n if (typeof finalMiddleware === \"function\") {\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware);\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\n throw new Error(\"when using a middleware builder function, an array of middleware must be returned\");\n }\n }\n if (!IS_PRODUCTION && finalMiddleware.some((item) => typeof item !== \"function\")) {\n throw new Error(\"each middleware provided to configureStore must be a function\");\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n let finalCompose = compose2;\n if (devTools) {\n finalCompose = composeWithDevTools(__spreadValues({\n trace: !IS_PRODUCTION\n }, typeof devTools === \"object\" && devTools));\n }\n let storeEnhancers = [middlewareEnhancer];\n if (Array.isArray(enhancers)) {\n storeEnhancers = [middlewareEnhancer, ...enhancers];\n } else if (typeof enhancers === \"function\") {\n storeEnhancers = enhancers(storeEnhancers);\n }\n const composedEnhancer = finalCompose(...storeEnhancers);\n return createStore(rootReducer2, preloadedState, composedEnhancer);\n}\n\n// src/redux/actions.ts\nvar initAction = createAction(\"swSdk/init\");\nvar destroyAction = createAction(\"swSdk/destroy\");\nvar reauthAction = createAction(\"swSdk/reauth\");\nvar authErrorAction = createAction(\"auth/error\");\nvar authSuccessAction = createAction(\"auth/success\");\nvar authExpiringAction = createAction(\"auth/expiring\");\nvar socketMessageAction = createAction(\"socket/message\");\nvar sessionDisconnectedAction = createAction(\"session.disconnected\");\nvar sessionReconnectingAction = createAction(\"session.reconnecting\");\nvar sessionForceCloseAction = createAction(\"session.forceClose\");\nvar formatCustomSagaAction = (id, action) => {\n return `${action.type}/${id}`;\n};\nvar makeCustomSagaAction = (id, action) => {\n return __spreadProps(__spreadValues({}, action), {\n type: formatCustomSagaAction(id, action)\n });\n};\nvar getCustomSagaActionType = (id, action) => {\n return formatCustomSagaAction(id, action);\n};\n\n// src/redux/toolkit/mapBuilders.ts\nfunction executeReducerBuilderCallback(builderCallback) {\n const actionsMap = {};\n const actionMatchers = [];\n let defaultCaseReducer;\n const builder = {\n addCase(typeOrActionCreator, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (actionMatchers.length > 0) {\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addMatcher`\");\n }\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n const type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\n if (type in actionsMap) {\n throw new Error(\"addCase cannot be called with two reducers for the same action type\");\n }\n actionsMap[type] = reducer;\n return builder;\n },\n addMatcher(matcher, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n actionMatchers.push({ matcher, reducer });\n return builder;\n },\n addDefaultCase(reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addDefaultCase` can only be called once\");\n }\n }\n defaultCaseReducer = reducer;\n return builder;\n }\n };\n builderCallback(builder);\n return [actionsMap, actionMatchers, defaultCaseReducer];\n}\n\n// src/redux/toolkit/createReducer.ts\nfunction isStateFunction(x) {\n return typeof x === \"function\";\n}\nfunction createReducer(initialState, mapOrBuilderCallback, actionMatchers = [], defaultCaseReducer) {\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = typeof mapOrBuilderCallback === \"function\" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer];\n let getInitialState;\n if (isStateFunction(initialState)) {\n getInitialState = () => initialState();\n } else {\n getInitialState = () => initialState;\n }\n function reducer(state = getInitialState(), action) {\n let caseReducers = [\n actionsMap[action.type],\n ...finalActionMatchers.filter(({ matcher }) => matcher(action)).map(({ reducer: reducer2 }) => reducer2)\n ];\n if (caseReducers.filter((cr) => !!cr).length === 0) {\n caseReducers = [finalDefaultCaseReducer];\n }\n return caseReducers.reduce((previousState, caseReducer) => {\n if (caseReducer) {\n return caseReducer(previousState, action);\n }\n return previousState;\n }, state);\n }\n reducer.getInitialState = getInitialState;\n return reducer;\n}\n\n// src/redux/toolkit/createSlice.ts\nfunction getType(slice, actionKey) {\n return `${slice}/${actionKey}`;\n}\nfunction createSlice(options) {\n const { name } = options;\n if (!name) {\n throw new Error(\"`name` is a required option for createSlice\");\n }\n const initialState = options.initialState;\n const reducers = options.reducers || {};\n const reducerNames = Object.keys(reducers);\n const sliceCaseReducersByName = {};\n const sliceCaseReducersByType = {};\n const actionCreators = {};\n reducerNames.forEach((reducerName) => {\n const maybeReducerWithPrepare = reducers[reducerName];\n const type = getType(name, reducerName);\n let caseReducer;\n let prepareCallback;\n if (\"reducer\" in maybeReducerWithPrepare) {\n caseReducer = maybeReducerWithPrepare.reducer;\n prepareCallback = maybeReducerWithPrepare.prepare;\n } else {\n caseReducer = maybeReducerWithPrepare;\n }\n sliceCaseReducersByName[reducerName] = caseReducer;\n sliceCaseReducersByType[type] = caseReducer;\n actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type);\n });\n function buildReducer() {\n const [\n extraReducers = {},\n actionMatchers = [],\n defaultCaseReducer = void 0\n ] = typeof options.extraReducers === \"function\" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers];\n const finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType);\n return createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer);\n }\n let _reducer;\n return {\n name,\n reducer(state, action) {\n if (!_reducer)\n _reducer = buildReducer();\n return _reducer(state, action);\n },\n actions: actionCreators,\n caseReducers: sliceCaseReducersByName,\n getInitialState() {\n if (!_reducer)\n _reducer = buildReducer();\n return _reducer.getInitialState();\n }\n };\n}\n\n// src/redux/utils/createDestroyableSlice.ts\nvar createDestroyableSlice = ({\n name = \"\",\n initialState,\n reducers,\n extraReducers\n}) => {\n return createSlice({\n name,\n initialState,\n reducers,\n extraReducers: (builder) => {\n builder.addCase(destroyAction.type, () => {\n return initialState;\n });\n if (typeof extraReducers === \"function\") {\n extraReducers(builder);\n }\n }\n });\n};\n\n// src/redux/features/session/sessionSlice.ts\nvar initialSessionState = {\n protocol: \"\",\n iceServers: [],\n authStatus: \"unknown\",\n authState: void 0,\n authError: void 0,\n authCount: 0\n};\nfunction authorizingAction(action) {\n return [initAction.type, reauthAction.type].includes(action.type);\n}\nvar sessionSlice = createDestroyableSlice({\n name: \"session\",\n initialState: initialSessionState,\n reducers: {\n connected: (state, { payload }) => {\n var _a, _b;\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorized\",\n authState: payload == null ? void 0 : payload.authorization,\n authCount: state.authCount + 1,\n protocol: (_a = payload == null ? void 0 : payload.protocol) != null ? _a : \"\",\n iceServers: (_b = payload == null ? void 0 : payload.ice_servers) != null ? _b : []\n });\n },\n authStatus: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: payload\n });\n },\n updateAuthState: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authState: payload\n });\n }\n },\n extraReducers: (builder) => {\n builder.addCase(authErrorAction.type, (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"unauthorized\",\n authError: payload.error\n });\n });\n builder.addMatcher(authorizingAction, (state) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorizing\"\n });\n });\n }\n});\nvar {\n actions: sessionActions,\n reducer: sessionReducer\n} = sessionSlice;\n\n// src/BaseSession.ts\nvar SW_SYMBOL = Symbol(\"BaseSession\");\nvar randomInt = (min, max) => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\nvar reconnectDelay = () => {\n return randomInt(1, 4) * 1e3;\n};\nvar BaseSession = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"__sw_symbol\", SW_SYMBOL);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"WebSocketConstructor\");\n __publicField(this, \"CloseEventConstructor\");\n __publicField(this, \"agent\");\n __publicField(this, \"connectVersion\", DEFAULT_CONNECT_VERSION);\n __publicField(this, \"_rpcConnectResult\");\n __publicField(this, \"_requests\", /* @__PURE__ */ new Map());\n __publicField(this, \"_socket\", null);\n __publicField(this, \"_host\", DEFAULT_HOST);\n __publicField(this, \"_executeTimeoutMs\", 10 * 1e3);\n __publicField(this, \"_executeTimeoutError\", Symbol.for(\"sw-execute-timeout\"));\n __publicField(this, \"_executeQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_swConnectError\", Symbol.for(\"sw-connect-error\"));\n __publicField(this, \"_executeConnectionClosed\", Symbol.for(\"sw-execute-connection-closed\"));\n __publicField(this, \"_checkPingDelay\", 15 * 1e3);\n __publicField(this, \"_checkPingTimer\", null);\n __publicField(this, \"_reconnectTimer\");\n __publicField(this, \"_status\", \"unknown\");\n __publicField(this, \"_sessionChannel\");\n __publicField(this, \"wsOpenHandler\");\n __publicField(this, \"wsCloseHandler\");\n __publicField(this, \"wsErrorHandler\");\n var _a, _b;\n const { host, logLevel = \"info\", sessionChannel } = options;\n if (host) {\n this._host = checkWebSocketHost(host);\n }\n if (sessionChannel) {\n this._sessionChannel = sessionChannel;\n }\n if (logLevel) {\n (_b = (_a = this.logger).setLevel) == null ? void 0 : _b.call(_a, logLevel);\n }\n this._onSocketOpen = this._onSocketOpen.bind(this);\n this._onSocketError = this._onSocketError.bind(this);\n this._onSocketClose = this._onSocketClose.bind(this);\n this._onSocketMessage = this._onSocketMessage.bind(this);\n this.execute = this.execute.bind(this);\n this.connect = this.connect.bind(this);\n this.wsOpenHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"open\", this.wsOpenHandler);\n this._onSocketOpen(event);\n };\n this.wsCloseHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"close\", this.wsCloseHandler);\n this._onSocketClose(event);\n };\n this.wsErrorHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"error\", this.wsErrorHandler);\n this._onSocketError(event);\n };\n }\n get host() {\n return this._host;\n }\n get rpcConnectResult() {\n return this._rpcConnectResult;\n }\n get relayProtocol() {\n var _a, _b;\n return (_b = (_a = this._rpcConnectResult) == null ? void 0 : _a.protocol) != null ? _b : \"\";\n }\n get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult;\n return isSATAuth(authorization) ? authorization.jti : authorization.signature;\n }\n return void 0;\n }\n get logger() {\n return getLogger();\n }\n get connecting() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 0 /* CONNECTING */;\n }\n get connected() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 1 /* OPEN */;\n }\n get closing() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 2 /* CLOSING */;\n }\n get closed() {\n return this._socket ? this._socket.readyState === 3 /* CLOSED */ : true;\n }\n get status() {\n return this._status;\n }\n get idle() {\n return this._status === \"idle\";\n }\n get ready() {\n return !Boolean(this.idle || !this.connected);\n }\n set token(token) {\n this.options.token = token;\n }\n connect() {\n if (!(this == null ? void 0 : this.WebSocketConstructor)) {\n throw new Error(\"Missing WebSocketConstructor\");\n }\n if (!(this == null ? void 0 : this.CloseEventConstructor)) {\n throw new Error(\"Missing CloseEventConstructor\");\n }\n this._clearTimers();\n if (this.connecting || this.connected) {\n this.logger.warn(\"Session already connected.\");\n return;\n }\n this._removeSocketListeners();\n this.destroySocket();\n this._clearCheckPingTimer();\n this._socket = this._createSocket();\n this._addSocketListeners();\n }\n _createSocket() {\n return new this.WebSocketConstructor(this._host);\n }\n destroySocket() {\n if (this._socket) {\n this._socket.close();\n this._socket = null;\n }\n }\n _addSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to add listeners\");\n }\n this._removeSocketListeners();\n this._socket.addEventListener(\"open\", this.wsOpenHandler);\n this._socket.addEventListener(\"close\", this.wsCloseHandler);\n this._socket.addEventListener(\"error\", this.wsErrorHandler);\n this._socket.addEventListener(\"message\", this._onSocketMessage);\n }\n _removeSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to remove listeners\");\n }\n this._socket.removeEventListener(\"open\", this.wsOpenHandler);\n this._socket.removeEventListener(\"close\", this.wsCloseHandler);\n this._socket.removeEventListener(\"error\", this.wsErrorHandler);\n this._socket.removeEventListener(\"message\", this._onSocketMessage);\n }\n async disconnect() {\n if (!this._socket || this.closing) {\n this.logger.debug(\"Session not connected or already in closing state.\");\n return;\n }\n this._status = \"disconnecting\";\n this._checkCurrentStatus();\n }\n execute(msg) {\n if (this._status === \"disconnecting\") {\n this.logger.warn(\"Reject request because the session is disconnecting\", msg);\n return Promise.reject({\n code: \"400\",\n message: \"The SDK session is disconnecting\"\n });\n }\n let promise = Promise.resolve();\n if (\"params\" in msg) {\n promise = new Promise((resolve, reject) => {\n this._requests.set(msg.id, { rpcRequest: msg, resolve, reject });\n });\n }\n if (!this.ready) {\n this._addToExecuteQueue(msg);\n this.connect();\n return promise;\n }\n this._send(msg);\n return timeoutPromise(promise, this._executeTimeoutMs, this._executeTimeoutError).catch((error) => {\n if (error === this._executeConnectionClosed) {\n throw this._executeConnectionClosed;\n } else if (error === this._executeTimeoutError) {\n if (\"method\" in msg && msg.method === \"signalwire.connect\") {\n throw this._swConnectError;\n }\n this._checkCurrentStatus();\n this.logger.error(\"Request Timeout\", msg);\n if (this.status === \"disconnected\") {\n return this.logger.debug(\"Request failed because the session is disconnected\", this.status, this._socket);\n }\n this._closeConnection(\"reconnecting\");\n } else {\n throw error;\n }\n });\n }\n async authenticate() {\n var _a, _b;\n const params = {\n agent: this.agent,\n version: this.connectVersion,\n authentication: {\n project: this.options.project,\n token: this.options.token\n }\n };\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n }\n if ((_a = this.options.topics) == null ? void 0 : _a.length) {\n params.contexts = this.options.topics;\n } else if ((_b = this.options.contexts) == null ? void 0 : _b.length) {\n params.contexts = this.options.contexts;\n }\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n }\n authError(error) {\n this._removeSocketListeners();\n this.dispatch(authErrorAction({ error }));\n }\n forceClose() {\n this._removeSocketListeners();\n return this._closeConnection(\"reconnecting\");\n }\n async _onSocketOpen(event) {\n this.logger.debug(\"_onSocketOpen\", event.type);\n try {\n this._status = \"unknown\";\n this._clearTimers();\n await this.authenticate();\n this._status = \"connected\";\n this._flushExecuteQueue();\n this.dispatch(authSuccessAction());\n } catch (error) {\n if (error === this._swConnectError || error === this._executeConnectionClosed) {\n this.logger.debug(\"Invalid connect or connection closed. Waiting for retry.\");\n return;\n }\n this.logger.error(\"Auth Error\", error);\n this.authError(error);\n }\n }\n _onSocketError(event) {\n this.logger.debug(\"_onSocketError\", event);\n }\n _onSocketClose(event) {\n this.logger.debug(\"_onSocketClose\", event.type, event.code, event.reason);\n if (this._status !== \"disconnected\") {\n this._status = \"reconnecting\";\n this.dispatch(sessionReconnectingAction());\n this._clearTimers();\n this._clearPendingRequests();\n this._reconnectTimer = setTimeout(() => {\n this.connect();\n }, reconnectDelay());\n }\n this._socket = null;\n }\n _clearTimers() {\n clearTimeout(this._reconnectTimer);\n }\n _clearPendingRequests() {\n this.logger.debug(\"_clearPendingRequests\", this._requests.size);\n this._requests.forEach(({ reject }) => {\n reject(this._executeConnectionClosed);\n });\n }\n _onSocketMessage(event) {\n const payload = this.decode(event.data);\n this.logger.wsTraffic({ type: \"recv\", payload });\n if (isJSONRPCResponse(payload)) {\n const request = this._requests.get(payload.id);\n if (request) {\n const { rpcRequest, resolve, reject } = request;\n this._requests.delete(payload.id);\n const { result, error } = parseRPCResponse({\n response: payload,\n request: rpcRequest\n });\n this._checkCurrentStatus();\n return error ? reject(error) : resolve(result);\n }\n return this.logger.warn(\"Unknown request for\", payload);\n }\n switch (payload.method) {\n case \"signalwire.ping\":\n return this._pingHandler(payload);\n case \"signalwire.disconnect\": {\n this.execute(RPCDisconnectResponse(payload.id)).catch((error) => {\n this.logger.error(\"SwDisconnect Error\", error);\n }).finally(() => {\n this._status = \"idle\";\n });\n break;\n }\n default:\n this.dispatch(socketMessageAction(payload));\n }\n }\n dispatch(_payload) {\n if (!this._sessionChannel) {\n throw new Error(\"Session channel does not exist\");\n }\n this._sessionChannel.put(_payload);\n }\n _relayProtocolIsValid() {\n var _a;\n return this.signature && ((_a = this == null ? void 0 : this.relayProtocol) == null ? void 0 : _a.split(\"_\")[1]) === this.signature;\n }\n encode(input) {\n return JSON.stringify(input);\n }\n decode(input) {\n return safeParseJson(input);\n }\n async onSwAuthorizationState(state) {\n this.persistSwAuthorizationState(state);\n }\n async retrieveSwAuthorizationState() {\n return \"\";\n }\n async persistSwAuthorizationState(_) {\n }\n _send(msg) {\n this.logger.wsTraffic({ type: \"send\", payload: msg });\n this._socket.send(this.encode(msg));\n }\n _addToExecuteQueue(msg) {\n this.logger.warn(\"Request queued waiting for session to reconnect\", msg);\n this._executeQueue.add(msg);\n }\n _flushExecuteQueue() {\n if (!this._executeQueue.size) {\n return;\n }\n if (!this.ready) {\n this.logger.warn(`Session not ready to flush the queue.`);\n this._closeConnection(\"reconnecting\");\n return;\n }\n this.logger.debug(`${this._executeQueue.size} messages to flush`);\n this._executeQueue.forEach((msg) => {\n this._send(msg);\n this._executeQueue.delete(msg);\n });\n this._executeQueue.clear();\n }\n _clearCheckPingTimer() {\n clearTimeout(this._checkPingTimer);\n }\n async _pingHandler(payload) {\n var _a;\n this._clearCheckPingTimer();\n this._checkPingTimer = setTimeout(() => {\n this.logger.debug(\"Timeout waiting for ping\");\n this._closeConnection(\"reconnecting\");\n }, this._checkPingDelay);\n await this.execute(RPCPingResponse(payload.id, (_a = payload == null ? void 0 : payload.params) == null ? void 0 : _a.timestamp));\n }\n _checkCurrentStatus() {\n switch (this._status) {\n case \"disconnecting\":\n if (this._requests.size > 0) {\n return;\n }\n this._requests.clear();\n this._closeConnection(\"disconnected\");\n break;\n case \"disconnected\":\n this.dispatch(sessionDisconnectedAction());\n break;\n case \"reconnecting\":\n this.wsCloseHandler(new this.CloseEventConstructor(\"close\", {\n reason: \"Client-side closed\"\n }));\n break;\n }\n }\n _closeConnection(status) {\n this._clearCheckPingTimer();\n this.logger.debug(\"Close Connection:\", status);\n this._status = status;\n this.dispatch(sessionActions.authStatus(status === \"disconnected\" ? \"unauthorized\" : \"unknown\"));\n this._removeSocketListeners();\n this.destroySocket();\n this._checkCurrentStatus();\n }\n};\n\n// src/BaseJWTSession.ts\nvar BaseJWTSession = class extends BaseSession {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"_expiredDiffSeconds\", 0);\n __publicField(this, \"_refreshTokenNotificationDiff\", 120);\n __publicField(this, \"_checkTokenExpirationDelay\", 20 * 1e3);\n __publicField(this, \"_checkTokenExpirationTimer\", null);\n this._checkTokenExpiration = this._checkTokenExpiration.bind(this);\n this.reauthenticate = this.reauthenticate.bind(this);\n }\n get expiresAt() {\n var _a;\n if (!(this == null ? void 0 : this._rpcConnectResult)) {\n return 0;\n }\n const { authorization } = this._rpcConnectResult;\n const expiresAt = (_a = isSATAuth(authorization) ? authorization.fabric_subscriber.expires_at : authorization == null ? void 0 : authorization.expires_at) != null ? _a : 0;\n if (typeof expiresAt === \"string\") {\n const parsed = Date.parse(expiresAt);\n if (!isNaN(parsed)) {\n return Math.floor(parsed / 1e3);\n }\n }\n return expiresAt;\n }\n get expiresIn() {\n const now = Math.floor(Date.now() / 1e3);\n return this.expiresAt - now;\n }\n get expired() {\n return this.expiresAt > 0 && this.expiresIn <= this._expiredDiffSeconds;\n }\n async authenticate() {\n const params = {\n agent: this.agent,\n version: this.connectVersion,\n authentication: {\n jwt_token: this.options.token\n }\n };\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n } else {\n const prevProtocol = await this.retrieveRelayProtocol();\n if (prevProtocol) {\n params.protocol = prevProtocol;\n }\n }\n if (params.protocol) {\n const authorizationState = await this.retrieveSwAuthorizationState();\n if (authorizationState) {\n params.authorization_state = authorizationState;\n }\n }\n try {\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n await this.persistRelayProtocol();\n await this._checkTokenExpiration();\n } catch (error) {\n this.logger.debug(\"BaseJWTSession authenticate error\", error);\n throw error;\n }\n }\n async retrieveRelayProtocol() {\n return \"\";\n }\n async persistRelayProtocol() {\n }\n async reauthenticate() {\n this.logger.debug(\"Session Reauthenticate\", {\n ready: this.ready,\n expired: this.expired\n });\n if (!this.ready || this.expired) {\n return this.connect();\n }\n const params = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token\n };\n try {\n this._rpcConnectResult = await this.execute(RPCReauthenticate(params));\n } catch (error) {\n clearTimeout(this._checkTokenExpirationTimer);\n throw error;\n }\n }\n _onSocketClose(event) {\n clearTimeout(this._checkTokenExpirationTimer);\n super._onSocketClose(event);\n }\n async _checkTokenExpiration() {\n if (!this.expiresAt) {\n return;\n }\n const refreshTokenFn = this.options._onRefreshToken || this.options.onRefreshToken;\n if (this.expiresIn <= this._refreshTokenNotificationDiff) {\n this.dispatch(authExpiringAction());\n if (typeof refreshTokenFn === \"function\") {\n try {\n await refreshTokenFn();\n } catch (error) {\n this.logger.error(error);\n }\n } else {\n this.logger.warn(\"The token is going to expire!\");\n }\n }\n clearTimeout(this._checkTokenExpirationTimer);\n if (!this.expired) {\n this._checkTokenExpirationTimer = setTimeout(this._checkTokenExpiration, this._checkTokenExpirationDelay);\n }\n }\n};\n\n// src/redux/index.ts\nvar redux_exports = {};\n__export(redux_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n configureStore: () => configureStore2,\n connect: () => connect,\n createAction: () => createAction,\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n destroyAction: () => destroyAction,\n eventChannel: () => eventChannel,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\nimport createSagaMiddleware, {\n channel,\n multicastChannel\n} from \"@redux-saga/core\";\n\n// src/redux/features/component/componentSlice.ts\nvar initialComponentState = {\n byId: {}\n};\nvar componentSlice = createDestroyableSlice({\n name: \"components\",\n initialState: initialComponentState,\n reducers: {\n upsert: (state, { payload }) => {\n if (payload.id in state.byId) {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: __spreadValues(__spreadValues({}, state.byId[payload.id]), payload)\n })\n });\n } else {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: payload\n })\n });\n }\n },\n cleanup: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n byId: Object.entries(state.byId).reduce((reducer, [componentId, value]) => {\n if (!payload.ids.includes(componentId)) {\n reducer[componentId] = value;\n }\n return reducer;\n }, {})\n });\n }\n }\n});\nvar {\n actions: componentActions,\n reducer: componentReducer\n} = componentSlice;\n\n// src/redux/rootReducer.ts\nvar rootReducer = (0, toolkit_exports.combineReducers)({\n components: componentReducer,\n session: sessionReducer\n});\n\n// src/redux/rootSaga.ts\nimport { fork as fork2, call as call2, take as take2, put as put2, all, cancelled } from \"@redux-saga/core/effects\";\n\n// src/redux/features/session/sessionSaga.ts\nimport { put, take, fork } from \"@redux-saga/core/effects\";\n\n// src/redux/utils/sagaHelpers.ts\nvar sagaHelpers_exports = {};\n__export(sagaHelpers_exports, {\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n eventChannel: () => eventChannel\n});\nimport { call, spawn } from \"@redux-saga/core/effects\";\nimport { eventChannel } from \"@redux-saga/core\";\nvar createRestartableSaga = (saga) => {\n return function* () {\n spawn(function* () {\n while (true) {\n try {\n getLogger().debug(\"Run a restartable saga\");\n yield call(saga);\n getLogger().debug(\"One of the restartable saga has ended. Restarting..\");\n } catch (error) {\n getLogger().error(\"Restartable Saga Error\", error);\n }\n }\n });\n };\n};\nvar defaultCatchHandler = (error) => getLogger().error(\"Catchable Saga Error\", error);\nvar createCatchableSaga = (saga, errorHandler = defaultCatchHandler) => {\n return function* (...params) {\n try {\n yield call(saga, ...params);\n } catch (error) {\n errorHandler(error);\n }\n };\n};\n\n// src/redux/features/session/sessionSaga.ts\nvar isWebrtcEvent = (e) => {\n return isWebrtcEventType(e == null ? void 0 : e.event_type);\n};\nvar isVideoEvent = (e) => {\n var _a;\n return !!((_a = e == null ? void 0 : e.event_type) == null ? void 0 : _a.startsWith(\"video.\"));\n};\nvar isSwAuthorizationState = (e) => {\n return (e == null ? void 0 : e.event_type) === \"signalwire.authorization.state\";\n};\nfunction* sessionChannelWatcher({\n sessionChannel,\n swEventChannel,\n session\n}) {\n function* swEventWorker(broadcastParams) {\n yield put(swEventChannel, toInternalAction(broadcastParams));\n if (isWebrtcEvent(broadcastParams) || isVideoEvent(broadcastParams)) {\n return;\n }\n if (isSwAuthorizationState(broadcastParams)) {\n session.onSwAuthorizationState(broadcastParams.params.authorization_state);\n return;\n }\n yield put({ type: broadcastParams.event_type, payload: broadcastParams });\n }\n function* sessionChannelWorker(action) {\n if (action.type !== socketMessageAction.type) {\n yield put(action);\n return;\n }\n const { method, params } = action.payload;\n switch (method) {\n case \"signalwire.event\":\n yield fork(swEventWorker, params);\n break;\n default:\n return getLogger().debug(`Unknown message: ${method}`, action);\n }\n }\n const sessionChannelWorkerCatchable = createCatchableSaga(sessionChannelWorker, (error) => {\n getLogger().error(\"Channel Error\", error);\n });\n while (true) {\n try {\n while (true) {\n const action = yield take(sessionChannel);\n yield fork(sessionChannelWorkerCatchable, action);\n }\n } catch (error) {\n getLogger().error(\"sessionChannelWorker error:\", error);\n } finally {\n getLogger().debug(\"sessionChannelWorker finally\");\n }\n }\n}\n\n// src/CustomErrors.ts\nvar AuthError = class extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n this.message = message;\n __publicField(this, \"name\", \"AuthError\");\n Object.setPrototypeOf(this, AuthError.prototype);\n }\n};\nvar HttpError = class extends Error {\n constructor(code, message, response) {\n super(message);\n this.code = code;\n this.message = message;\n this.response = response;\n __publicField(this, \"name\", \"HttpError\");\n Object.setPrototypeOf(this, HttpError.prototype);\n }\n};\n\n// src/redux/rootSaga.ts\nfunction* initSessionSaga({\n initSession,\n sessionEmitter,\n userOptions,\n channels\n}) {\n var _a;\n const session = initSession();\n const swEventChannel = channels.swEventChannel;\n const sessionChannel = channels.sessionChannel;\n let customTasks = [];\n if ((_a = userOptions.workers) == null ? void 0 : _a.length) {\n try {\n const effects = userOptions.workers.map((saga) => {\n return call2(createRestartableSaga(saga));\n });\n customTasks = yield all(effects);\n } catch (error) {\n getLogger().error(\"Error running custom workers\", error);\n }\n }\n yield fork2(sessionChannelWatcher, {\n session,\n sessionChannel,\n swEventChannel\n });\n const sessionStatusTask = yield fork2(sessionStatusWatcher, {\n session,\n sessionEmitter,\n sessionChannel,\n userOptions\n });\n session.connect();\n yield take2(destroyAction.type);\n session.disconnect();\n yield take2(sessionDisconnectedAction.type);\n sessionEmitter.emit(\"session.disconnected\");\n sessionStatusTask.cancel();\n customTasks.forEach((task) => task.cancel());\n}\nfunction* reauthenticateWorker({\n session,\n token,\n sessionEmitter\n}) {\n try {\n if (session.reauthenticate) {\n session.token = token;\n yield call2(session.reauthenticate);\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n }\n } catch (error) {\n getLogger().error(\"Reauthenticate Error\", error);\n session.authError(error);\n }\n}\nfunction* sessionStatusWatcher(options) {\n getLogger().debug(\"sessionStatusWatcher [started]\");\n const { session, sessionEmitter } = options;\n try {\n while (true) {\n const action = yield take2([\n authSuccessAction.type,\n authErrorAction.type,\n authExpiringAction.type,\n reauthAction.type,\n sessionReconnectingAction.type,\n sessionForceCloseAction.type\n ]);\n getLogger().trace(\"sessionStatusWatcher\", action.type, action.payload);\n switch (action.type) {\n case authSuccessAction.type: {\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n break;\n }\n case authErrorAction.type: {\n yield fork2(sessionAuthErrorSaga, __spreadProps(__spreadValues({}, options), {\n action\n }));\n break;\n }\n case authExpiringAction.type: {\n sessionEmitter.emit(\"session.expiring\");\n break;\n }\n case reauthAction.type: {\n yield fork2(reauthenticateWorker, {\n session,\n token: action.payload.token,\n sessionEmitter\n });\n break;\n }\n case sessionReconnectingAction.type: {\n sessionEmitter.emit(\"session.reconnecting\");\n break;\n }\n case sessionForceCloseAction.type: {\n session.forceClose();\n break;\n }\n }\n }\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionStatusWatcher [cancelled]\");\n }\n }\n}\nfunction* sessionAuthErrorSaga(options) {\n getLogger().debug(\"sessionAuthErrorSaga [started]\");\n try {\n const { action, sessionEmitter } = options;\n const { error: authError } = action.payload;\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n sessionEmitter.emit(\"session.auth_error\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionAuthErrorSaga [cancelled]\");\n }\n }\n}\nvar rootSaga_default = (options) => {\n return function* root({\n userOptions,\n channels\n }) {\n var _a;\n if (userOptions.logger) {\n setLogger(userOptions.logger);\n }\n if (userOptions.debug) {\n setDebugOptions(userOptions.debug);\n }\n while (true) {\n const action = yield take2([initAction.type, reauthAction.type]);\n if ((_a = action == null ? void 0 : action.payload) == null ? void 0 : _a.token) {\n userOptions.token = action.payload.token;\n }\n try {\n yield call2(initSessionSaga, __spreadProps(__spreadValues({}, options), {\n userOptions,\n channels\n }));\n } catch (error) {\n getLogger().error(\"RootSaga Error:\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"rootSaga [cancelled]\");\n }\n getLogger().debug(\"Reboot rootSaga\");\n }\n }\n };\n};\n\n// src/redux/features/session/sessionSelectors.ts\nvar sessionSelectors_exports = {};\n__export(sessionSelectors_exports, {\n getAuthError: () => getAuthError,\n getAuthState: () => getAuthState,\n getAuthStatus: () => getAuthStatus,\n getIceServers: () => getIceServers,\n getSession: () => getSession\n});\nvar getIceServers = ({ session }) => {\n var _a;\n return (_a = session == null ? void 0 : session.iceServers) != null ? _a : [];\n};\nvar getSession = (store) => {\n return store.session;\n};\nvar getAuthStatus = ({ session }) => {\n return session.authStatus;\n};\nvar getAuthError = ({ session }) => {\n return session.authError;\n};\nvar getAuthState = ({ session }) => {\n return session.authState;\n};\n\n// src/redux/connect.ts\nvar connect = (options) => {\n const { sessionListeners = {}, store, Component, customSagas = [] } = options;\n const sessionKeys = Object.keys(sessionListeners);\n return (userOptions) => {\n const instance = new Component(__spreadProps(__spreadValues({}, userOptions), { store }));\n const cacheMap = /* @__PURE__ */ new Map();\n let run = true;\n const storeUnsubscribe = store.subscribe(() => {\n const state = store.getState();\n const session = getSession(state);\n for (const reduxKey of sessionKeys) {\n if (run === false) {\n return;\n }\n const cacheKey = `session.${reduxKey}`;\n const current = cacheMap.get(cacheKey);\n const updatedValue = session[reduxKey];\n if (updatedValue !== void 0 && current !== updatedValue) {\n cacheMap.set(cacheKey, updatedValue);\n const fnName = sessionListeners[reduxKey];\n if (typeof fnName === \"string\") {\n instance[fnName](session);\n } else if (typeof fnName === \"function\") {\n fnName(session);\n }\n }\n }\n });\n const taskList = customSagas == null ? void 0 : customSagas.map((saga) => {\n return store.runSaga(saga, { instance, runSaga: store.runSaga });\n });\n instance.destroyer = () => {\n run = false;\n storeUnsubscribe();\n cacheMap.clear();\n if (taskList == null ? void 0 : taskList.length) {\n taskList.forEach((task) => task.cancel());\n }\n };\n return instance;\n };\n};\n\n// src/utils/EventEmitter.ts\nimport EventEmitter from \"eventemitter3\";\nvar getEventEmitter = () => {\n return new EventEmitter();\n};\n\n// src/redux/utils/useSession.ts\nvar useSession = (options) => {\n const { SessionConstructor, userOptions, sessionChannel } = options;\n const sessionEmitter = getEventEmitter();\n let session = null;\n const initSession = () => {\n session = new SessionConstructor(__spreadProps(__spreadValues({}, userOptions), {\n sessionChannel\n }));\n return session;\n };\n const getSession2 = () => {\n if (!session) {\n getLogger().warn(\"Custom worker started without the session\");\n }\n return session;\n };\n return { session, initSession, getSession: getSession2, sessionEmitter };\n};\n\n// src/redux/utils/useInstanceMap.ts\nvar useInstanceMap = () => {\n const instanceMap = /* @__PURE__ */ new Map();\n const getInstance = (key) => {\n return instanceMap.get(key);\n };\n const setInstance = (key, value) => {\n instanceMap.set(key, value);\n return instanceMap;\n };\n const deleteInstance = (key) => {\n instanceMap.delete(key);\n return instanceMap;\n };\n return {\n get: getInstance,\n set: setInstance,\n remove: deleteInstance\n };\n};\n\n// src/redux/index.ts\n__reExport(redux_exports, toolkit_exports);\nvar configureStore2 = (options) => {\n var _a;\n const {\n userOptions,\n SessionConstructor,\n preloadedState = {},\n runSagaMiddleware = true\n } = options;\n const sagaMiddleware = createSagaMiddleware();\n const swEventChannel = multicastChannel();\n const sessionChannel = channel();\n const channels = {\n swEventChannel,\n sessionChannel\n };\n const store = configureStore({\n devTools: (_a = userOptions == null ? void 0 : userOptions.devTools) != null ? _a : true,\n reducer: rootReducer,\n preloadedState,\n middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(sagaMiddleware)\n });\n const { initSession, getSession: getSession2, sessionEmitter } = useSession({\n userOptions,\n sessionChannel,\n SessionConstructor\n });\n const map = useInstanceMap();\n const runSaga = (saga, args) => {\n return sagaMiddleware.run(saga, __spreadProps(__spreadValues({}, args), {\n channels,\n getSession: getSession2,\n instanceMap: map\n }));\n };\n if (runSagaMiddleware) {\n const saga = rootSaga_default({\n initSession,\n sessionEmitter\n });\n sagaMiddleware.run(saga, { userOptions, channels });\n }\n return __spreadProps(__spreadValues({}, store), {\n runSaga,\n channels,\n instanceMap: map,\n sessionEmitter\n });\n};\n\n// src/workers/executeActionWorker.ts\nimport { call as call3 } from \"@redux-saga/core/effects\";\nvar executeActionWorker = function* (options) {\n const { initialState, onDone, onFail, getSession: getSession2 } = options;\n const { requestId, method, params } = initialState;\n const session = getSession2();\n if (!session) {\n const error = new Error(\"Session does not exist!\");\n getLogger().error(error);\n onFail == null ? void 0 : onFail(error);\n return;\n }\n try {\n const message = RPCExecute({\n id: requestId,\n method,\n params\n });\n const response = yield call3(session.execute, message);\n onDone == null ? void 0 : onDone(response);\n } catch (error) {\n getLogger().warn(\"Execute error: \", error);\n onFail == null ? void 0 : onFail(error);\n }\n};\n\n// src/BaseComponent.ts\nvar identity = (payload) => payload;\nvar SW_SYMBOL2 = Symbol(\"BaseComponent\");\nvar BaseComponent = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"__sw_symbol\", SW_SYMBOL2);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"_customSagaTriggers\", /* @__PURE__ */ new Map());\n __publicField(this, \"_destroyer\");\n __publicField(this, \"eventEmitter\");\n __publicField(this, \"_runningWorkers\", []);\n __publicField(this, \"_workers\", /* @__PURE__ */ new Map());\n this.eventEmitter = new EventEmitter();\n }\n get __uuid() {\n return this.uuid;\n }\n get logger() {\n return getLogger();\n }\n set destroyer(d) {\n this._destroyer = d;\n }\n get store() {\n return this.options.store;\n }\n get instanceMap() {\n return this.options.store.instanceMap;\n }\n get emitter() {\n return this.eventEmitter;\n }\n get sessionEmitter() {\n return this.options.store.sessionEmitter;\n }\n get session() {\n return this.sessionEmitter;\n }\n on(event, fn) {\n return this.emitter.on(event, fn);\n }\n once(event, fn) {\n return this.emitter.once(event, fn);\n }\n off(event, fn) {\n return this.emitter.off(event, fn);\n }\n removeAllListeners(event) {\n if (event) {\n return this.off(event);\n }\n this.eventNames().forEach((eventName) => {\n this.off(eventName);\n });\n this.sessionEventNames().forEach((eventName) => {\n this.sessionEmitter.off(eventName);\n });\n return this.emitter;\n }\n eventNames() {\n return this.emitter.eventNames();\n }\n sessionEventNames() {\n return this.sessionEmitter.eventNames();\n }\n getSubscriptions() {\n return validateEventsToSubscribe(this.eventNames());\n }\n emit(event, ...args) {\n return this.emitter.emit(event, ...args);\n }\n listenerCount(event) {\n return this.emitter.listenerCount(event);\n }\n destroy() {\n var _a;\n (_a = this._destroyer) == null ? void 0 : _a.call(this);\n this.removeAllListeners();\n this.detachWorkers();\n }\n execute({ method, params }, {\n transformParams = identity,\n transformResolve = identity,\n transformReject = identity\n } = {\n transformParams: identity,\n transformResolve: identity,\n transformReject: identity\n }) {\n return new Promise((resolve, reject) => {\n const requestId = v4();\n this.runWorker(\"executeActionWorker\", {\n worker: executeActionWorker,\n onDone: (data) => resolve(transformResolve(data)),\n onFail: (error) => reject(transformReject(error)),\n initialState: {\n requestId,\n componentId: this.__uuid,\n method,\n params: transformParams(params)\n }\n });\n });\n }\n triggerCustomSaga(action) {\n return new Promise((resolve, reject) => {\n const dispatchId = v4();\n this._customSagaTriggers.set(dispatchId, { resolve, reject });\n this.store.dispatch(__spreadValues({\n dispatchId\n }, makeCustomSagaAction(this.__uuid, action)));\n });\n }\n settleCustomSagaTrigger({\n dispatchId,\n payload,\n kind\n }) {\n const actions = this._customSagaTriggers.get(dispatchId);\n if (actions) {\n actions[kind](payload);\n this._customSagaTriggers.delete(dispatchId);\n }\n }\n select(selectorFn) {\n return selectorFn(this.store.getState());\n }\n getStateProperty(param) {\n return this[param];\n }\n get _sessionAuthStatus() {\n return getAuthStatus(this.store.getState());\n }\n get _sessionAuthState() {\n return getAuthState(this.store.getState());\n }\n _waitUntilSessionAuthorized() {\n const authStatus = getAuthStatus(this.store.getState());\n switch (authStatus) {\n case \"authorized\":\n return Promise.resolve(this);\n case \"unknown\":\n case \"authorizing\":\n return new Promise((resolve, reject) => {\n const unsubscribe = this.store.subscribe(() => {\n const authStatus2 = getAuthStatus(this.store.getState());\n const authError = getAuthError(this.store.getState());\n if (authStatus2 === \"authorized\") {\n resolve(this);\n unsubscribe();\n } else if (authStatus2 === \"unauthorized\") {\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n reject(error);\n unsubscribe();\n }\n });\n });\n case \"unauthorized\":\n return Promise.reject(new Error(\"Unauthorized\"));\n }\n }\n runWorker(name, def) {\n if (this._workers.has(name)) {\n getLogger().warn(`[runWorker] Worker with name ${name} has already been registerd.`);\n } else {\n this._setWorker(name, def);\n }\n return this._attachWorker(name, def);\n }\n _setWorker(name, def) {\n this._workers.set(name, def);\n }\n _attachWorker(name, _a) {\n var _b = _a, { worker } = _b, params = __objRest(_b, [\"worker\"]);\n const task = this.store.runSaga(worker, __spreadValues({\n instance: this,\n runSaga: this.store.runSaga\n }, params));\n this._runningWorkers.push(task);\n this._workers.delete(name);\n return task;\n }\n detachWorkers() {\n this._runningWorkers.forEach((task) => {\n task.cancel();\n });\n this._runningWorkers = [];\n }\n};\n\n// src/BaseClient.ts\nvar BaseClient = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n }\n connect() {\n const authStatus = getAuthStatus(this.store.getState());\n if (authStatus === \"unknown\" || authStatus === \"unauthorized\") {\n this.store.dispatch(initAction());\n }\n return this._waitUntilSessionAuthorized();\n }\n disconnect() {\n this.store.dispatch(destroyAction());\n }\n};\n\n// src/BaseConsumer.ts\nvar BaseConsumer = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"subscribeMethod\", \"signalwire.subscribe\");\n __publicField(this, \"subscribeParams\", {});\n __publicField(this, \"_latestExecuteParams\");\n const resetLatestExecuteParams = () => {\n this._latestExecuteParams = void 0;\n };\n super.session.on(\"session.connected\", resetLatestExecuteParams);\n super.session.on(\"session.disconnected\", resetLatestExecuteParams);\n super.session.on(\"session.reconnecting\", resetLatestExecuteParams);\n }\n shouldExecuteSubscribe(execParams) {\n return !this._latestExecuteParams || JSON.stringify(execParams) !== JSON.stringify(this._latestExecuteParams);\n }\n async subscribe() {\n await this._waitUntilSessionAuthorized();\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.debug(\"`subscribe()` was called without any listeners attached.\");\n return;\n }\n const execParams = {\n method: this.subscribeMethod,\n params: __spreadProps(__spreadValues({}, this.subscribeParams), {\n event_channel: this.getStateProperty(\"eventChannel\"),\n events: subscriptions\n })\n };\n if (!this.shouldExecuteSubscribe(execParams)) {\n this.logger.debug(\"BaseConsumer.subscribe() - Skipped .execute() since the execParams are exactly the same as last time\");\n return;\n }\n this._latestExecuteParams = execParams;\n return new Promise(async (resolve, reject) => {\n try {\n await this.execute(execParams);\n return resolve(void 0);\n } catch (error) {\n return reject(error);\n }\n });\n }\n};\n\n// src/redux/features/shared/namespace.ts\nvar isVideoMemberEvent = (action) => {\n return action.type.startsWith(\"video.member.\") || action.type.startsWith(\"video.__synthetic__.member\");\n};\nvar isVideoRoomEvent = (action) => {\n return action.type.startsWith(\"video.room.\");\n};\nvar isVideoRoomAudienceCountEvent = (action) => {\n return action.type === \"video.room.audience_count\" || action.type === \"video.room.audienceCount\";\n};\nvar isVideoLayoutEvent = (action) => {\n return action.type.startsWith(\"video.layout.\");\n};\nvar isVideoRecordingEvent = (action) => {\n return action.type.startsWith(\"video.recording.\");\n};\nvar isVideoPlaybackEvent = (action) => {\n return action.type.startsWith(\"video.playback.\");\n};\nvar isVideoStreamEvent = (action) => {\n return action.type.startsWith(\"video.stream.\");\n};\nvar isChatEvent = (action) => {\n return action.type.startsWith(\"chat.\");\n};\nvar isVoiceCallEvent = (action) => {\n return action.type.startsWith(\"calling.\");\n};\nvar findNamespaceInPayload = (action) => {\n var _a;\n if (action.payload === void 0) {\n return \"\";\n } else if (isVideoMemberEvent(action) || isVideoLayoutEvent(action) || isVideoRecordingEvent(action) || isVideoPlaybackEvent(action) || isVideoStreamEvent(action) || isVideoRoomAudienceCountEvent(action)) {\n return action.payload.room_session_id;\n } else if (isVideoRoomEvent(action)) {\n return action.payload.room_session.id;\n } else if (isChatEvent(action)) {\n return \"\";\n } else if (isVoiceCallEvent(action)) {\n return (_a = action.payload.tag) != null ? _a : \"\";\n }\n if (process.env.NODE_ENV === \"development\") {\n getLogger().info(\"Namespace not found for action.type: \", action == null ? void 0 : action.type);\n }\n return \"\";\n};\n\n// src/types/videoMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS = {\n audio_muted: true,\n video_muted: true,\n deaf: true,\n visible: true,\n input_volume: 1,\n output_volume: 1,\n input_sensitivity: 1\n};\nvar INTERNAL_MEMBER_UPDATED_EVENTS = Object.keys(INTERNAL_MEMBER_UPDATABLE_PROPS).map((key) => {\n return `${PRODUCT_PREFIX_VIDEO}.member.updated.${key}`;\n});\nvar MEMBER_UPDATABLE_PROPS = toExternalJSON(INTERNAL_MEMBER_UPDATABLE_PROPS);\nvar MEMBER_UPDATED_EVENTS = Object.keys(MEMBER_UPDATABLE_PROPS).map((key) => {\n return `member.updated.${key}`;\n});\n\n// src/redux/features/component/componentSelectors.ts\nvar componentSelectors_exports = {};\n__export(componentSelectors_exports, {\n getComponent: () => getComponent,\n getComponentsById: () => getComponentsById,\n getComponentsToCleanup: () => getComponentsToCleanup\n});\nvar getComponent = ({ components }, id) => {\n var _a;\n return (_a = components.byId) == null ? void 0 : _a[id];\n};\nvar getComponentsById = ({ components }) => {\n return components.byId;\n};\nvar getComponentsToCleanup = (state) => {\n const components = getComponentsById(state);\n let toCleanup = [];\n Object.keys(components).forEach((id) => {\n if (components[id].responses || components[id].errors) {\n toCleanup.push(id);\n }\n });\n return toCleanup;\n};\n\n// src/index.ts\nimport * as sagaEffects from \"@redux-saga/core/effects\";\n\n// src/rooms/index.ts\nvar rooms_exports = {};\n__export(rooms_exports, {\n RoomSessionPlaybackAPI: () => RoomSessionPlaybackAPI,\n RoomSessionRecordingAPI: () => RoomSessionRecordingAPI,\n RoomSessionStreamAPI: () => RoomSessionStreamAPI,\n audioMuteMember: () => audioMuteMember,\n audioUnmuteMember: () => audioUnmuteMember,\n createRoomSessionPlaybackObject: () => createRoomSessionPlaybackObject,\n createRoomSessionRecordingObject: () => createRoomSessionRecordingObject,\n createRoomSessionStreamObject: () => createRoomSessionStreamObject,\n deafMember: () => deafMember,\n deleteMemberMeta: () => deleteMemberMeta,\n deleteMeta: () => deleteMeta,\n demote: () => demote,\n getLayouts: () => getLayouts,\n getMemberMeta: () => getMemberMeta,\n getMembers: () => getMembers,\n getMeta: () => getMeta,\n getPlaybacks: () => getPlaybacks,\n getRecordings: () => getRecordings,\n getStreams: () => getStreams,\n hideVideoMuted: () => hideVideoMuted,\n lock: () => lock,\n play: () => play,\n promote: () => promote,\n removeAllMembers: () => removeAllMembers,\n removeMember: () => removeMember,\n setDeaf: () => setDeaf,\n setHideVideoMuted: () => setHideVideoMuted,\n setInputSensitivityMember: () => setInputSensitivityMember,\n setInputVolumeMember: () => setInputVolumeMember,\n setLayout: () => setLayout,\n setMemberMeta: () => setMemberMeta,\n setMemberPosition: () => setMemberPosition,\n setMeta: () => setMeta,\n setOutputVolumeMember: () => setOutputVolumeMember,\n setPositions: () => setPositions,\n setPrioritizeHandraise: () => setPrioritizeHandraise,\n setRaisedHand: () => setRaisedHand,\n showVideoMuted: () => showVideoMuted,\n startRecording: () => startRecording,\n startStream: () => startStream,\n undeafMember: () => undeafMember,\n unlock: () => unlock,\n updateMemberMeta: () => updateMemberMeta,\n updateMeta: () => updateMeta,\n videoMuteMember: () => videoMuteMember,\n videoUnmuteMember: () => videoUnmuteMember\n});\n\n// src/rooms/methods.ts\nvar baseCodeTransform = () => {\n};\nvar createRoomMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute({\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n }, options);\n }\n});\nvar createRoomMemberMethod = (method, options = {}) => ({\n value: function(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this.execute({\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId || this.memberId\n }, rest)\n }, options);\n }\n});\nvar getLayouts = createRoomMethod(\"video.list_available_layouts\", {\n transformResolve: (payload) => ({ layouts: payload.layouts })\n});\nvar getMembers = createRoomMethod(\"video.members.get\", {\n transformResolve: (payload) => ({ members: payload.members })\n});\nvar setLayout = createRoomMethod(\"video.set_layout\", {\n transformResolve: baseCodeTransform\n});\nvar setPositions = createRoomMethod(\"video.set_position\", {\n transformResolve: baseCodeTransform\n});\nvar hideVideoMuted = createRoomMethod(\"video.hide_video_muted\", {\n transformResolve: baseCodeTransform\n});\nvar showVideoMuted = createRoomMethod(\"video.show_video_muted\", {\n transformResolve: baseCodeTransform\n});\nvar lock = createRoomMethod(\"video.lock\", {\n transformResolve: baseCodeTransform\n});\nvar unlock = createRoomMethod(\"video.unlock\", {\n transformResolve: baseCodeTransform\n});\nvar setHideVideoMuted = {\n value: function(value) {\n return this.execute({\n method: value ? \"video.hide_video_muted\" : \"video.show_video_muted\",\n params: {\n room_session_id: this.roomSessionId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar getRecordings = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recordings } = await this.execute({\n method: \"video.recording.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstances = [];\n recordings.forEach((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n } else {\n recordingInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n });\n }\n recordingInstances.push(recordingInstance);\n this.instanceMap.set(recordingInstance.id, recordingInstance);\n });\n resolve({ recordings: recordingInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startRecording = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recording } = await this.execute({\n method: \"video.recording.start\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n this.instanceMap.set(recordingInstance.id, recordingInstance);\n resolve(recordingInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar getPlaybacks = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { playbacks } = await this.execute({\n method: \"video.playback.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const playbackInstances = [];\n playbacks.forEach((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n } else {\n playbackInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n });\n }\n playbackInstances.push(playbackInstance);\n this.instanceMap.set(playbackInstance.id, playbackInstance);\n });\n resolve({ playbacks: playbackInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar play = {\n value: function(_a) {\n var _b = _a, { seekPosition, currentTimecode } = _b, params = __objRest(_b, [\"seekPosition\", \"currentTimecode\"]);\n return new Promise(async (resolve, reject) => {\n try {\n const seek_position = seekPosition || currentTimecode;\n const { playback } = await this.execute({\n method: \"video.playback.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n seek_position\n }, params)\n });\n const playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n this.instanceMap.set(playbackInstance.id, playbackInstance);\n resolve(playbackInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar createRoomMetaMethod = (method) => {\n return createRoomMethod(method, {\n transformResolve: baseCodeTransform,\n transformParams: (params) => {\n const _a = params, { room_session_id } = _a, meta = __objRest(_a, [\"room_session_id\"]);\n return { room_session_id, meta };\n }\n });\n};\nvar getMeta = createRoomMethod(\"video.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMeta = createRoomMetaMethod(\"video.set_meta\");\nvar updateMeta = createRoomMetaMethod(\"video.update_meta\");\nvar deleteMeta = {\n value: function(params) {\n return this.execute({\n method: \"video.delete_meta\",\n params: {\n room_session_id: this.roomSessionId,\n keys: params\n }\n });\n }\n};\nvar getStreams = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { streams } = await this.execute({\n method: \"video.stream.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const streamInstances = [];\n streams.forEach((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n } else {\n streamInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n });\n }\n streamInstances.push(streamInstance);\n this.instanceMap.set(streamInstance.id, streamInstance);\n });\n resolve({ streams: streamInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startStream = {\n value: function(params) {\n return new Promise(async (resolve, reject) => {\n try {\n const { stream } = await this.execute({\n method: \"video.stream.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n });\n const streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n this.instanceMap.set(streamInstance.id, streamInstance);\n resolve({ stream: streamInstance });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar setPrioritizeHandraise = {\n value: function(params) {\n return this.execute({\n method: \"video.prioritize_handraise\",\n params: {\n room_session_id: this.roomSessionId,\n enable: params\n }\n });\n }\n};\nvar audioMuteMember = createRoomMemberMethod(\"video.member.audio_mute\", {\n transformResolve: baseCodeTransform\n});\nvar audioUnmuteMember = createRoomMemberMethod(\"video.member.audio_unmute\", {\n transformResolve: baseCodeTransform\n});\nvar videoMuteMember = createRoomMemberMethod(\"video.member.video_mute\", {\n transformResolve: baseCodeTransform\n});\nvar videoUnmuteMember = createRoomMemberMethod(\"video.member.video_unmute\", {\n transformResolve: baseCodeTransform\n});\nvar deafMember = createRoomMemberMethod(\"video.member.deaf\", {\n transformResolve: baseCodeTransform\n});\nvar undeafMember = createRoomMemberMethod(\"video.member.undeaf\", {\n transformResolve: baseCodeTransform\n});\nvar setDeaf = {\n value: function(value) {\n return this.execute({\n method: value ? \"video.member.deaf\" : \"video.member.undeaf\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: this.memberId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar setInputVolumeMember = createRoomMemberMethod(\"video.member.set_input_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setOutputVolumeMember = createRoomMemberMethod(\"video.member.set_output_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setInputSensitivityMember = createRoomMemberMethod(\"video.member.set_input_sensitivity\", {\n transformResolve: baseCodeTransform\n});\nvar promote = {\n value: function(_a) {\n var _b = _a, {\n memberId,\n mediaAllowed,\n joinAudioMuted,\n joinVideoMuted\n } = _b, rest = __objRest(_b, [\n \"memberId\",\n \"mediaAllowed\",\n \"joinAudioMuted\",\n \"joinVideoMuted\"\n ]);\n return this.execute({\n method: \"video.member.promote\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed,\n join_audio_muted: joinAudioMuted,\n join_video_muted: joinVideoMuted\n }, rest)\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar demote = {\n value: function({ memberId, mediaAllowed }) {\n return this.execute({\n method: \"video.member.demote\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar setMemberPosition = createRoomMemberMethod(\"video.member.set_position\", {\n transformResolve: baseCodeTransform\n});\nvar removeMember = {\n value: function(_a) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n if (!memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument');\n }\n return this.execute({\n method: \"video.member.remove\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId\n }, rest)\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar removeAllMembers = {\n value: function() {\n return this.execute({\n method: \"video.member.remove\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: \"all\"\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar getMemberMeta = createRoomMemberMethod(\"video.member.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMemberMeta = createRoomMemberMethod(\"video.member.set_meta\", {\n transformResolve: baseCodeTransform\n});\nvar updateMemberMeta = createRoomMemberMethod(\"video.member.update_meta\", {\n transformResolve: baseCodeTransform\n});\nvar deleteMemberMeta = createRoomMemberMethod(\"video.member.delete_meta\", {\n transformResolve: baseCodeTransform\n});\nvar setRaisedHand = {\n value: function(value) {\n const { raised = true, memberId = this.memberId } = value || {};\n if (!memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument');\n }\n return this.execute({\n method: raised ? \"video.member.raisehand\" : \"video.member.lowerhand\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\n\n// src/rooms/RoomSessionRecording.ts\nvar RoomSessionRecordingAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.recording.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.recording.state;\n }\n get duration() {\n return this._payload.recording.duration;\n }\n get startedAt() {\n if (!this._payload.recording.started_at)\n return void 0;\n return new Date(this._payload.recording.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.recording.ended_at)\n return void 0;\n return new Date(this._payload.recording.ended_at * 1e3);\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.recording.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.recording.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.recording.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionRecordingObject = (params) => {\n const recording = connect({\n store: params.store,\n Component: RoomSessionRecordingAPI\n })(params);\n return recording;\n};\n\n// src/rooms/RoomSessionPlayback.ts\nvar RoomSessionPlaybackAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.playback.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get url() {\n return this._payload.playback.url;\n }\n get state() {\n return this._payload.playback.state;\n }\n get volume() {\n return this._payload.playback.volume;\n }\n get startedAt() {\n if (!this._payload.playback.started_at)\n return void 0;\n return new Date(this._payload.playback.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.playback.ended_at)\n return void 0;\n return new Date(this._payload.playback.ended_at * 1e3);\n }\n get position() {\n return this._payload.playback.position;\n }\n get seekable() {\n return this._payload.playback.seekable;\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.playback.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.playback.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.playback.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async setVolume(volume) {\n await this.execute({\n method: \"video.playback.set_volume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n volume\n }\n });\n }\n async seek(timecode) {\n await this.execute({\n method: \"video.playback.seek_absolute\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(timecode)\n }\n });\n }\n async forward(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(offset)\n }\n });\n }\n async rewind(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: -Math.abs(offset)\n }\n });\n }\n};\nvar createRoomSessionPlaybackObject = (params) => {\n const playback = connect({\n store: params.store,\n Component: RoomSessionPlaybackAPI\n })(params);\n return playback;\n};\n\n// src/rooms/RoomSessionStream.ts\nvar RoomSessionStreamAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.stream.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.stream.state;\n }\n get duration() {\n return this._payload.stream.duration;\n }\n get url() {\n return this._payload.stream.url;\n }\n get startedAt() {\n if (!this._payload.stream.started_at)\n return void 0;\n return new Date(this._payload.stream.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.stream.ended_at)\n return void 0;\n return new Date(this._payload.stream.ended_at * 1e3);\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async stop() {\n await this.execute({\n method: \"video.stream.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n stream_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionStreamObject = (params) => {\n const stream = connect({\n store: params.store,\n Component: RoomSessionStreamAPI\n })(params);\n return stream;\n};\n\n// src/chat/index.ts\nvar chat_exports = {};\n__export(chat_exports, {\n BaseChatAPI: () => BaseChatAPI,\n BaseChatConsumer: () => BaseChatConsumer,\n ChatMember: () => ChatMember,\n ChatMessage: () => ChatMessage,\n createBaseChatObject: () => createBaseChatObject,\n getMemberState: () => getMemberState,\n getMembers: () => getMembers2,\n getMessages: () => getMessages,\n publish: () => publish,\n setMemberState: () => setMemberState\n});\n\n// src/chat/utils/toInternalChatChannels.ts\nvar toInternalChatChannels = (channels) => {\n const list = !channels || Array.isArray(channels) ? channels : [channels];\n if (Array.isArray(list)) {\n return list.map((name) => {\n return {\n name\n };\n });\n }\n return [];\n};\n\n// src/chat/utils/index.ts\nvar isValidChannels = (input) => {\n return Array.isArray(input) || typeof input === \"string\";\n};\n\n// src/chat/methods.ts\nvar baseCodeTransform2 = () => {\n};\nvar createChatMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute({\n method,\n params\n }, options);\n }\n});\nvar createChatMemberMethod = (method, options = {}) => ({\n value: function(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this.execute({\n method,\n params: __spreadValues({\n member_id: memberId\n }, rest)\n }, options);\n }\n});\nvar publish = createChatMethod(\"chat.publish\", {\n transformResolve: baseCodeTransform2\n});\nvar getMessages = createChatMethod(\"chat.messages.get\", {\n transformResolve: (payload) => ({\n messages: payload.messages.map((message) => toExternalJSON(message)),\n cursor: payload.cursor\n })\n});\nvar getMembers2 = createChatMethod(\"chat.members.get\", {\n transformResolve: (payload) => ({\n members: payload.members.map((member) => toExternalJSON(member))\n })\n});\nvar transformParamChannels = (params) => {\n const channels = isValidChannels(params == null ? void 0 : params.channels) ? toInternalChatChannels(params.channels) : void 0;\n return __spreadProps(__spreadValues({}, params), {\n channels\n });\n};\nvar setMemberState = createChatMemberMethod(\"chat.member.set_state\", {\n transformResolve: baseCodeTransform2,\n transformParams: transformParamChannels\n});\nvar getMemberState = createChatMemberMethod(\"chat.member.get_state\", {\n transformResolve: (payload) => ({ channels: payload.channels }),\n transformParams: transformParamChannels\n});\n\n// src/pubSub/index.ts\nvar pubSub_exports = {};\n__export(pubSub_exports, {\n BasePubSubConsumer: () => BasePubSubConsumer,\n PubSubMessage: () => PubSubMessage,\n createBasePubSubObject: () => createBasePubSubObject\n});\n\n// src/pubSub/workers/pubSubWorker.ts\nvar pubSubWorker = function* (options) {\n getLogger().trace(\"pubSubWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case `${PRODUCT_PREFIX_PUBSUB}.channel.message`: {\n const {\n channel: channel3,\n message: _a\n } = payload, _b = _a, { member } = _b, restMessage = __objRest(_b, [\"member\"]);\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, restMessage), {\n channel: channel3\n }));\n const pubSubMessage = new PubSubMessage(externalJSON);\n client.emit(\"message\", pubSubMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown pubsub event: \"${type}\"`);\n break;\n }\n }\n const isPubSubEvent = (action) => action.type.startsWith(`${PRODUCT_PREFIX_PUBSUB}.`);\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, isPubSubEvent);\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"pubSubWorker ended\");\n};\n\n// src/pubSub/BasePubSub.ts\nvar toInternalPubSubChannels = (channels) => {\n return channels.map((name) => {\n return {\n name\n };\n });\n};\nvar BasePubSubConsumer = class extends BaseConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_PUBSUB}.subscribe`);\n this.initWorker();\n }\n initWorker() {\n this.runWorker(\"pubSub\", { worker: pubSubWorker });\n }\n _getChannelsParam(channels, method) {\n const _channels = !channels || Array.isArray(channels) ? channels : [channels];\n if (!Array.isArray(_channels) || _channels.length === 0) {\n throw new Error(`Please specify one or more channels when calling .${method}()`);\n }\n return {\n channels: toInternalPubSubChannels(_channels)\n };\n }\n _setSubscribeParams(params) {\n this.subscribeParams = __spreadValues(__spreadValues({}, this.subscribeParams), params);\n }\n _getSubscribeParams({ channels }) {\n return __spreadValues({}, this._getChannelsParam(channels, \"subscribe\"));\n }\n _getUnsubscribeParams({ channels }) {\n const channelsParam = this._getChannelsParam(channels, \"unsubscribe\");\n return __spreadValues({}, channelsParam);\n }\n _checkMissingSubscriptions() {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.info(\"Subscribe was called before any listeners were attached. Move `.subscribe()` right after your event listeners to suppress this message.\");\n this.once(\"message\", () => {\n });\n }\n }\n getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => `${PRODUCT_PREFIX_PUBSUB}.${String(event)}`);\n return validateEventsToSubscribe(eventNamesWithPrefix);\n }\n async subscribe(channels) {\n this._checkMissingSubscriptions();\n const params = this._getSubscribeParams({ channels });\n this._setSubscribeParams(params);\n return super.subscribe();\n }\n async unsubscribe(channels) {\n if (this._sessionAuthStatus === \"unknown\" || this._sessionAuthStatus === \"unauthorized\") {\n throw new Error(\"You must be authenticated to unsubscribe from a channel\");\n }\n const params = this._getUnsubscribeParams({ channels });\n return new Promise(async (resolve, reject) => {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length > 0) {\n const execParams = {\n method: `${PRODUCT_PREFIX_PUBSUB}.unsubscribe`,\n params: __spreadProps(__spreadValues({}, params), {\n events: subscriptions\n })\n };\n try {\n await this.execute(execParams);\n } catch (error) {\n return reject(error);\n }\n } else {\n this.logger.warn(\"`unsubscribe()` was called without any listeners attached.\");\n }\n return resolve();\n });\n }\n updateToken(token) {\n return new Promise((resolve, reject) => {\n this.session.once(\"session.auth_error\", (error) => {\n reject(error);\n });\n this.session.once(\"session.connected\", () => {\n resolve();\n });\n this.store.dispatch(actions_exports.reauthAction({ token }));\n });\n }\n publish(params) {\n return this.execute({\n method: `${PRODUCT_PREFIX_PUBSUB}.publish`,\n params\n });\n }\n async getAllowedChannels() {\n await this._waitUntilSessionAuthorized();\n const authState = this.select(getAuthState);\n if (authState && \"channels\" in authState && authState.channels) {\n return authState.channels;\n }\n return {};\n }\n};\nvar createBasePubSubObject = (params) => {\n const pubSub = connect({\n store: params.store,\n Component: BasePubSubConsumer\n })(params);\n return pubSub;\n};\n\n// src/pubSub/PubSubMessage.ts\nvar PubSubMessage = class {\n constructor(payload) {\n this.payload = payload;\n }\n get id() {\n return this.payload.id;\n }\n get channel() {\n return this.payload.channel;\n }\n get content() {\n return this.payload.content;\n }\n get meta() {\n return this.payload.meta;\n }\n get publishedAt() {\n return this.payload.publishedAt;\n }\n};\n\n// src/chat/workers/chatWorker.ts\nvar chatWorker = function* (options) {\n getLogger().trace(\"chatWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case \"chat.channel.message\": {\n const { channel: channel3, message } = payload;\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, message), {\n channel: channel3\n }));\n const chatMessage = new ChatMessage(externalJSON);\n client.emit(\"message\", chatMessage);\n break;\n }\n case \"chat.member.joined\":\n case \"chat.member.updated\":\n case \"chat.member.left\": {\n const { member } = payload;\n const externalJSON = toExternalJSON(member);\n const chatMessage = new ChatMember(externalJSON);\n const event = stripNamespacePrefix(type);\n client.emit(event, chatMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown chat event: \"${type}\"`);\n break;\n }\n }\n const isChatEvent2 = (action) => action.type.startsWith(\"chat.\");\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, isChatEvent2);\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"chatWorker ended\");\n};\n\n// src/chat/BaseChat.ts\nvar BaseChatConsumer = class extends BasePubSubConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_CHAT}.subscribe`);\n }\n initWorker() {\n this.runWorker(\"chat\", { worker: chatWorker });\n }\n};\nvar BaseChatAPI = extendComponent(BaseChatConsumer, {\n publish,\n getMembers: getMembers2,\n getMessages,\n setMemberState,\n getMemberState\n});\nvar createBaseChatObject = (params) => {\n const chat = connect({\n store: params.store,\n Component: BaseChatAPI\n })(params);\n return chat;\n};\n\n// src/chat/ChatMessage.ts\nvar ChatMessage = class extends PubSubMessage {\n get member() {\n return this.payload.member;\n }\n};\n\n// src/chat/ChatMember.ts\nvar ChatMember = class {\n constructor(payload) {\n this.payload = payload;\n }\n get id() {\n return this.payload.id;\n }\n get channel() {\n return this.payload.channel;\n }\n get state() {\n var _a;\n return (_a = this.payload.state) != null ? _a : {};\n }\n};\n\n// src/memberPosition/index.ts\nvar memberPosition_exports = {};\n__export(memberPosition_exports, {\n MEMBER_POSITION_COMPOUND_EVENTS: () => MEMBER_POSITION_COMPOUND_EVENTS,\n memberPositionWorker: () => memberPositionWorker,\n memberUpdatedWorker: () => memberUpdatedWorker\n});\n\n// src/memberPosition/workers.ts\nimport { fork as fork3 } from \"@redux-saga/core/effects\";\nvar defaultDispatcher = function* (type, payload, instance) {\n instance.emit(type, payload);\n};\nfunction* memberPositionLayoutChangedWorker(options) {\n const {\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n } = options;\n const layers = action.payload.layout.layers;\n const processedMembers = {};\n layers.forEach((layer) => {\n var _a;\n const memberId = layer.member_id;\n if (!memberId) {\n return;\n }\n const memberEventParams = memberList.get(memberId);\n if (memberEventParams && layer.position !== ((_a = memberEventParams.member) == null ? void 0 : _a.current_position)) {\n mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: layer.position\n });\n processedMembers[memberId] = true;\n } else {\n processedMembers[memberId] = false;\n }\n });\n for (const [memberId, payload] of memberList) {\n if (processedMembers[memberId]) {\n yield dispatcher == null ? void 0 : dispatcher(\"member.updated\", payload, instance);\n } else if (processedMembers[memberId] === void 0) {\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: \"off-canvas\"\n });\n if (!updatedMemberEventParams) {\n return;\n }\n yield dispatcher == null ? void 0 : dispatcher(\"member.updated\", updatedMemberEventParams, instance);\n }\n }\n}\nfunction* memberUpdatedWorker({\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n}) {\n var _a, _b;\n const memberId = action.payload.member.id;\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: (_b = (_a = memberList.get(memberId)) == null ? void 0 : _a.member) == null ? void 0 : _b.current_position\n });\n if (!updatedMemberEventParams) {\n return;\n }\n const {\n member: { updated = [] }\n } = action.payload;\n const memberUpdatedPayload = __spreadProps(__spreadValues({}, updatedMemberEventParams), {\n member: __spreadValues(__spreadValues({}, updatedMemberEventParams.member), action.payload.member)\n });\n memberList.set(memberId, memberUpdatedPayload);\n const event = stripNamespacePrefix(action.type);\n for (const key of updated) {\n const type = `${event}.${key}`;\n yield dispatcher == null ? void 0 : dispatcher(type, memberUpdatedPayload, instance);\n }\n yield dispatcher == null ? void 0 : dispatcher(event, memberUpdatedPayload, instance);\n}\nvar MEMBER_POSITION_COMPOUND_EVENTS = /* @__PURE__ */ new Map([\n [\n \"video.member.updated\",\n [\n \"video.layout.changed\",\n \"video.member.joined\",\n \"video.member.left\"\n ]\n ]\n]);\nvar memberPositionWorker = function* memberPositionWorker2({\n instance,\n channels,\n initialState,\n getSession: getSession2,\n instanceMap,\n dispatcher = defaultDispatcher\n}) {\n if (!initialState) {\n return;\n }\n const { swEventChannel } = channels;\n let memberList = initializeMemberList(initialState);\n const addToMemberList = (payload) => {\n if (!memberList.has(payload.member.id)) {\n memberList.set(payload.member.id, payload);\n }\n };\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action2) => {\n const istargetEvent = action2.type === \"video.member.updated\" || action2.type === \"video.layout.changed\" || action2.type === \"video.member.joined\" || action2.type === \"video.member.left\";\n return istargetEvent;\n });\n switch (action.type) {\n case \"video.member.updated\": {\n addToMemberList(action.payload);\n yield fork3(memberUpdatedWorker, {\n action,\n channels,\n memberList,\n instance,\n getSession: getSession2,\n instanceMap,\n dispatcher\n });\n break;\n }\n case \"video.member.joined\": {\n addToMemberList(action.payload);\n break;\n }\n case \"video.member.left\": {\n const member = action.payload.member;\n memberList.delete(member.id);\n break;\n }\n case \"video.layout.changed\": {\n yield fork3(memberPositionLayoutChangedWorker, {\n action,\n channels,\n memberList,\n instance,\n dispatcher\n });\n break;\n }\n }\n }\n};\nvar mutateMemberCurrentPosition = ({\n memberList,\n memberId,\n currentPosition\n}) => {\n const memberEventParams = memberList.get(memberId);\n if (!memberEventParams) {\n return;\n } else if (!currentPosition) {\n return memberEventParams;\n }\n const updatedMemberEventParams = __spreadProps(__spreadValues({}, memberEventParams), {\n member: __spreadProps(__spreadValues({}, memberEventParams == null ? void 0 : memberEventParams.member), {\n current_position: currentPosition\n })\n });\n memberList.set(memberId, updatedMemberEventParams);\n return updatedMemberEventParams;\n};\nvar initializeMemberList = (payload) => {\n const members = payload.room_session.members;\n const memberList = /* @__PURE__ */ new Map();\n members.forEach((member) => {\n memberList.set(member.id, {\n room_id: payload.room_session.room_id,\n room_session_id: payload.room_session.id,\n member\n });\n });\n return memberList;\n};\n\n// src/testUtils.ts\nvar testUtils_exports = {};\n__export(testUtils_exports, {\n configureFullStack: () => configureFullStack,\n configureJestStore: () => configureJestStore,\n createMockedLogger: () => createMockedLogger,\n createSessionChannel: () => createSessionChannel,\n createSwEventChannel: () => createSwEventChannel,\n rpcConnectResultVRT: () => rpcConnectResultVRT,\n wait: () => wait\n});\nimport { channel as channel2, multicastChannel as multicastChannel2 } from \"@redux-saga/core\";\nvar PROJECT_ID = \"8f0a119a-cda7-4497-a47d-c81493b824d4\";\nvar TOKEN = \"<VRT>\";\nvar createMockedLogger = () => ({\n fatal: jest.fn(),\n error: jest.fn(),\n warn: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n trace: jest.fn(),\n wsTraffic: jest.fn()\n});\nvar configureJestStore = (options) => {\n return configureStore2(__spreadValues({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false,\n emitter: new EventEmitter()\n },\n SessionConstructor: BaseSession,\n runSagaMiddleware: false\n }, options));\n};\nvar configureFullStack = () => {\n const session = {\n dispatch: console.log,\n connect: jest.fn(),\n disconnect: jest.fn(),\n execute: jest.fn()\n };\n const emitter = new EventEmitter();\n const store = configureStore2({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false,\n emitter\n },\n SessionConstructor: jest.fn().mockImplementation(() => {\n return session;\n })\n });\n store.dispatch(actions_exports.initAction());\n store.dispatch(actions_exports.authSuccessAction());\n return {\n store,\n session,\n emitter,\n destroy: () => store.dispatch(actions_exports.destroyAction())\n };\n};\nvar wait = (ms) => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n};\nvar rpcConnectResultVRT = {\n identity: \"f3bc99df-2c3d-4fa4-b1dc-e8a8ffc579e6@e3fefa44-1bad-4be9-ad9b-1cbb9abd60c7.west-us\",\n authorization: {\n type: \"video\",\n project_id: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n project: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n scopes: [\"video\"],\n scope_id: \"26675883-8499-4ee9-85eb-691c4aa209f8\",\n resource: \"9c80f1e8-9430-4070-a043-937eb3a96b38\",\n join_as: \"member\",\n user_name: \"Joe\",\n room: {\n name: \"lobby\",\n display_name: \"Lobby\",\n scopes: [\"room.self.audio_mute\", \"room.self.audio_unmute\"],\n meta: {}\n },\n signature: \"SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q\",\n media_allowed: \"all\",\n audio_allowed: \"both\",\n video_allowed: \"both\",\n meta: {}\n },\n protocol: \"signalwire_SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q_03e8c927-8ea3-4661-86d5-778c3e03296a_8f0a119a-cda7-4497-a47d-c81493b824d4\",\n ice_servers: [\n {\n urls: \"turn.swire.io:443\",\n credential: \"sFTwvi8ShXcYNOcyYjFy3ATIUpQ=\",\n credentialType: \"password\",\n username: \"1619521908:8f0a119a-cda7-4497-a47d-c81493b824d4\"\n }\n ]\n};\nvar createSwEventChannel = () => multicastChannel2();\nvar createSessionChannel = () => channel2();\n\n// src/index.ts\nvar selectors = __spreadValues({}, sessionSelectors_exports);\nexport {\n AuthError,\n BaseClient,\n BaseComponent,\n BaseConsumer,\n BaseJWTSession,\n BaseSession,\n chat_exports as Chat,\n ChatMember,\n ChatMessage,\n DEFAULT_CONNECT_VERSION,\n EventEmitter,\n GLOBAL_VIDEO_EVENTS,\n HttpError,\n INTERNAL_MEMBER_UPDATABLE_PROPS,\n INTERNAL_MEMBER_UPDATED_EVENTS,\n LOCAL_EVENT_PREFIX,\n MEMBER_UPDATABLE_PROPS,\n MEMBER_UPDATED_EVENTS,\n memberPosition_exports as MemberPosition,\n pubSub_exports as PubSub,\n PubSubMessage,\n RPCConnect,\n RPCDisconnectResponse,\n RPCExecute,\n RPCPing,\n RPCPingResponse,\n RPCReauthenticate,\n rooms_exports as Rooms,\n SWCloseEvent,\n VertoAnswer,\n VertoAttach,\n VertoBye,\n VertoInfo,\n VertoInvite,\n VertoModify,\n VertoPong,\n VertoResult,\n VertoSubscribe,\n WEBRTC_EVENT_TYPES,\n actions_exports as actions,\n componentActions,\n componentReducer,\n componentSelectors_exports as componentSelectors,\n configureStore2 as configureStore,\n connect,\n debounce,\n extendComponent,\n findNamespaceInPayload,\n fromSnakeToCamelCase,\n getEventEmitter,\n getLogger,\n initialComponentState,\n initialSessionState,\n isGlobalEvent,\n isSATAuth,\n isWebrtcEventType,\n makeRPCRequest,\n makeRPCResponse,\n sagaEffects,\n sagaHelpers_exports as sagaHelpers,\n selectors,\n sessionActions,\n sessionReducer,\n setLogger,\n stripNamespacePrefix,\n testUtils_exports as testUtils,\n timeoutPromise,\n toExternalJSON,\n toInternalAction,\n toInternalEventName,\n toLocalEvent,\n toSnakeCaseKeys,\n toSyntheticEvent,\n v4 as uuid,\n validateEventsToSubscribe\n};\n//# sourceMappingURL=index.esm.js.map\n","import { AuthError, HttpError } from '@signalwire/core'\n\ninterface InternalHttpResponse<T> extends Response {\n parsedBody?: T\n}\n\nasync function http<T>(\n input: string,\n init: RequestInit | undefined\n): Promise<InternalHttpResponse<T>> {\n const response: InternalHttpResponse<T> = await fetch(input, init)\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError(response.status, 'Unauthorized')\n }\n\n let errorResponse\n try {\n errorResponse = await response.json()\n } catch (e) {}\n\n const errorMessage = errorResponse?.errors\n ? JSON.stringify(errorResponse.errors)\n : 'Not Found'\n\n throw new HttpError(response.status, errorMessage, errorResponse)\n }\n\n try {\n // might throw if body is empty\n response.parsedBody = await response.json()\n } catch (e) {}\n\n return response\n}\n\ninterface CreateHttpClientOptions extends RequestInit {\n baseUrl: string\n /**\n * Timeout in milliseconds\n */\n timeout?: number\n}\n\ninterface HttpClientRequestInit extends Omit<RequestInit, 'body'> {\n body?: Record<string, unknown>\n searchParams?: Record<string, any>\n}\n\nexport const createHttpClient = (\n { baseUrl, timeout = 30000, ...globalOptions }: CreateHttpClientOptions,\n fetcher = http\n) => {\n const apiClient = async <T>(\n path: string,\n options?: HttpClientRequestInit\n ): Promise<{ body: T }> => {\n const headers = {\n ...(options?.body ? { 'Content-Type': 'application/json' } : {}),\n ...globalOptions.headers,\n ...options?.headers,\n }\n\n const reqInit = getRequestInit({\n ...globalOptions,\n ...options,\n headers,\n })\n // reqInit.mode = 'no-cors'\n // reqInit.credentials = 'include'\n\n let timerId\n if (timeout) {\n const controller = new AbortController()\n const signal = controller.signal\n\n reqInit.signal = signal\n\n timerId = setTimeout(() => {\n controller.abort()\n }, timeout)\n }\n\n try {\n const response = await fetcher<T>(\n getUrl({\n path,\n baseUrl,\n searchParams: options?.searchParams,\n }),\n reqInit\n )\n\n return { body: response.parsedBody as T }\n } catch (e) {\n throw e\n } finally {\n timerId && clearTimeout(timerId)\n }\n }\n\n return apiClient\n}\n\nconst getBody = (body: unknown) => {\n return typeof body === 'string' ? body : JSON.stringify(body)\n}\n\nconst getRequestInit = (options: any): RequestInit => {\n return Object.entries(options).reduce((reducer, [key, value]) => {\n if (key === 'body') {\n return {\n ...reducer,\n body: getBody(value),\n }\n } else if (value != undefined) {\n return {\n ...reducer,\n [key]: value,\n }\n }\n\n return reducer\n }, {} as RequestInit)\n}\n\nconst getUrl = ({\n path,\n baseUrl,\n searchParams,\n}: {\n baseUrl: string\n path: string\n searchParams?: Record<string, any>\n}) => {\n const url = new URL(path, baseUrl)\n\n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value != undefined) {\n url.searchParams.append(key, value)\n }\n })\n }\n return url.toString()\n}\n","import { getLogger } from '@signalwire/core';\nexport const RTCPeerConnection = (config) => {\n return new window.RTCPeerConnection(config);\n};\n/**\n * Returns whether the current environment supports the media devices API.\n */\nexport const supportsMediaDevices = () => {\n return typeof navigator !== 'undefined' && !!navigator.mediaDevices;\n};\n/**\n * Returns the mediaDevices object if supported, otherwise throws an error.\n */\nexport const getMediaDevicesApi = () => {\n if (!supportsMediaDevices()) {\n throw new Error(\"The media devices API isn't supported in this environment\");\n }\n return navigator.mediaDevices;\n};\n/**\n * Returns whether the current environment supports `getUserMedia`.\n */\nexport const supportsGetUserMedia = () => {\n return typeof getMediaDevicesApi().getUserMedia === 'function';\n};\n/**\n * Returns whether the current environment supports `getDisplayMedia`.\n */\nexport const supportsGetDisplayMedia = () => {\n return typeof getMediaDevicesApi().getDisplayMedia === 'function';\n};\n/**\n * Returns a dictionary whose fields specify the constrainable properties the user agent understands.\n */\nexport const getSupportedConstraints = () => {\n return getMediaDevicesApi().getSupportedConstraints();\n};\nexport const streamIsValid = (stream) => stream && stream instanceof MediaStream;\n/**\n * Returns whether the current environment supports the selection of a media output device.\n */\nexport const supportsMediaOutput = () => {\n return 'sinkId' in HTMLMediaElement.prototype;\n};\n/**\n * Assigns the specified audio output device to the specified HTMLMediaElement.\n * The device with id `deviceId` must be an audio output device. Asynchronously\n * returns whether the operation had success.\n *\n * > 📘\n * > Some browsers do not support output device selection. You can check by\n * > calling [`supportsMediaOutput`](supportsmediaoutput).\n *\n * @param el target element\n * @param deviceId id of the audio output device\n * @returns a promise of whether the operation had success\n *\n * @example\n * ```typescript\n * const el = document.querySelector('video')\n * const outDevices = await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * await SignalWire.WebRTC.setMediaElementSinkId(el, outDevices[0].deviceId)\n * // true\n```\n */\nexport const setMediaElementSinkId = async (el, deviceId) => {\n if (el === null) {\n getLogger().warn('No HTMLMediaElement to attach the speakerId');\n return;\n }\n else if (typeof deviceId !== 'string') {\n getLogger().warn(`Invalid speaker deviceId: '${deviceId}'`);\n return;\n }\n else if (!supportsMediaOutput()) {\n getLogger().warn('Browser does not support output device selection.');\n return;\n }\n try {\n // @ts-ignore\n return await el.setSinkId(deviceId);\n }\n catch (error) {\n if (error.name === 'SecurityError') {\n getLogger().error(`You need to use HTTPS for selecting audio output device: ${error}`);\n }\n else {\n getLogger().error(`Error: ${error}`);\n }\n throw error;\n }\n};\nexport const sdpToJsonHack = (sdp) => sdp;\nexport const stopStream = (stream) => {\n var _a;\n if (streamIsValid(stream)) {\n (_a = stream === null || stream === void 0 ? void 0 : stream.getTracks()) === null || _a === void 0 ? void 0 : _a.forEach(stopTrack);\n }\n};\nexport const stopTrack = (track) => {\n if (track && track.readyState === 'live') {\n track.stop();\n track.dispatchEvent(new Event('ended'));\n }\n};\n/**\n * Maps permission's names from `DevicePermissionDescriptor[\"name\"]`\n * to `MediaDeviceKind`\n */\nconst PERMISSIONS_MAPPING = {\n camera: 'videoinput',\n microphone: 'audioinput',\n speaker: 'audiooutput',\n};\nexport const _getMediaDeviceKindByName = (name) => {\n if (!name) {\n return undefined;\n }\n return PERMISSIONS_MAPPING[name];\n};\n//# sourceMappingURL=primitives.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Enumerates the media input and output devices available on this device.\n *\n * > 📘\n * > Depending on the browser, some information (such as the `label` and\n * > `deviceId` attributes) could be hidden until permission is granted, for\n * > example by calling {@link getUserMedia}.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.enumerateDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"EEX/N2...AjrOs=\"\n * // },\n * // ...\n * // ]\n * ```\n */\nexport const enumerateDevices = () => {\n return getMediaDevicesApi().enumerateDevices();\n};\nexport const enumerateDevicesByKind = async (filterByKind) => {\n let devices = await enumerateDevices().catch((_error) => []);\n if (filterByKind) {\n devices = devices.filter(({ kind }) => kind === filterByKind);\n }\n return devices;\n};\n//# sourceMappingURL=enumerateDevices.js.map","import { getLogger } from '@signalwire/core';\nimport { _getMediaDeviceKindByName } from './primitives';\nimport { enumerateDevicesByKind } from './enumerateDevices';\n/**\n * For browsers not supporting the Permissions API\n * @param {string} kind\n * @returns\n */\nconst _legacyCheckPermissions = async (kind) => {\n const devices = await enumerateDevicesByKind(kind);\n if (!devices.length) {\n getLogger().warn(`No ${kind} devices to check for permissions!`);\n return null;\n }\n return devices.every(({ deviceId, label }) => Boolean(deviceId && label));\n};\n/**\n * Asynchronously returns whether we have permissions to access the specified\n * resource. Some common parameter values for `name` are `\"camera\"`,\n * `\"microphone\"`, and `\"speaker\"`. In those cases, prefer the dedicated methods\n * {@link checkCameraPermissions}, {@link checkMicrophonePermissions}, and\n * {@link checkSpeakerPermissions}.\n * @param name name of the resource\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkPermissions(\"camera\")\n * // true: we have permission for using the camera\n * ```\n */\nexport const checkPermissions = async (name) => {\n if ('permissions' in navigator &&\n typeof navigator.permissions.query === 'function' &&\n name) {\n try {\n /**\n * `navigator.permissions.query` can throw if `name` is not a\n * valid enumation value for `PermissionName`. As of today, some\n * browsers like Fireforx will throw with `name: \"camera\"`\n */\n // @ts-expect-error\n const status = await navigator.permissions.query({ name });\n return status.state === 'granted';\n }\n catch (e) { }\n }\n return _legacyCheckPermissions(_getMediaDeviceKindByName(name));\n};\n/**\n * Asynchronously returns whether we have permissions to access the camera.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkCameraPermissions()\n * // true\n * ```\n */\nexport const checkCameraPermissions = () => checkPermissions('camera');\n/**\n * Asynchronously returns whether we have permissions to access the microphone.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkMicrophonePermissions()\n * // true\n * ```\n */\nexport const checkMicrophonePermissions = () => checkPermissions('microphone');\n/**\n * Asynchronously returns whether we have permissions to access the speakers.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkSpeakerPermissions()\n * // true\n * ```\n */\nexport const checkSpeakerPermissions = () => checkPermissions('speaker');\n//# sourceMappingURL=permissions.js.map","import { getLogger, timeoutPromise } from '@signalwire/core';\nimport { getMediaDevicesApi, getSupportedConstraints } from './primitives';\nimport { checkMicrophonePermissions, checkCameraPermissions, } from './permissions';\nconst GUM_TIMEOUT = 5000;\n/**\n * Check if we need to set a timeout on the gUM request.\n * In case the user needs to go through the browser prompt\n * for permissions we can't set a timer but instead just wait for\n * the user and/or the UA to solve the promise.\n * If we have the permissions already, set the timeout because we\n * had some cases where the UA is stuck reading from the device\n * and the gUM request was never resolved.\n *\n * @internal\n * @returns True/False whether the timeout should be used\n */\nconst _useTimeoutForGUM = async (constraints) => {\n const promises = [];\n if (constraints === null || constraints === void 0 ? void 0 : constraints.audio) {\n promises.push(checkMicrophonePermissions());\n }\n if (constraints === null || constraints === void 0 ? void 0 : constraints.video) {\n promises.push(checkCameraPermissions());\n }\n if (promises.length) {\n const results = await Promise.all(promises);\n return results.every(Boolean);\n }\n return false;\n};\n/**\n * Prompts the user to share one or more media devices and asynchronously\n * returns an associated [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object.\n *\n * For more information, see [`MediaDevices.getUserMedia()`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia).\n *\n * @param constraints an optional [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * To only request audio media:\n *\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n *\n * @example\n * To request both audio and video, specifying constraints for the video:\n *\n * ```typescript\n * const constraints = {\n * audio: true,\n * video: {\n * width: { min: 1024, ideal: 1280, max: 1920 },\n * height: { min: 576, ideal: 720, max: 1080 }\n * }\n * }\n * await SignalWire.WebRTC.getUserMedia(constraints)\n * // MediaStream {id: \"EDVk...\", active: true, ...}\n * ```\n */\nexport const getUserMedia = async (constraints = { audio: true, video: true }) => {\n var _a;\n try {\n const promise = getMediaDevicesApi().getUserMedia(constraints);\n const useTimeout = await _useTimeoutForGUM(constraints);\n if (useTimeout) {\n const exception = new Error('Timeout reading from your devices');\n return await timeoutPromise(promise, GUM_TIMEOUT, exception);\n }\n return await promise;\n }\n catch (error) {\n switch (error.name) {\n case 'Error': {\n getLogger().error((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : \"navigator.mediaDevices.getUserMedia doesn't seem to be supported.\");\n break;\n }\n case 'NotFoundError': {\n getLogger().error('No media tracks of the type specified were found that satisfy the given constraints.');\n break;\n }\n case 'NotReadableError': {\n getLogger().error('Hardware error occurred at the operating system, browser, or Web page level which prevented access to the device. This could have been caused by having the Camera or Mic being user by another application.');\n break;\n }\n case 'OverconstrainedError': {\n getLogger().error(`The constraint: ${error.constraint} cannot be met by the selected device.`);\n getLogger().info(`List of available constraints:`, getSupportedConstraints());\n break;\n }\n case 'NotAllowedError': {\n getLogger().error('The user has mostly likely denied access to the device. This could also happen if the browsing context is insecure (using HTTP rather than HTTPS)');\n break;\n }\n case 'TypeError': {\n if (Object.keys(constraints).length === 0) {\n getLogger().error('Constraints can\\'t be empty nor have \"video\" and \"audio\" set to false.');\n }\n else {\n getLogger().error('Please check that you are calling this method from a secure context (using HTTPS rather than HTTP).');\n }\n break;\n }\n case 'SecurityError': {\n getLogger().error('User media support is disabled on the Document on which getUserMedia() was called. The mechanism by which user media support is enabled and disabled is left up to the individual user agent.');\n break;\n }\n }\n throw error;\n }\n};\n//# sourceMappingURL=getUserMedia.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Prompts the user to share the screen and asynchronously returns a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object associated with a display or part of it.\n *\n * @param constraints an optional\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDisplayMedia()\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n */\nexport const getDisplayMedia = (constraints) => {\n return getMediaDevicesApi().getDisplayMedia(constraints);\n};\n//# sourceMappingURL=getDisplayMedia.js.map","import { getLogger, EventEmitter } from '@signalwire/core';\nimport { getUserMedia, enumerateDevices, enumerateDevicesByKind, checkPermissions, checkCameraPermissions, checkMicrophonePermissions, checkSpeakerPermissions, _getMediaDeviceKindByName, stopStream, supportsMediaOutput, getMediaDevicesApi, } from './index';\nconst _constraintsByKind = (kind) => {\n return {\n audio: !kind || kind === 'all' || kind === 'microphone' || kind === 'speaker',\n video: !kind || kind === 'all' || kind === 'camera',\n };\n};\n/**\n * After prompting the user for permission, returns an array of media input and\n * output devices available on this machine. If `kind` is not null, only the\n * devices of the specified kind are returned. Possible values of the `kind`\n * parameters are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`, which\n * respectively correspond to functions\n * {@link getCameraDevicesWithPermissions},\n * {@link getMicrophoneDevicesWithPermissions}, and\n * {@link getSpeakerDevicesWithPermissions}.\n *\n * @param kind filter for this device category\n * @param fullList By default, only devices for which\n * we have been granted permissions are returned. To obtain a list of devices regardless of\n * the permissions, pass `fullList=true`. Note however that some values such as\n * `name` and `deviceId` could be omitted.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevicesWithPermissions(\"camera\")\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getDevices} for better cross browser compatibility.\n */\nexport const getDevicesWithPermissions = async (kind, fullList = false) => getDevices(kind, fullList);\n/**\n * After prompting the user for permission, returns an array of camera devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getCameraDevices} for better cross browser compatibility.\n */\nexport const getCameraDevicesWithPermissions = () => getDevicesWithPermissions('camera');\n/**\n * After prompting the user for permission, returns an array of microphone devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getMicrophoneDevices} for better cross browser compatibility.\n */\nexport const getMicrophoneDevicesWithPermissions = () => getDevicesWithPermissions('microphone');\n/**\n * After prompting the user for permission, returns an array of speaker devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getSpeakerDevices} for better cross browser compatibility.\n */\nexport const getSpeakerDevicesWithPermissions = () => getDevicesWithPermissions('speaker');\nconst _filterDevices = (devices, options = {}) => {\n const found = [];\n return devices.filter(({ deviceId, kind, groupId }) => {\n var _a;\n if (!deviceId || (options.targets && !((_a = options.targets) === null || _a === void 0 ? void 0 : _a.includes(kind)))) {\n return false;\n }\n if (!groupId) {\n return true;\n }\n const key = `${kind}-${groupId}`;\n const checkDefault = (options === null || options === void 0 ? void 0 : options.excludeDefault) ? deviceId !== 'default' : true;\n if (!found.includes(key) && checkDefault) {\n found.push(key);\n return true;\n }\n return false;\n });\n};\n/**\n * Enumerates the media input and output devices available on this machine. If\n * `name` is provided, only the devices of the specified kind are returned.\n * Possible values of the `name` parameters are `\"camera\"`, `\"microphone\"`, and\n * `\"speaker\"`, which respectively correspond to functions\n * {@link getCameraDevices}, {@link getMicrophoneDevices}, and\n * {@link getSpeakerDevices}.\n *\n * @param name filter for this device category\n * @param fullList Default to false. Set to true to retrieve the raw list as returned by\n * the browser, which might include multiple, duplicate deviceIds for the same group.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevices(\"camera\", true)\n * // [\n * // {\n * // \"deviceId\": \"3c4f97...\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD Camera\",\n * // \"groupId\": \"828fec...\"\n * // }\n * // ]\n * ```\n */\nexport const getDevices = async (name, fullList = false) => {\n const hasPerms = await checkPermissions(name);\n let stream = undefined;\n if (hasPerms === false) {\n const constraints = _constraintsByKind(name);\n stream = await getUserMedia(constraints);\n }\n const devices = await enumerateDevicesByKind(_getMediaDeviceKindByName(name));\n /**\n * Firefox requires an active stream at the time of `enumerateDevices`\n * so we need to stop it after `WebRTC.enumerateDevicesByKind`\n */\n if (stream) {\n stopStream(stream);\n }\n if (fullList === true) {\n return devices;\n }\n return _filterDevices(devices);\n};\n/**\n * Returns an array of camera devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n */\nexport const getCameraDevices = () => getDevices('camera');\n/**\n * Returns an array of microphone devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getMicrophoneDevices = () => getDevices('microphone');\n/**\n * Returns an array of speaker devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getSpeakerDevices = () => getDevices('speaker');\n/**\n * Assure a deviceId exists in the current device list from the browser.\n * It checks for deviceId or label - in case the UA changed the deviceId randomly\n */\nexport const assureDeviceId = async (id, label, name) => {\n const devices = await getDevices(name, true);\n for (let i = 0; i < devices.length; i++) {\n const { deviceId, label: deviceLabel } = devices[i];\n if (id === deviceId || label === deviceLabel) {\n return deviceId;\n }\n }\n return null;\n};\n/**\n * Helper methods to assure a deviceId without asking the user the \"kind\"\n */\nexport const assureVideoDevice = (id, label) => assureDeviceId(id, label, 'camera');\nexport const assureAudioInDevice = (id, label) => assureDeviceId(id, label, 'microphone');\nexport const assureAudioOutDevice = (id, label) => assureDeviceId(id, label, 'speaker');\nconst _deviceInfoToMap = (devices) => {\n const map = new Map();\n devices.forEach((deviceInfo) => {\n if (deviceInfo.deviceId) {\n map.set(deviceInfo.deviceId, deviceInfo);\n }\n });\n return map;\n};\nconst _getDeviceListDiff = (oldDevices, newDevices) => {\n const current = _deviceInfoToMap(oldDevices);\n const removals = _deviceInfoToMap(oldDevices);\n const updates = [];\n getLogger().debug('[_getDeviceListDiff] <- oldDevices', oldDevices);\n getLogger().debug('[_getDeviceListDiff] -> newDevices', newDevices);\n const additions = newDevices.filter((newDevice) => {\n const id = newDevice.deviceId;\n const oldDevice = current.get(id);\n if (oldDevice) {\n removals.delete(id);\n if (newDevice.label !== oldDevice.label) {\n updates.push(newDevice);\n }\n }\n return oldDevice === undefined;\n });\n return {\n updated: updates.map((value) => {\n return {\n type: 'updated',\n payload: value,\n };\n }),\n // Removed devices\n removed: Array.from(removals, ([_, value]) => value).map((value) => {\n return {\n type: 'removed',\n payload: value,\n };\n }),\n added: additions.map((value) => {\n return {\n type: 'added',\n payload: value,\n };\n }),\n };\n};\nconst TARGET_PERMISSIONS_MAP = {\n // FIXME: Replace this object with just checkPermissions(<target>)\n camera: checkCameraPermissions,\n microphone: checkMicrophonePermissions,\n speaker: checkSpeakerPermissions,\n};\nconst DEFAULT_TARGETS = [\n 'camera',\n 'microphone',\n 'speaker',\n];\nconst ALLOWED_TARGETS_MSG = `Allowed targets are: '${DEFAULT_TARGETS.join(\"', '\")}'`;\nconst CHECK_SUPPORT_MAP = {\n speaker: supportsMediaOutput,\n};\nconst checkTargetPermissions = async (options) => {\n const targets = options.targets;\n const permissions = await Promise.all(targets.map((target) => TARGET_PERMISSIONS_MAP[target]()));\n return permissions.reduce((reducer, permission, index) => {\n var _a;\n const target = targets[index];\n /**\n * If we don't specify a check for the target we'll assume\n * there's no need to check for support\n */\n const platformSupportStatus = target in CHECK_SUPPORT_MAP ? (_a = CHECK_SUPPORT_MAP[target]) === null || _a === void 0 ? void 0 : _a.call(CHECK_SUPPORT_MAP) : true;\n const supportStatus = platformSupportStatus\n ? 'supported'\n : 'unsupported';\n reducer[supportStatus].push([target, !!permission]);\n return reducer;\n }, { supported: [], unsupported: [] });\n};\nconst validateTargets = async (options) => {\n var _a;\n const targets = ((_a = options.targets) !== null && _a !== void 0 ? _a : DEFAULT_TARGETS).filter((target) => {\n if (!DEFAULT_TARGETS.includes(target)) {\n getLogger().warn(`We'll ignore the \"${target}\" target as it is not allowed. ${ALLOWED_TARGETS_MSG}.`);\n return false;\n }\n return true;\n });\n if (!targets.length) {\n throw new Error(`At least one \"target\" is required for createDeviceWatcher(). ${ALLOWED_TARGETS_MSG}.`);\n }\n const permissions = await checkTargetPermissions({ targets });\n if (permissions.unsupported.length > 0 &&\n targets.length === permissions.unsupported.length) {\n throw new Error(`The platform doesn't support \"${targets.join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices.`);\n }\n else if (permissions.supported.every(([_, status]) => !status)) {\n throw new Error('You must ask the user for permissions before being able to listen for device changes. Try calling getUserMedia() before calling `createDeviceWatcher()`.');\n }\n let needPermissionsTarget = [];\n const filteredTargets = permissions.supported.reduce((reducer, [target, status]) => {\n if (!status) {\n needPermissionsTarget.push(target);\n }\n else {\n reducer.push(target);\n }\n return reducer;\n }, []);\n /**\n * If the length of these two arrays is different it means whether\n * we have unsupported devices or that the user hasn't granted the\n * permissions for certain targets\n */\n if (filteredTargets.length !== targets.length) {\n const unsupportedTargets = permissions.unsupported.length > 0\n ? `The platform doesn't support \"${permissions.unsupported\n .map(([t]) => t)\n .join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices. `\n : '';\n const needPermissions = needPermissionsTarget.length > 0\n ? `The user hasn't granted permissions for the following targets: ${needPermissionsTarget.join(', ')}. `\n : '';\n getLogger().warn(`${unsupportedTargets}${needPermissions}We'll be watching for the following targets instead: \"${filteredTargets.join(', ')}\"`);\n }\n getLogger().debug(`Watching these targets: \"${filteredTargets.join(', ')}\"`);\n return filteredTargets;\n};\n// FIXME: Move createDeviceWatcher and all related helpers/derived methods to its own module\n/**\n * Asynchronously returns an event emitter that notifies changes in the devices.\n * The possible events are:\n *\n * - \"added\": a device has been added\n * - \"removed\": a device has been removed\n * - \"updated\": a device has been updated\n * - \"changed\": any of the previous events occurred\n *\n * In all cases, your event handler gets as parameter an object `e` with the\n * following keys:\n *\n * - `e.changes`: the changed devices. For \"added\", \"removed\", and \"updated\"\n * event handlers, you only get the object associated to the respective event\n * (i.e., only a list of added devices, removed devices, or updated devices).\n * For \"changed\" event handlers, you get all three lists.\n * - `e.devices`: the new list of devices\n *\n * For device-specific helpers, see {@link createCameraDeviceWatcher},\n * {@link createMicrophoneDeviceWatcher}, and {@link createSpeakerDeviceWatcher}.\n *\n * @param options if null, the event emitter is associated to all devices for\n * which we have permission. Otherwise, you can pass an object\n * `{targets: string}`, where the value for key targets is a list of categories.\n * Allowed categories are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`.\n *\n * @example\n * Creating an event listener on the \"changed\" event and printing the received parameter after both connecting and disconnecting external headphones:\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * h = await SignalWire.WebRTC.createDeviceWatcher()\n * h.on('changed', (c) => console.log(c))\n * ```\n *\n * @example\n * Getting notified just for changes about audio input and output devices, ignoring the camera:\n * ```typescript\n * h = await SignalWire.WebRTC.createDeviceWatcher({targets: ['microphone', 'speaker']})\n * h.on('changed', (c) => console.log(c))\n * ```\n */\nexport const createDeviceWatcher = async (options = {}) => {\n const targets = await validateTargets({ targets: options.targets });\n const emitter = new EventEmitter();\n const currentDevices = await enumerateDevices();\n const kinds = targets === null || targets === void 0 ? void 0 : targets.reduce((reducer, name) => {\n const kind = _getMediaDeviceKindByName(name);\n if (kind) {\n reducer.push(kind);\n }\n return reducer;\n }, []);\n let knownDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n const deviceChangeHandler = async () => {\n const currentDevices = await enumerateDevices();\n const oldDevices = knownDevices;\n const newDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n knownDevices = newDevices;\n const changes = _getDeviceListDiff(oldDevices, newDevices);\n const hasAddedDevices = changes.added.length > 0;\n const hasRemovedDevices = changes.removed.length > 0;\n const hasUpdatedDevices = changes.updated.length > 0;\n if (hasAddedDevices || hasRemovedDevices || hasUpdatedDevices) {\n emitter.emit('changed', { changes: changes, devices: newDevices });\n }\n if (hasAddedDevices) {\n emitter.emit('added', {\n changes: changes.added,\n devices: newDevices,\n });\n }\n if (hasRemovedDevices) {\n emitter.emit('removed', {\n changes: changes.removed,\n devices: newDevices,\n });\n }\n if (hasUpdatedDevices) {\n emitter.emit('updated', {\n changes: changes.updated,\n devices: newDevices,\n });\n }\n };\n getMediaDevicesApi().addEventListener('devicechange', deviceChangeHandler);\n return emitter;\n};\n/**\n * Asynchronously returns an event emitter that notifies changes in all\n * microphone devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['microphone'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createMicrophoneDeviceWatcher = () => createDeviceWatcher({ targets: ['microphone'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all speaker\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['speaker'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createSpeakerDeviceWatcher = () => createDeviceWatcher({ targets: ['speaker'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all camera\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['camera'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createCameraDeviceWatcher = () => createDeviceWatcher({ targets: ['camera'] });\nconst isMediaStream = (options) => {\n return typeof (options === null || options === void 0 ? void 0 : options.getTracks) === 'function';\n};\n// FIXME: Move getMicrophoneAnalyzerMediaStream and all related helpers/derived methods to its own module\nconst getMicrophoneAnalyzerMediaStream = async (options) => {\n if (isMediaStream(options)) {\n return options;\n }\n let constraints;\n if (typeof options === 'string') {\n constraints = {\n audio: {\n deviceId: options,\n },\n };\n }\n else {\n constraints = {\n audio: options,\n };\n }\n return getUserMedia(constraints);\n};\nconst createAnalyzer = (audioContext) => {\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 64;\n analyser.minDecibels = -90;\n analyser.maxDecibels = -10;\n analyser.smoothingTimeConstant = 0.85;\n return analyser;\n};\nconst MAX_VOLUME = 100;\n/**\n * Initializes a microphone analyzer. You can use a MicrophoneAnalyzer to track\n * the input audio volume.\n *\n * To stop the analyzer, plase call the `destroy()` method on the object\n * returned by this method.\n *\n * The returned object emits the following events:\n *\n * - `volumeChanged`: instantaneous volume from 0 to 100\n * - `destroyed`: the object has been destroyed. You get a parameter\n * describing the reason, which can be `null` (if you called `destroy()`),\n * `\"error\"` (in case of errors), or `\"disconnected\"` (if the device was\n * disconnected).\n *\n * @example\n *\n * ```js\n * const micAnalyzer = await createMicrophoneAnalyzer('device-id')\n *\n * micAnalyzer.on('volumeChanged', (vol) => {\n * console.log(\"Volume: \", vol)\n * })\n * micAnalyzer.on('destroyed', (reason) => {\n * console.log('Microphone analyzer destroyed', reason)\n * })\n *\n * micAnalyzer.destroy()\n * ```\n *\n * @param options either the id of the device to analize, or\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints),\n * or a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @returns Asynchronously returns a MicrophoneAnalyzer.\n */\nexport const createMicrophoneAnalyzer = async (options) => {\n const stream = await getMicrophoneAnalyzerMediaStream(options);\n if (!stream) {\n throw new Error('Failed to get the audio stream');\n }\n const emitter = new EventEmitter();\n const audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n const analyser = createAnalyzer(audioContext);\n let rafId;\n let volume;\n try {\n audioContext.createMediaStreamSource(stream).connect(analyser);\n }\n catch (error) {\n throw new Error('No audio track found');\n }\n /**\n * If the device gets disconnected, we'll notify the user of\n * the change.\n */\n stream.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', () => {\n emitter.emit('destroyed', 'disconnected');\n });\n });\n const startMetering = () => {\n try {\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(dataArray);\n /**\n * dataArray contains the values of the volume\n * gathered within a single requestAnimationFrame With\n * reduce and divide by 20 we translate the array\n * values into a 0-100 scale to draw the green bars\n * for the voice/volume energy.\n */\n const latestVol = dataArray.reduce((final, value) => final + value, 0) / 20;\n if (volume !== latestVol) {\n volume = latestVol;\n emitter.emit('volumeChanged', Math.min(volume, MAX_VOLUME));\n }\n rafId = requestAnimationFrame(startMetering);\n }\n catch (e) {\n emitter.emit('destroyed', 'error');\n }\n };\n rafId = requestAnimationFrame(startMetering);\n const destroy = () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n }\n if (audioContext.state !== 'closed') {\n audioContext.close().catch((error) => {\n getLogger().error('Error closing the AudioContext', error);\n });\n }\n /**\n * If the user provided a MediaStream, we don't need to\n * close it.\n */\n if (!isMediaStream(options)) {\n stream.getTracks().forEach((track) => track.stop());\n }\n emitter.emit('destroyed', null);\n emitter.removeAllListeners();\n };\n return new Proxy(\n // @ts-expect-error\n emitter, {\n get(target, prop, receiver) {\n if (prop === 'destroy') {\n return destroy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n};\n/**\n * Returns the speaker based on the given id.\n * @param id string\n * @returns MediaDevices | undefined\n */\nexport const getSpeakerById = async (id) => {\n const speakers = await getSpeakerDevices();\n return speakers.find((audio) => audio.deviceId === id ||\n (audio.deviceId === 'default' && id === '') ||\n (audio.deviceId === '' && id === 'default'));\n};\n//# sourceMappingURL=deviceHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport { getUserMedia as _getUserMedia } from './getUserMedia';\nimport { assureDeviceId } from './deviceHelpers';\n// FIXME: Remove and use getUserMedia directly\nexport const getUserMedia = (constraints) => {\n getLogger().info('RTCService.getUserMedia', constraints);\n const { audio, video } = constraints;\n if (!audio && !video) {\n return;\n }\n return _getUserMedia(constraints);\n};\nexport const getMediaConstraints = async (options) => {\n let { audio = true, micId } = options;\n const { micLabel = '' } = options;\n if (micId) {\n const newMicId = await assureDeviceId(micId, micLabel, 'microphone').catch((_error) => null);\n if (newMicId) {\n if (typeof audio === 'boolean') {\n audio = {};\n }\n audio.deviceId = { exact: newMicId };\n }\n }\n let { video = false, camId } = options;\n const { camLabel = '' } = options;\n if (camId) {\n const newCamId = await assureDeviceId(camId, camLabel, 'camera').catch((_error) => null);\n if (newCamId) {\n if (typeof video === 'boolean') {\n video = {};\n }\n video.deviceId = { exact: newCamId };\n }\n }\n return { audio, video };\n};\n//# sourceMappingURL=helpers.js.map","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","import { getLogger } from '@signalwire/core';\nimport SDPUtils from 'sdp';\nconst _isAudioLine = (line) => /^m=audio/.test(line);\nconst _isVideoLine = (line) => /^m=video/.test(line);\nconst _getCodecPayloadType = (line) => {\n const pattern = new RegExp('a=rtpmap:(\\\\d+) \\\\w+\\\\/\\\\d+');\n const result = line.match(pattern);\n return result && result.length == 2 ? result[1] : null;\n};\n/**\n * Add stereo support hacking the SDP\n * @return the SDP modified\n */\nexport const sdpStereoHack = (sdp) => {\n const endOfLine = '\\r\\n';\n const sdpLines = sdp.split(endOfLine);\n const opusIndex = sdpLines.findIndex((s) => /^a=rtpmap/.test(s) && /opus\\/48000/.test(s));\n if (opusIndex < 0) {\n return sdp;\n }\n const opusPayload = _getCodecPayloadType(sdpLines[opusIndex]);\n const pattern = new RegExp(`a=fmtp:${opusPayload}`);\n const fmtpLineIndex = sdpLines.findIndex((s) => pattern.test(s));\n if (fmtpLineIndex >= 0) {\n if (!/stereo=1;/.test(sdpLines[fmtpLineIndex])) {\n // Append stereo=1 to fmtp line if not already present\n sdpLines[fmtpLineIndex] += '; stereo=1; sprop-stereo=1';\n }\n }\n else {\n // create an fmtp line\n sdpLines[opusIndex] += `${endOfLine}a=fmtp:${opusPayload} stereo=1; sprop-stereo=1`;\n }\n return sdpLines.join(endOfLine);\n};\nexport const sdpMediaOrderHack = (answer, localOffer) => {\n const endOfLine = '\\r\\n';\n const offerLines = localOffer.split(endOfLine);\n const offerAudioIndex = offerLines.findIndex(_isAudioLine);\n const offerVideoIndex = offerLines.findIndex(_isVideoLine);\n if (offerAudioIndex < offerVideoIndex) {\n return answer;\n }\n const answerLines = answer.split(endOfLine);\n const answerAudioIndex = answerLines.findIndex(_isAudioLine);\n const answerVideoIndex = answerLines.findIndex(_isVideoLine);\n const audioLines = answerLines.slice(answerAudioIndex, answerVideoIndex);\n const videoLines = answerLines.slice(answerVideoIndex, answerLines.length - 1);\n const beginLines = answerLines.slice(0, answerAudioIndex);\n return [...beginLines, ...videoLines, ...audioLines, ''].join(endOfLine);\n};\n/**\n * Modify the SDP to increase video bitrate\n * @return the SDP modified\n */\nexport const sdpBitrateHack = (sdp, max, min, start) => {\n const endOfLine = '\\r\\n';\n const lines = sdp.split(endOfLine);\n lines.forEach((line, i) => {\n if (/^a=fmtp:\\d*/.test(line)) {\n lines[i] += `;x-google-max-bitrate=${max};x-google-min-bitrate=${min};x-google-start-bitrate=${start}`;\n }\n else if (/^a=mid:(1|video)/.test(line)) {\n lines[i] += `\\r\\nb=AS:${max}`;\n }\n });\n return lines.join(endOfLine);\n};\n// const sdpAudioRemoveRTPExtensions = (sdp: string, extensionsToFilter: string[]): string => {\n// const endOfLine = '\\r\\n'\n// let beginLines: string[] = []\n// let audioLines: string[] = []\n// let videoLines: string[] = []\n// const newLines = sdp.split(endOfLine)\n// const offerAudioIndex = newLines.findIndex(_isAudioLine)\n// const offerVideoIndex = newLines.findIndex(_isVideoLine)\n// if (offerAudioIndex < offerVideoIndex) {\n// beginLines = newLines.slice(0, offerAudioIndex)\n// audioLines = newLines.slice(offerAudioIndex, offerVideoIndex)\n// videoLines = newLines.slice(offerVideoIndex, (newLines.length - 1))\n// } else {\n// beginLines = newLines.slice(0, offerVideoIndex)\n// audioLines = newLines.slice(offerAudioIndex, (newLines.length - 1))\n// videoLines = newLines.slice(offerVideoIndex, offerAudioIndex)\n// }\n// const newAudioLines = audioLines.filter((line: string) => {\n// return !(line.includes(extensionsToFilter[0]) || line.includes(extensionsToFilter[1]) || line.includes(extensionsToFilter[2]))\n// })\n// return [...beginLines, ...newAudioLines, ...videoLines, ''].join(endOfLine)\n// }\n// const sdpAudioRemoveRidMidExtHack = (sdp: string): string => {\n// const extensionsToFilter = [\n// 'urn:ietf:params:rtp-hdrext:sdes:mid',\n// 'urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id',\n// 'urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id',\n// ]\n// return sdpAudioRemoveRTPExtensions(sdp, extensionsToFilter)\n// }\n/**\n * Check for srflx, prflx or relay candidates\n * TODO: improve the logic check private/public IP for typ host\n *\n * @param sdp string\n * @returns boolean\n */\nexport const sdpHasValidCandidates = (sdp) => {\n try {\n const regex = /typ (?:srflx|prflx|relay)/;\n const sections = SDPUtils.getMediaSections(sdp);\n for (const section of sections) {\n const lines = SDPUtils.splitLines(section);\n const valid = lines.some((line) => {\n return line.indexOf('a=candidate') === 0 && regex.test(line);\n });\n if (!valid) {\n return false;\n }\n }\n return true;\n }\n catch (error) {\n getLogger().error('Error checking SDP', error);\n return false;\n }\n};\n/**\n * Remove \"a=candidate\" lines with local candidates\n * https://bloggeek.me/psa-mdns-and-local-ice-candidates-are-coming/\n */\nexport const sdpRemoveLocalCandidates = (sdp) => {\n const pattern = /^a=candidate.*.local\\ .*/;\n const endOfLine = '\\r\\n';\n return sdp\n .split(endOfLine)\n .filter((line) => !pattern.test(line))\n .join(endOfLine);\n};\n//# sourceMappingURL=sdpHelpers.js.map","import { getLogger, uuid } from '@signalwire/core';\nimport { getUserMedia, getMediaConstraints } from './utils/helpers';\nimport { sdpStereoHack, sdpBitrateHack, sdpMediaOrderHack, sdpHasValidCandidates, } from './utils/sdpHelpers';\nimport { sdpToJsonHack, RTCPeerConnection, streamIsValid, stopTrack, } from './utils';\nimport { watchRTCPeerMediaPackets } from './utils/watchRTCPeerMediaPackets';\nconst RESUME_TIMEOUT = 12000;\nexport default class RTCPeer {\n constructor(call, type) {\n this.call = call;\n this.type = type;\n this.uuid = uuid();\n this._negotiating = false;\n this._processingRemoteSDP = false;\n this._restartingIce = false;\n this.logger.debug('New Peer with type:', this.type, 'Options:', this.options);\n this._onIce = this._onIce.bind(this);\n this._onEndedTrackHandler = this._onEndedTrackHandler.bind(this);\n if (this.options.prevCallId) {\n this.uuid = this.options.prevCallId;\n }\n this.options.prevCallId = undefined;\n if (this.options.localStream && streamIsValid(this.options.localStream)) {\n this._localStream = this.options.localStream;\n }\n this.rtcConfigPolyfill = this.config;\n }\n get logger() {\n return getLogger();\n }\n get options() {\n return this.call.options;\n }\n get watchMediaPacketsTimeout() {\n var _a;\n return (_a = this.options.watchMediaPacketsTimeout) !== null && _a !== void 0 ? _a : 2000;\n }\n get localStream() {\n return this._localStream;\n }\n set localStream(stream) {\n this._localStream = stream;\n }\n get remoteStream() {\n return this._remoteStream;\n }\n get isOffer() {\n return this.type === 'offer';\n }\n get isAnswer() {\n return this.type === 'answer';\n }\n get isSimulcast() {\n return this.options.simulcast === true;\n }\n get isSfu() {\n return this.options.sfu === true;\n }\n get localVideoTrack() {\n const videoSender = this._getSenderByKind('video');\n return (videoSender === null || videoSender === void 0 ? void 0 : videoSender.track) || null;\n }\n get localAudioTrack() {\n const audioSender = this._getSenderByKind('audio');\n return (audioSender === null || audioSender === void 0 ? void 0 : audioSender.track) || null;\n }\n get remoteVideoTrack() {\n const videoReceiver = this._getReceiverByKind('video');\n return (videoReceiver === null || videoReceiver === void 0 ? void 0 : videoReceiver.track) || null;\n }\n get remoteAudioTrack() {\n const audioReceiver = this._getReceiverByKind('audio');\n return (audioReceiver === null || audioReceiver === void 0 ? void 0 : audioReceiver.track) || null;\n }\n get hasAudioSender() {\n return this._getSenderByKind('audio') ? true : false;\n }\n get hasVideoSender() {\n return this._getSenderByKind('video') ? true : false;\n }\n get hasAudioReceiver() {\n return this._getReceiverByKind('audio') ? true : false;\n }\n get hasVideoReceiver() {\n return this._getReceiverByKind('video') ? true : false;\n }\n get config() {\n const { rtcPeerConfig = {} } = this.options;\n const config = Object.assign({ bundlePolicy: 'max-compat', iceServers: this.call.iceServers, \n // @ts-ignore\n sdpSemantics: 'unified-plan' }, rtcPeerConfig);\n this.logger.debug('RTC config', config);\n return config;\n }\n get localSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.localDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get remoteSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.remoteDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get hasIceServers() {\n if (this.instance) {\n const { iceServers = [] } = this.getConfiguration();\n return Boolean(iceServers === null || iceServers === void 0 ? void 0 : iceServers.length);\n }\n return false;\n }\n stopTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to stop.`);\n }\n if (sender.track) {\n stopTrack(sender.track);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(sender.track);\n }\n }\n catch (error) {\n this.logger.error('RTCPeer stopTrackSender error', kind, error);\n }\n }\n async restoreTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to restore.`);\n }\n if (sender.track && sender.track.readyState !== 'ended') {\n return this.logger.info(`There is already an active ${kind} track.`);\n }\n const constraints = await getMediaConstraints(this.options);\n // @ts-ignore\n const stream = await getUserMedia({ [kind]: constraints[kind] });\n if (stream && streamIsValid(stream)) {\n const newTrack = stream.getTracks().find((t) => t.kind === kind);\n if (newTrack) {\n await sender.replaceTrack(newTrack);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.addTrack(newTrack);\n }\n }\n }\n catch (error) {\n this.logger.error('RTCPeer restoreTrackSender error', kind, error);\n }\n }\n getDeviceId(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n const { deviceId = null } = sender.track.getSettings();\n return deviceId;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceId error', kind, error);\n return null;\n }\n }\n getTrackSettings(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.getSettings();\n }\n catch (error) {\n this.logger.error('RTCPeer getTrackSettings error', kind, error);\n return null;\n }\n }\n getDeviceLabel(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.label;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceLabel error', kind, error);\n return null;\n }\n }\n restartIceWithRelayOnly() {\n try {\n if (this.isAnswer) {\n return this.logger.warn('Skip restartIceWithRelayOnly since we need to generate answer');\n }\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n return this.logger.warn('RTCPeer already with iceTransportPolicy relay only');\n }\n const newConfig = Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' });\n this.setConfiguration(newConfig);\n this.restartIce();\n }\n catch (error) {\n this.logger.error('restartIceWithRelayOnly', error);\n }\n }\n restartIce() {\n if (this._negotiating || this._restartingIce) {\n return this.logger.warn('Skip restartIce');\n }\n this._restartingIce = true;\n this.logger.debug('Restart ICE');\n // Type must be Offer to send reinvite.\n this.type = 'offer';\n // @ts-ignore\n this.instance.restartIce();\n }\n triggerResume() {\n this.logger.info('Probably half-open so force close from client');\n if (this._resumeTimer) {\n this.logger.info('[skipped] Already in \"resume\" state');\n return;\n }\n // @ts-expect-error\n this.call.emit('media.disconnected');\n // @ts-expect-error\n this.call.emit('media.reconnecting');\n this.clearTimers();\n this._resumeTimer = setTimeout(() => {\n this.logger.warn('Disconnecting due to RECONNECTION_ATTEMPT_TIMEOUT');\n // @ts-expect-error\n this.call.emit('media.disconnected');\n this.call.leaveReason = 'RECONNECTION_ATTEMPT_TIMEOUT';\n this.call.setState('hangup');\n }, RESUME_TIMEOUT); // TODO: read from call verto.invite response\n this.call._closeWSConnection();\n }\n resetNeedResume() {\n this.clearResumeTimer();\n if (this.options.watchMediaPackets) {\n this.startWatchMediaPackets();\n }\n }\n stopWatchMediaPackets() {\n if (this._mediaWatcher) {\n this._mediaWatcher.stop();\n }\n }\n startWatchMediaPackets() {\n var _a;\n this.stopWatchMediaPackets();\n this._mediaWatcher = watchRTCPeerMediaPackets(this);\n (_a = this._mediaWatcher) === null || _a === void 0 ? void 0 : _a.start();\n }\n async applyMediaConstraints(kind, constraints) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return this.logger.info('No sender to apply constraints', kind, constraints);\n }\n if (sender.track.readyState === 'live') {\n const newConstraints = Object.assign(Object.assign({}, sender.track.getConstraints()), constraints);\n const deviceId = this.getDeviceId(kind);\n if (deviceId && !this.options.screenShare) {\n newConstraints.deviceId = { exact: deviceId };\n }\n this.logger.info(`Apply ${kind} constraints`, this.call.id, newConstraints);\n await sender.track.applyConstraints(newConstraints);\n }\n }\n catch (error) {\n this.logger.error('Error applying constraints', kind, constraints);\n }\n }\n _getSenderByKind(kind) {\n if (!this.instance.getSenders) {\n this.logger.warn('RTCPeerConnection.getSenders() not available.');\n return null;\n }\n return this.instance\n .getSenders()\n .find(({ track }) => track && track.kind === kind);\n }\n _getReceiverByKind(kind) {\n if (!this.instance.getReceivers) {\n this.logger.warn('RTCPeerConnection.getReceivers() not available.');\n return null;\n }\n return this.instance\n .getReceivers()\n .find(({ track }) => track && track.kind === kind);\n }\n async startNegotiation(force = false) {\n var _a, _b;\n if (this._negotiating) {\n return this.logger.warn('Skip twice onnegotiationneeded!');\n }\n this._negotiating = true;\n try {\n /**\n * additionalDevice and screenShare are `sendonly`\n */\n if (this.options.additionalDevice || this.options.screenShare) {\n (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === null || _b === void 0 ? void 0 : _b.call(_a).forEach((tr) => {\n tr.direction = 'sendonly';\n });\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n this.instance.addEventListener('icecandidate', this._onIce);\n if (this.isOffer) {\n this.logger.debug('Trying to generate offer');\n const offerOptions = {\n /**\n * While this property is deprected, on Browsers where this\n * is still supported this avoids conflicting with the VAD\n * server-side\n */\n // @ts-ignore\n voiceActivityDetection: false,\n };\n if (!this._supportsAddTransceiver()) {\n offerOptions.offerToReceiveAudio = this.options.negotiateAudio;\n offerOptions.offerToReceiveVideo = this.options.negotiateVideo;\n }\n const offer = await this.instance.createOffer(offerOptions);\n await this._setLocalDescription(offer);\n }\n if (this.isAnswer) {\n this.logger.debug('Trying to generate answer');\n await this._setRemoteDescription({\n sdp: this.options.remoteSdp,\n type: 'offer',\n });\n const answer = await this.instance.createAnswer({\n // Same as above.\n // @ts-ignore\n voiceActivityDetection: false,\n });\n await this._setLocalDescription(answer);\n }\n /**\n * ReactNative Workaround\n */\n if (force) {\n this._sdpReady();\n }\n this.logger.info('iceGatheringState', this.instance.iceGatheringState);\n if (this.instance.iceGatheringState === 'gathering') {\n this._iceTimeout = setTimeout(() => {\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n }\n catch (error) {\n this.logger.error(`Error creating ${this.type}:`, error);\n }\n }\n onRemoteBye({ code, message }) {\n var _a;\n // It could be a negotiation/signaling error so reject the \"startMethod\"\n (_a = this._rejectStartMethod) === null || _a === void 0 ? void 0 : _a.call(this, {\n code,\n message,\n });\n this.stop();\n }\n async onRemoteSdp(sdp) {\n if (this._processingRemoteSDP ||\n (this.remoteSdp && this.remoteSdp === sdp)) {\n this.logger.warn('Ignore same remote SDP', sdp);\n return;\n }\n try {\n this._processingRemoteSDP = true;\n const type = this.isOffer ? 'answer' : 'offer';\n await this._setRemoteDescription({ sdp, type });\n this._processingRemoteSDP = false;\n /**\n * Resolve the start() method only for Offer because for Answer\n * we need to reply to the server and wait for the signaling.\n */\n if (this.isOffer) {\n this._resolveStartMethod();\n }\n this.resetNeedResume();\n }\n catch (error) {\n this.logger.error(`Error handling remote SDP on call ${this.call.id}:`, error);\n this.call.hangup();\n this._rejectStartMethod(error);\n }\n }\n _setupRTCPeerConnection() {\n if (!this.instance) {\n this.instance = RTCPeerConnection(this.config);\n this._attachListeners();\n }\n }\n async start() {\n return new Promise(async (resolve, reject) => {\n this._resolveStartMethod = resolve;\n this._rejectStartMethod = reject;\n try {\n this._localStream = await this._retrieveLocalStream();\n }\n catch (error) {\n this._rejectStartMethod(error);\n return this.call.setState('hangup');\n }\n /**\n * We need to defer the creation of RTCPeerConnection\n * until we gain gUM access otherwise it will have\n * private IP addresses in ICE host candidates\n * replaced by an mDNS hostname\n * @see https://groups.google.com/g/discuss-webrtc/c/6stQXi72BEU?pli=1\n */\n this._setupRTCPeerConnection();\n let hasLocalTracks = false;\n if (this._localStream && streamIsValid(this._localStream)) {\n const audioTracks = this._localStream.getAudioTracks();\n this.logger.debug('Local audio tracks: ', audioTracks);\n const videoTracks = this._localStream.getVideoTracks();\n this.logger.debug('Local video tracks: ', videoTracks);\n hasLocalTracks = Boolean(audioTracks.length || videoTracks.length);\n // TODO: use transceivers way only for offer - when answer gotta match mid from the ones from SRD\n if (this.isOffer &&\n typeof this.instance.addTransceiver === 'function') {\n const audioTransceiverParams = {\n direction: this.options.negotiateAudio ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n this.logger.debug('Applying audioTransceiverParams', audioTransceiverParams);\n audioTracks.forEach((track) => {\n this.instance.addTransceiver(track, audioTransceiverParams);\n });\n const videoTransceiverParams = {\n direction: this.options.negotiateVideo ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n if (this.isSimulcast) {\n const rids = ['0', '1', '2'];\n videoTransceiverParams.sendEncodings = rids.map((rid) => ({\n active: true,\n rid: rid,\n scaleResolutionDownBy: Number(rid) * 6 || 1.0,\n }));\n }\n this.logger.debug('Applying videoTransceiverParams', videoTransceiverParams);\n videoTracks.forEach((track) => {\n this.instance.addTransceiver(track, videoTransceiverParams);\n });\n if (this.isSfu) {\n const { msStreamsNumber = 5 } = this.options;\n this.logger.debug('Add ', msStreamsNumber, 'recvonly MS Streams');\n videoTransceiverParams.direction = 'recvonly';\n for (let i = 0; i < Number(msStreamsNumber); i++) {\n this.instance.addTransceiver('video', videoTransceiverParams);\n }\n }\n }\n else if (typeof this.instance.addTrack === 'function') {\n // Use addTrack\n // To avoid TS complains in forEach\n const stream = this._localStream;\n audioTracks.forEach((track) => this.instance.addTrack(track, stream));\n videoTracks.forEach((track) => this.instance.addTrack(track, stream));\n }\n else {\n // Fallback to legacy addStream ..\n // @ts-ignore\n this.instance.addStream(this._localStream);\n }\n }\n if (this.isOffer) {\n if (this.options.negotiateAudio) {\n this._checkMediaToNegotiate('audio');\n }\n if (this.options.negotiateVideo) {\n this._checkMediaToNegotiate('video');\n }\n /**\n * If it does not support unified-plan stuff (senders/receivers/transceivers)\n * invoke manually startNegotiation and use the RTCOfferOptions\n */\n if (!this._supportsAddTransceiver() && !hasLocalTracks) {\n this.startNegotiation();\n }\n }\n else {\n this.startNegotiation();\n }\n });\n }\n detachAndStop() {\n var _a;\n if (typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === 'function') {\n this.instance.getTransceivers().forEach((transceiver) => {\n // Do not use `stopTrack` util to not dispatch the `ended` event\n if (transceiver.sender.track) {\n transceiver.sender.track.stop();\n }\n if (transceiver.receiver.track) {\n transceiver.receiver.track.stop();\n }\n });\n }\n this.stop();\n }\n stop() {\n var _a, _b, _c;\n // Do not use `stopTrack` util to not dispatch the `ended` event\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());\n (_b = this._remoteStream) === null || _b === void 0 ? void 0 : _b.getTracks().forEach((track) => track.stop());\n (_c = this.instance) === null || _c === void 0 ? void 0 : _c.close();\n this.stopWatchMediaPackets();\n }\n _supportsAddTransceiver() {\n return typeof this.instance.addTransceiver === 'function';\n }\n _checkMediaToNegotiate(kind) {\n // addTransceiver of 'kind' if not present\n const sender = this._getSenderByKind(kind);\n if (!sender && this._supportsAddTransceiver()) {\n const transceiver = this.instance.addTransceiver(kind, {\n direction: 'recvonly',\n });\n this.logger.debug('Add transceiver', kind, transceiver);\n }\n }\n async _sdpReady() {\n clearTimeout(this._iceTimeout);\n if (!this.instance.localDescription) {\n this.logger.error('Missing localDescription', this.instance);\n return;\n }\n const { sdp } = this.instance.localDescription;\n if (sdp.indexOf('candidate') === -1) {\n this.logger.debug('No candidate - retry \\n');\n this.startNegotiation(true);\n return;\n }\n if (!this._sdpIsValid()) {\n this.logger.info('SDP ready but not valid');\n this._onIceTimeout();\n return;\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n try {\n await this.call.onLocalSDPReady(this);\n if (this.isAnswer) {\n this._resolveStartMethod();\n }\n }\n catch (error) {\n this._rejectStartMethod(error);\n }\n }\n _sdpIsValid() {\n if (this.localSdp && this.hasIceServers) {\n return sdpHasValidCandidates(this.localSdp);\n }\n return Boolean(this.localSdp);\n }\n _forceNegotiation() {\n this.logger.info('Force negotiation again');\n this._negotiating = false;\n this.startNegotiation();\n }\n _onIceTimeout() {\n if (this._sdpIsValid()) {\n this._sdpReady();\n return;\n }\n this.logger.info('ICE gathering timeout');\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n this.logger.info('RTCPeer already with \"iceTransportPolicy: relay\"');\n this._rejectStartMethod({\n code: 'ICE_GATHERING_FAILED',\n message: 'Ice gathering timeout',\n });\n this.call.setState('destroy');\n return;\n }\n this.setConfiguration(Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' }));\n this._forceNegotiation();\n }\n _onIce(event) {\n /**\n * Clear _iceTimeout on each single candidate\n */\n if (this._iceTimeout) {\n clearTimeout(this._iceTimeout);\n }\n /**\n * Following spec: no candidate means the gathering is completed.\n */\n if (!event.candidate) {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n return;\n }\n this.logger.debug('RTCPeer Candidate:', event.candidate);\n if (event.candidate.type === 'host') {\n /**\n * With `host` candidate set timeout to\n * maxIceGatheringTimeout and then invoke\n * _onIceTimeout to check if the SDP is valid\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n else {\n /**\n * With `srflx`, `prflx` or `relay` candidates\n * set timeout to iceGatheringTimeout and then invoke\n * _sdpReady since at least one candidate is valid.\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n }, this.options.iceGatheringTimeout);\n }\n }\n _setLocalDescription(localDescription) {\n const { useStereo, googleMaxBitrate, googleMinBitrate, googleStartBitrate, } = this.options;\n if (localDescription.sdp && useStereo) {\n localDescription.sdp = sdpStereoHack(localDescription.sdp);\n }\n if (localDescription.sdp &&\n googleMaxBitrate &&\n googleMinBitrate &&\n googleStartBitrate) {\n localDescription.sdp = sdpBitrateHack(localDescription.sdp, googleMaxBitrate, googleMinBitrate, googleStartBitrate);\n }\n // this.logger.debug(\n // 'LOCAL SDP \\n',\n // `Type: ${localDescription.type}`,\n // '\\n\\n',\n // localDescription.sdp\n // )\n return this.instance.setLocalDescription(localDescription);\n }\n _setRemoteDescription(remoteDescription) {\n if (remoteDescription.sdp && this.options.useStereo) {\n remoteDescription.sdp = sdpStereoHack(remoteDescription.sdp);\n }\n if (remoteDescription.sdp && this.instance.localDescription) {\n remoteDescription.sdp = sdpMediaOrderHack(remoteDescription.sdp, this.instance.localDescription.sdp);\n }\n const sessionDescr = sdpToJsonHack(remoteDescription);\n this.logger.debug('REMOTE SDP \\n', `Type: ${remoteDescription.type}`, '\\n\\n', remoteDescription.sdp);\n return this.instance.setRemoteDescription(sessionDescr);\n }\n async _retrieveLocalStream() {\n if (streamIsValid(this.options.localStream)) {\n return this.options.localStream;\n }\n const constraints = await getMediaConstraints(this.options);\n return getUserMedia(constraints);\n }\n _attachListeners() {\n this.instance.addEventListener('signalingstatechange', () => {\n this.logger.debug('signalingState:', this.instance.signalingState);\n switch (this.instance.signalingState) {\n case 'stable':\n // Workaround to skip nested negotiations\n // Chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=740501\n this._negotiating = false;\n this._restartingIce = false;\n this.resetNeedResume();\n if (this.instance.connectionState === 'connected') {\n // An ice restart won't change the connectionState so we emit the same event in here\n // since the signalingState is \"stable\" again.\n this.emitMediaConnected();\n }\n break;\n case 'have-local-offer': {\n if (this.instance.iceGatheringState === 'complete') {\n this._sdpReady();\n }\n break;\n }\n // case 'have-remote-offer': {}\n case 'closed':\n // @ts-ignore\n delete this.instance;\n break;\n default:\n this._negotiating = true;\n }\n });\n this.instance.addEventListener('connectionstatechange', () => {\n this.logger.debug('connectionState:', this.instance.connectionState);\n switch (this.instance.connectionState) {\n // case 'new':\n // break\n case 'connecting':\n this._connectionStateTimer = setTimeout(() => {\n this.logger.warn('connectionState timed out');\n this.restartIceWithRelayOnly();\n }, this.options.maxConnectionStateTimeout);\n break;\n case 'connected':\n this.clearConnectionStateTimer();\n this.emitMediaConnected();\n break;\n // case 'closed':\n // break\n case 'disconnected':\n this.logger.debug('[test] Prevent reattach!');\n break;\n case 'failed': {\n this.triggerResume();\n break;\n }\n }\n });\n this.instance.addEventListener('negotiationneeded', () => {\n this.logger.debug('Negotiation needed event');\n this.startNegotiation();\n });\n this.instance.addEventListener('iceconnectionstatechange', () => {\n this.logger.debug('iceConnectionState:', this.instance.iceConnectionState);\n });\n this.instance.addEventListener('icegatheringstatechange', () => {\n this.logger.debug('iceGatheringState:', this.instance.iceGatheringState);\n });\n // this.instance.addEventListener('icecandidateerror', (event) => {\n // this.logger.warn('IceCandidate Error:', event)\n // })\n this.instance.addEventListener('track', (event) => {\n // @ts-expect-error\n this.call.emit('track', event);\n if (this.isSfu) {\n // const notification = { type: 'trackAdd', event }\n // this.call._dispatchNotification(notification)\n }\n this._remoteStream = event.streams[0];\n });\n // @ts-ignore\n this.instance.addEventListener('addstream', (event) => {\n if (event.stream) {\n this._remoteStream = event.stream;\n }\n });\n this._attachAudioTrackListener();\n this._attachVideoTrackListener();\n }\n clearTimers() {\n this.clearResumeTimer();\n this.clearWatchMediaPacketsTimer();\n this.clearConnectionStateTimer();\n }\n clearConnectionStateTimer() {\n clearTimeout(this._connectionStateTimer);\n }\n clearWatchMediaPacketsTimer() {\n clearTimeout(this._watchMediaPacketsTimer);\n }\n clearResumeTimer() {\n clearTimeout(this._resumeTimer);\n this._resumeTimer = undefined;\n }\n emitMediaConnected() {\n // @ts-expect-error\n this.call.emit('media.connected');\n }\n _onEndedTrackHandler(event) {\n const mediaTrack = event.target;\n const evt = mediaTrack.kind === 'audio' ? 'microphone' : 'camera';\n // @ts-expect-error\n this.call.emit(`${evt}.disconnected`, {\n deviceId: mediaTrack.id,\n label: mediaTrack.label,\n });\n }\n _attachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _attachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local `rtcConfigPolyfill` object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration#parameters\n */\n setConfiguration(config) {\n var _a;\n this.rtcConfigPolyfill = config;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.setConfiguration) === 'function') {\n this.instance.setConfiguration(config);\n }\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local config object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/getConfiguration\n */\n getConfiguration() {\n var _a;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getConfiguration) === 'function') {\n return this.instance.getConfiguration();\n }\n return this.rtcConfigPolyfill || this.config;\n }\n}\n//# sourceMappingURL=RTCPeer.js.map","import { getLogger } from '@signalwire/core';\nexport const watchRTCPeerMediaPackets = (rtcPeer) => {\n if (!rtcPeer.hasAudioReceiver && !rtcPeer.hasVideoReceiver) {\n getLogger().warn(`Missing receivers to inspect media for RTCPeer \"${rtcPeer.uuid}\"`);\n return;\n }\n getLogger().debug(`Start watching media for RTCPeer \"${rtcPeer.uuid}\"`);\n let previousAudioValue = 0;\n let previousVideoValue = 0;\n let run = true;\n let timer;\n const clearTimer = () => {\n clearTimeout(timer);\n };\n const meter = async () => {\n var _a, _b;\n let audioPacketsReceived = 0;\n let videoPacketsReceived = 0;\n try {\n const stats = await rtcPeer.instance.getStats(null);\n const audioTrackId = (_a = rtcPeer.remoteAudioTrack) === null || _a === void 0 ? void 0 : _a.id;\n const videoTrackId = (_b = rtcPeer.remoteVideoTrack) === null || _b === void 0 ? void 0 : _b.id;\n stats.forEach((report) => {\n if (report.type === 'inbound-rtp' &&\n report.kind === 'audio' &&\n report.trackIdentifier === audioTrackId) {\n getLogger().trace(`audio inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n audioPacketsReceived = report.packetsReceived;\n }\n if (report.type === 'inbound-rtp' &&\n report.kind === 'video' &&\n report.trackIdentifier === videoTrackId) {\n getLogger().trace(`video inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n videoPacketsReceived = report.packetsReceived;\n }\n });\n }\n catch (error) {\n getLogger().warn('getStats error', error);\n }\n finally {\n const noAudioChanged = audioPacketsReceived && audioPacketsReceived <= previousAudioValue;\n const noVideoChanged = videoPacketsReceived && videoPacketsReceived <= previousVideoValue;\n if (noAudioChanged && noVideoChanged) {\n getLogger().warn(`audioPacketsReceived: ${audioPacketsReceived} - previousAudioValue: ${previousAudioValue}`);\n getLogger().warn(`videoPacketsReceived: ${videoPacketsReceived} - previousVideoValue: ${previousVideoValue}`);\n rtcPeer.triggerResume();\n }\n else {\n previousAudioValue = audioPacketsReceived !== null && audioPacketsReceived !== void 0 ? audioPacketsReceived : previousAudioValue;\n previousVideoValue = videoPacketsReceived !== null && videoPacketsReceived !== void 0 ? videoPacketsReceived : previousVideoValue;\n clearTimer();\n if (run && rtcPeer.instance.connectionState !== 'closed') {\n timer = setTimeout(() => meter(), rtcPeer.watchMediaPacketsTimeout);\n }\n }\n }\n };\n return {\n start: () => {\n clearTimer();\n meter();\n },\n stop: () => {\n run = false;\n clearTimer();\n },\n };\n};\n//# sourceMappingURL=watchRTCPeerMediaPackets.js.map","import { __rest } from \"tslib\";\nimport { getLogger, sagaEffects, VertoResult, VertoPong, isWebrtcEventType, sagaHelpers, componentActions, } from '@signalwire/core';\nconst isWebrtcAction = (action) => {\n return isWebrtcEventType(action.type);\n};\nexport const vertoEventWorker = function* (options) {\n getLogger().debug('vertoEventWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const worker = function* (action) {\n var _a, _b;\n const { id: jsonrpcId, method, params = {} } = action.payload;\n const { callID, nodeId } = params;\n const peer = instance.getRTCPeerById(callID);\n if (!peer) {\n getLogger().warn(`RTCPeer '${callID}' not found for method: '${method}'`, params);\n return;\n }\n const activeRTCPeer = instance.peer;\n // getLogger().warn('vertoEventWorker', method, params)\n switch (method) {\n case 'verto.media':\n case 'verto.answer': {\n /**\n * verto.media and verto.answer share the same logic\n *\n * Always invoke peer.onRemoteSdp(params.sdp) on the proper RTCPeer\n * If the `params.callID` is the current ACTIVE peer, set the BaseConnection state to 'early' | 'active'\n * If the `params.callID` is NOT the current peer just setup the media (ie: promote/demote)\n */\n if (peer.uuid === (activeRTCPeer === null || activeRTCPeer === void 0 ? void 0 : activeRTCPeer.uuid)) {\n const state = method === 'verto.media' ? 'early' : 'active';\n instance.setState(state);\n }\n if (params === null || params === void 0 ? void 0 : params.sdp) {\n peer.onRemoteSdp(params.sdp);\n }\n yield sagaEffects.put(componentActions.upsert({\n id: (_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID,\n nodeId: (_b = action.payload.params) === null || _b === void 0 ? void 0 : _b.nodeId,\n }));\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.bye': {\n /**\n * If the `params.callID` is the current ACTIVE peer, stop everything and destroy the BaseConnection\n * If the `params.callID` is NOT the current peer, but is there from promote/demote process stop/destroy just the peer\n */\n yield sagaEffects.call([instance, instance.onVertoBye], {\n rtcPeerId: callID,\n byeCause: params === null || params === void 0 ? void 0 : params.cause,\n byeCauseCode: params === null || params === void 0 ? void 0 : params.causeCode,\n redirectDestination: params === null || params === void 0 ? void 0 : params.redirectDestination,\n });\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.ping': {\n // Remove nodeId from params\n const { nodeId } = params, pongParams = __rest(params, [\"nodeId\"]);\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoPong(pongParams),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.mediaParams': {\n if (!callID || !params.mediaParams) {\n getLogger().warn(`Invalid mediaParams event`, params);\n break;\n }\n const { audio, video } = params.mediaParams;\n if (peer && video) {\n peer.applyMediaConstraints('video', video);\n }\n if (peer && audio) {\n peer.applyMediaConstraints('audio', audio);\n }\n break;\n }\n case 'verto.display': {\n /** Call is active so set the RTCPeer */\n instance.setActiveRTCPeer(rtcPeerId);\n instance.emit('verto.display', action.payload.params);\n break;\n }\n default:\n return getLogger().warn(`Unknown Verto method: ${method}`, params);\n }\n };\n const catchableWorker = sagaHelpers.createCatchableSaga(worker, (error) => {\n getLogger().error('Verto Error', error);\n });\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n var _a;\n if (isWebrtcAction(action)) {\n return ((_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID) === rtcPeerId;\n }\n return false;\n });\n yield sagaEffects.fork(catchableWorker, action);\n }\n getLogger().trace('vertoEventWorker ended');\n};\n//# sourceMappingURL=vertoEventWorker.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { getLogger, sagaEffects, componentActions, Rooms, } from '@signalwire/core';\nexport const roomSubscribedWorker = function* (options) {\n getLogger().debug('roomSubscribedWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.room.subscribed') {\n return action.payload.call_id === rtcPeerId;\n }\n return false;\n });\n // New emitter should not change the payload by reference\n const clonedPayload = JSON.parse(JSON.stringify(action.payload));\n /**\n * In here we joined a room_session so we can swap between RTCPeers\n */\n instance.setActiveRTCPeer(rtcPeerId);\n /**\n * TODO: Replace the redux action/component with properties on RTCPeer instance?\n */\n yield sagaEffects.put(componentActions.upsert({\n id: action.payload.call_id,\n roomId: action.payload.room_session.room_id,\n roomSessionId: action.payload.room_session.id,\n memberId: action.payload.member_id,\n previewUrl: action.payload.room_session.preview_url,\n }));\n instance.emit('room.joined', transformPayload.call(instance, clonedPayload));\n getLogger().debug('roomSubscribedWorker ended', rtcPeerId);\n};\nfunction transformPayload(payload) {\n const keys = ['room_session', 'room'];\n keys.forEach((key) => {\n if (payload[key].recordings) {\n payload[key].recordings = (payload[key].recordings || []).map((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n },\n });\n }\n else {\n recordingInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n });\n }\n this.instanceMap.set(recording.id, recordingInstance);\n return recordingInstance;\n });\n }\n if (payload[key].playbacks) {\n payload[key].playbacks = (payload[key].playbacks || []).map((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n },\n });\n }\n else {\n playbackInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n });\n }\n this.instanceMap.set(playback.id, playbackInstance);\n return playbackInstance;\n });\n }\n if (payload[key].streams) {\n payload[key].streams = (payload[key].streams || []).map((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n },\n });\n }\n else {\n streamInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n });\n }\n this.instanceMap.set(stream.id, streamInstance);\n return streamInstance;\n });\n }\n });\n return payload;\n}\n//# sourceMappingURL=roomSubscribedWorker.js.map","import { getLogger, sagaEffects, sessionActions, selectors, } from '@signalwire/core';\nexport const promoteDemoteWorker = function* (options) {\n getLogger().debug('promoteDemoteWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for promoteDemoteWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.member.promoted' ||\n action.type === 'video.member.demoted') {\n return action.payload.member_id === instance.memberId;\n }\n return false;\n });\n getLogger().debug('promoteDemoteWorker:', action.type, action.payload);\n yield sagaEffects.put(sessionActions.updateAuthState(action.payload.authorization));\n const authState = yield sagaEffects.select(selectors.getAuthState);\n if (!authState) {\n throw new Error(`Invalid authState for '${action.type}'`);\n }\n // TODO: use the new getJoinMediaParams in here\n const { audio_allowed, video_allowed } = authState;\n switch (action.type) {\n case 'video.member.promoted':\n /**\n * Promote means enable the media allowed and keep the\n * same recv settings. (do not force recv media)\n */\n instance.updateMediaOptions({\n audio: audio_allowed === 'both',\n video: video_allowed === 'both',\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n case 'video.member.demoted':\n /**\n * Demote means force recvonly and receive only the media allowed.\n */\n instance.updateMediaOptions({\n audio: false,\n video: false,\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n }\n instance._triggerNewRTCPeer();\n getLogger().debug('promoteDemoteWorker ended', rtcPeerId);\n};\n//# sourceMappingURL=promoteDemoteWorker.js.map","import { getLogger, sagaEffects, actions, } from '@signalwire/core';\nexport const sessionAuthWorker = function* (options) {\n getLogger().debug('sessionAuthWorker started');\n const { instance } = options;\n const action = yield sagaEffects.take([\n actions.authSuccessAction.type,\n actions.authErrorAction.type,\n ]);\n switch (action.type) {\n case actions.authSuccessAction.type:\n yield sagaEffects.call([instance, instance.resume]);\n break;\n case actions.authErrorAction.type:\n yield sagaEffects.call([instance, instance.setState], 'hangup');\n break;\n }\n getLogger().debug('sessionAuthWorker ended');\n};\n//# sourceMappingURL=sessionAuthWorker.js.map","import { VertoBye, VertoInfo, VertoInvite, BaseComponent, selectors, VertoModify, componentSelectors, actions, isSATAuth, \n// VertoAttach,\nVertoAnswer, } from '@signalwire/core';\nimport RTCPeer from './RTCPeer';\nimport { stopTrack, getUserMedia, streamIsValid } from './utils';\nimport { sdpRemoveLocalCandidates } from './utils/sdpHelpers';\nimport * as workers from './workers';\nconst INVITE_VERSION = 1000;\nconst AUDIO_CONSTRAINTS = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n};\nconst AUDIO_CONSTRAINTS_SCREENSHARE = Object.assign(Object.assign({}, AUDIO_CONSTRAINTS), { noiseSuppression: false, autoGainControl: false, \n // @ts-expect-error\n googAutoGainControl: false });\nconst VIDEO_CONSTRAINTS = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n};\nconst DEFAULT_CALL_OPTIONS = {\n destinationNumber: 'room',\n remoteCallerName: 'Outbound Call',\n remoteCallerNumber: '',\n callerName: '',\n callerNumber: '',\n audio: AUDIO_CONSTRAINTS,\n video: VIDEO_CONSTRAINTS,\n useStereo: false,\n attach: false,\n screenShare: false,\n additionalDevice: false,\n userVariables: {},\n requestTimeout: 10 * 1000,\n autoApplyMediaParams: true,\n iceGatheringTimeout: 2 * 1000,\n maxIceGatheringTimeout: 5 * 1000,\n maxConnectionStateTimeout: 3 * 1000,\n watchMediaPackets: true,\n watchMediaPacketsTimeout: 2 * 1000,\n};\nexport class BaseConnection extends BaseComponent {\n constructor(options) {\n super(options);\n /** @internal */\n this.leaveReason = undefined;\n /** @internal */\n this.gotEarly = false;\n /** @internal */\n this.doReinvite = false;\n this.state = 'new';\n this.prevState = 'new';\n this.rtcPeerMap = new Map();\n this.resuming = false;\n /** @internal */\n this.onVertoBye = (params) => {\n this.logger.debug('onVertoBye', params);\n const { rtcPeerId, byeCause = 'NORMAL_CLEARING', byeCauseCode = '16', redirectDestination, } = params;\n this.cause = String(byeCause);\n this.causeCode = String(byeCauseCode);\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer) {\n return this.logger.warn('Invalid RTCPeer to hangup', params);\n }\n if (redirectDestination && rtcPeer.localSdp) {\n this.logger.debug('Redirect Destination to:', redirectDestination, 'for RTCPeer:', rtcPeer.uuid);\n // Force nodeId to redirectDestination\n this.executeInvite(rtcPeer.localSdp, rtcPeer.uuid, redirectDestination);\n return;\n }\n // Notify RTCPeer for the bad signaling error\n rtcPeer.onRemoteBye({ code: this.causeCode, message: this.cause });\n // Set state to hangup only if the rtcPeer is the current one\n if (this.activeRTCPeerId === (rtcPeer === null || rtcPeer === void 0 ? void 0 : rtcPeer.uuid)) {\n this.logger.debug('onVertoBye go hangup');\n this.setState('hangup');\n }\n };\n this.options = Object.assign(Object.assign({}, DEFAULT_CALL_OPTIONS), options);\n this._checkDefaultMediaConstraints();\n this.setState('new');\n this.logger.trace('New Call with Options:', this.options);\n this._initPeer();\n }\n get id() {\n return this.__uuid;\n }\n get active() {\n return this.state === 'active';\n }\n get trying() {\n return this.state === 'trying';\n }\n get memberId() {\n // @ts-expect-error\n return this.component.memberId;\n }\n get previewUrl() {\n // @ts-expect-error\n return this.component.previewUrl;\n }\n get roomId() {\n // @ts-expect-error\n return this.component.roomId;\n }\n get roomSessionId() {\n // @ts-expect-error\n return this.component.roomSessionId;\n }\n get nodeId() {\n // @ts-expect-error\n return this.component.nodeId || this.options.nodeId;\n }\n get callId() {\n var _a;\n return ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.uuid) || '';\n }\n get localStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.localStream;\n }\n set localStream(stream) {\n if (this.peer) {\n this.peer.localStream = stream;\n }\n }\n get remoteStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.remoteStream;\n }\n get iceServers() {\n var _a, _b;\n return (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.iceServers) !== null && _b !== void 0 ? _b : this.select(selectors.getIceServers);\n }\n get component() {\n return (this.select((state) => componentSelectors.getComponent(state, this.callId)) || {});\n }\n /** @internal */\n dialogParams(rtcPeerId) {\n const { destinationNumber, attach, callerName, callerNumber, remoteCallerName, remoteCallerNumber, userVariables, screenShare, additionalDevice, pingSupported = true, } = this.options;\n return {\n dialogParams: {\n id: rtcPeerId,\n destinationNumber,\n attach,\n callerName,\n callerNumber,\n remoteCallerName,\n remoteCallerNumber,\n userVariables,\n screenShare,\n additionalDevice,\n pingSupported,\n version: INVITE_VERSION,\n },\n };\n }\n get cameraId() {\n return this.peer ? this.peer.getDeviceId('video') : null;\n }\n get cameraLabel() {\n return this.peer ? this.peer.getDeviceLabel('video') : null;\n }\n get microphoneId() {\n return this.peer ? this.peer.getDeviceId('audio') : null;\n }\n get microphoneLabel() {\n return this.peer ? this.peer.getDeviceLabel('audio') : null;\n }\n /** @internal */\n get withAudio() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasAudioReceiver);\n }\n /** @internal */\n get withVideo() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasVideoReceiver);\n }\n get localVideoTrack() {\n return this.peer ? this.peer.localVideoTrack : null;\n }\n get localAudioTrack() {\n return this.peer ? this.peer.localAudioTrack : null;\n }\n get peer() {\n return this.getRTCPeerById(this.activeRTCPeerId);\n }\n set peer(rtcPeer) {\n if (!rtcPeer) {\n this.logger.warn('Invalid RTCPeer', rtcPeer);\n return;\n }\n this.logger.debug('Set RTCPeer', rtcPeer.uuid, rtcPeer);\n this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n if (this.peer && this.peer.instance && this.callId !== rtcPeer.uuid) {\n const oldPeerId = this.peer.uuid;\n this.logger.debug('>>> Stop old RTCPeer', oldPeerId);\n // Hangup the previous RTCPeer\n this.hangup(oldPeerId).catch(console.error);\n this.peer.detachAndStop();\n // Remove RTCPeer from local cache to stop answering to ping/pong\n // this.rtcPeerMap.delete(oldPeerId)\n }\n this.logger.debug('>>> Replace RTCPeer with', rtcPeer.uuid);\n this.activeRTCPeerId = rtcPeer.uuid;\n }\n getRTCPeerById(rtcPeerId) {\n return this.rtcPeerMap.get(rtcPeerId);\n }\n appendRTCPeer(rtcPeer) {\n return this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n }\n setActiveRTCPeer(rtcPeerId) {\n this.peer = this.getRTCPeerById(rtcPeerId);\n }\n setLocalStream(stream) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.peer || !this.localStream) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!streamIsValid(stream)) {\n return reject(new Error('Invalid stream provided.'));\n }\n const prevAudioTracks = this.localStream.getAudioTracks();\n const newAudioTracks = stream.getAudioTracks();\n if (newAudioTracks.length <= 0) {\n this.logger.info('No audio track found in the stream provided. Audio will be unaffected.');\n }\n else {\n prevAudioTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newAudioTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n const prevVideoTracks = this.localStream.getVideoTracks();\n const newVideoTracks = stream.getVideoTracks();\n if (newVideoTracks.length <= 0) {\n this.logger.info('No video track found in the stream provided. Video will be unaffected.');\n }\n else {\n prevVideoTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newVideoTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n await this.updateStream(this.localStream);\n this.logger.debug('setLocalStream done');\n resolve(this.localStream);\n }\n catch (error) {\n this.logger.error('setLocalStream', error);\n reject(error);\n }\n });\n }\n /**\n * @internal\n * Verto messages have to be wrapped into an execute\n * request and sent using the proper RPC WebRTCMethod.\n */\n vertoExecute(params) {\n return this.execute({\n method: this._getRPCMethod(),\n params,\n });\n }\n /** @internal */\n _getRPCMethod() {\n const authState = this.select(selectors.getAuthState);\n if (authState && isSATAuth(authState)) {\n return 'webrtc.verto';\n }\n return 'video.message';\n }\n /** @internal */\n async _triggerNewRTCPeer() {\n this.logger.debug('_triggerNewRTCPeer Start');\n try {\n this.logger.debug('Build a new RTCPeer');\n const rtcPeer = this._buildPeer('offer');\n this.logger.debug('Trigger start for the new RTCPeer!');\n await rtcPeer.start();\n }\n catch (error) {\n this.logger.error('Error building new RTCPeer to promote/demote', error);\n }\n }\n updateCamera(constraints) {\n return this.updateConstraints({\n video: Object.assign({ aspectRatio: 16 / 9 }, constraints),\n });\n }\n updateMicrophone(constraints) {\n return this.updateConstraints({\n audio: constraints,\n });\n }\n /** @internal */\n manageSendersWithConstraints(constraints) {\n if (constraints.audio === false) {\n this.logger.info('Switching off the microphone');\n this.stopOutboundAudio();\n }\n if (constraints.video === false) {\n this.logger.info('Switching off the camera');\n this.stopOutboundVideo();\n }\n return constraints.audio || constraints.video;\n }\n /**\n * @internal\n */\n updateConstraints(constraints, { attempt = 0 } = {}) {\n if (attempt > 1) {\n return Promise.reject(new Error('Failed to update constraints'));\n }\n return new Promise(async (resolve, reject) => {\n var _a, _b, _c;\n try {\n if (!this.peer) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!Object.keys(constraints).length) {\n return reject(new Error('Invalid audio/video constraints.'));\n }\n this.logger.debug('updateConstraints trying constraints', this.__uuid, constraints);\n const shouldContinueWithUpdate = this.manageSendersWithConstraints(constraints);\n if (!shouldContinueWithUpdate) {\n this.logger.debug('Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped');\n return resolve();\n }\n /**\n * On some devices/browsers you cannot open more than one MediaStream at\n * a time, per process. When this happens we'll try to do the following:\n * 1. Stop the current media tracks\n * 2. Try to get new media tracks with the new constraints\n * 3. If we get an error: restore the media tracks using the previous\n * constraints.\n * @see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1238038\n *\n * Instead of just replace the track, force-stop the current one to free\n * up the device\n */\n let oldConstraints = {};\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => {\n var _a;\n /**\n * We'll keep a reference of the original constraints so if something\n * fails we should be able to restore them.\n */\n // @ts-expect-error\n oldConstraints[track.kind] = track.getConstraints();\n // @ts-expect-error\n if (constraints[track.kind] !== undefined) {\n this.logger.debug('updateConstraints stop old tracks first?');\n this.logger.debug('Track readyState:', track.kind, track.readyState);\n stopTrack(track);\n track.stop();\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n let newStream;\n try {\n this.logger.info('updateConstraints with', constraints);\n newStream = await getUserMedia(constraints);\n }\n catch (error) {\n this.logger.error('Error updating device constraints:', error.name, error.message, error);\n this.logger.info('Restoring previous constraints', oldConstraints);\n await this.updateConstraints(oldConstraints, {\n attempt: attempt + 1,\n });\n return reject(error);\n }\n await this.updateStream(newStream);\n this.logger.debug('updateConstraints done');\n resolve();\n }\n catch (error) {\n this.logger.error('updateConstraints', error);\n reject(error);\n }\n finally {\n (_b = this.peer) === null || _b === void 0 ? void 0 : _b._attachAudioTrackListener();\n (_c = this.peer) === null || _c === void 0 ? void 0 : _c._attachVideoTrackListener();\n }\n });\n }\n async updateStream(stream) {\n if (!this.peer) {\n throw new Error('Invalid RTCPeerConnection.');\n }\n // Store the previous tracks for device.updated event\n const prevVideoTrack = this.localVideoTrack;\n const prevAudioTrack = this.localAudioTrack;\n // Detach listeners because updateStream will trigger the track ended event\n this.peer._detachAudioTrackListener();\n this.peer._detachVideoTrackListener();\n this.logger.debug('updateStream got stream', stream);\n if (!this.localStream) {\n this.localStream = new MediaStream();\n }\n const { instance } = this.peer;\n const tracks = stream.getTracks();\n this.logger.debug(`updateStream got ${tracks.length} tracks`);\n for (let i = 0; i < tracks.length; i++) {\n const newTrack = tracks[i];\n this.logger.debug('updateStream apply track: ', newTrack);\n const transceiver = instance\n .getTransceivers()\n .find(({ mid, sender, receiver }) => {\n if (sender.track && sender.track.kind === newTrack.kind) {\n this.logger.debug('Found transceiver by sender');\n return true;\n }\n if (receiver.track && receiver.track.kind === newTrack.kind) {\n this.logger.debug('Found transceiver by receiver');\n return true;\n }\n if (mid === null) {\n this.logger.debug('Found disassociated transceiver');\n return true;\n }\n return false;\n });\n if (transceiver && transceiver.sender) {\n this.logger.debug('updateStream got transceiver', transceiver.currentDirection, transceiver.mid);\n await transceiver.sender.replaceTrack(newTrack);\n this.logger.debug('updateStream replaceTrack');\n transceiver.direction = 'sendrecv';\n this.logger.debug('updateStream set to sendrecv');\n this.localStream.getTracks().forEach((track) => {\n var _a;\n if (track.kind === newTrack.kind && track.id !== newTrack.id) {\n this.logger.debug('updateStream stop old track and apply new one - ');\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n this.localStream.addTrack(newTrack);\n }\n else {\n this.logger.debug('updateStream no transceiver found. addTrack and start dancing!');\n this.peer.type = 'offer';\n this.doReinvite = true;\n this.localStream.addTrack(newTrack);\n instance.addTrack(newTrack, this.localStream);\n }\n this.logger.debug('updateStream simply update mic/cam');\n if (newTrack.kind === 'audio') {\n // @ts-expect-error\n this.emit('microphone.updated', {\n previous: {\n deviceId: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.id,\n label: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.label,\n },\n current: {\n deviceId: newTrack === null || newTrack === void 0 ? void 0 : newTrack.id,\n label: newTrack === null || newTrack === void 0 ? void 0 : newTrack.label,\n },\n });\n this.options.micId = newTrack.getSettings().deviceId;\n }\n else if (newTrack.kind === 'video') {\n // @ts-expect-error\n this.emit('camera.updated', {\n previous: {\n deviceId: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.id,\n label: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.label,\n },\n current: {\n deviceId: newTrack === null || newTrack === void 0 ? void 0 : newTrack.id,\n label: newTrack === null || newTrack === void 0 ? void 0 : newTrack.label,\n },\n });\n this.options.camId = newTrack.getSettings().deviceId;\n }\n }\n this.logger.debug('updateStream done');\n }\n runRTCPeerWorkers(rtcPeerId) {\n this.runWorker('vertoEventWorker', {\n worker: workers.vertoEventWorker,\n initialState: { rtcPeerId },\n });\n const main = !(this.options.additionalDevice || this.options.screenShare);\n if (main) {\n this.runWorker('roomSubscribedWorker', {\n worker: workers.roomSubscribedWorker,\n initialState: { rtcPeerId },\n });\n this.runWorker('promoteDemoteWorker', {\n worker: workers.promoteDemoteWorker,\n initialState: { rtcPeerId },\n });\n }\n }\n /** @internal */\n invite() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'outbound';\n this.peer = this._buildPeer('offer');\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Invite error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n answer() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'inbound';\n if (!this.peer) {\n this.peer = this._buildPeer('answer');\n }\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Answer error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n onLocalSDPReady(rtcPeer) {\n if (!rtcPeer.instance.localDescription) {\n this.logger.error('Missing localDescription', rtcPeer);\n throw new Error('Invalid RTCPeerConnection localDescription');\n }\n const { type, sdp } = rtcPeer.instance.localDescription;\n const mungedSDP = this._mungeSDP(sdp);\n this.logger.debug('LOCAL SDP \\n', `Type: ${type}`, '\\n\\n', mungedSDP);\n switch (type) {\n case 'offer':\n this._watchSessionAuth();\n // If we have a remoteDescription already, send reinvite\n if (!this.resuming && rtcPeer.instance.remoteDescription) {\n return this.executeUpdateMedia(mungedSDP, rtcPeer.uuid);\n }\n else {\n return this.executeInvite(mungedSDP, rtcPeer.uuid);\n }\n case 'answer':\n return this.executeAnswer(mungedSDP, rtcPeer.uuid);\n default:\n return this.logger.error(`Unknown SDP type: '${type}' on call ${this.id}`);\n }\n }\n /** @internal */\n _closeWSConnection() {\n this._watchSessionAuth();\n this.store.dispatch(actions.sessionForceCloseAction());\n }\n _watchSessionAuth() {\n if (this.sessionAuthTask) {\n this.sessionAuthTask.cancel();\n }\n this.sessionAuthTask = this.runWorker('sessionAuthWorker', {\n worker: workers.sessionAuthWorker,\n });\n }\n /** @internal */\n async resume() {\n var _a;\n this.logger.warn(`[resume] Call ${this.id}`);\n if ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.instance) {\n const { connectionState } = this.peer.instance;\n this.logger.debug(`[resume] connectionState for ${this.id} is '${connectionState}'`);\n if (connectionState !== 'closed') {\n this.resuming = true;\n this.peer.restartIce();\n }\n }\n }\n /**\n * Send the `verto.invite` only if the state is either `new` or `requesting`\n * - new: the first time we send out the offer.\n * - requesting: we received a redirectDestination so need to send it again\n * specifying nodeId.\n *\n * @internal\n */\n async executeInvite(sdp, rtcPeerId, nodeId) {\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer || (rtcPeer.instance.remoteDescription && !this.resuming)) {\n throw new Error(`RTCPeer '${rtcPeerId}' already has a remoteDescription. Invalid invite.`);\n }\n // Set state to `requesting` only when `new`, otherwise keep it as `requesting`.\n if (this.state === 'new') {\n this.setState('requesting');\n }\n try {\n const ssOpts = this.options.screenShare\n ? {\n layout: this.options.layout,\n positions: this.options.positions,\n }\n : {};\n const message = VertoInvite(Object.assign(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), ssOpts), { sdp }));\n let subscribe = [];\n if (this.options.screenShare) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.screenshare'];\n }\n else if (this.options.additionalDevice) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.additionaldevice'];\n }\n else {\n subscribe = this.getSubscriptions();\n }\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe,\n });\n this.logger.debug('Invite response', response);\n this.resuming = false;\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /**\n * Send the `verto.answer` only if the state is `new`\n * - new: the first time we send out the answer.\n * @internal\n */\n async executeAnswer(sdp, rtcPeerId, nodeId) {\n // Set state to `answering` only when `new`, otherwise keep it as `answering`.\n if (this.state === 'new') {\n this.setState('answering');\n }\n try {\n const message = VertoAnswer(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe: this.getSubscriptions(),\n });\n this.logger.debug('Answer response', response);\n this.resuming = false;\n /** Call is active so set the RTCPeer */\n this.setActiveRTCPeer(rtcPeerId);\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /** @internal */\n async executeUpdateMedia(sdp, rtcPeerId) {\n try {\n const message = VertoModify(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp, action: 'updateMedia' }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n if (!response.sdp) {\n this.logger.error('UpdateMedia invalid SDP answer', response);\n }\n this.logger.debug('UpdateMedia response', response);\n if (!this.peer) {\n return this.logger.error('Invalid RTCPeer to updateMedia');\n }\n await this.peer.onRemoteSdp(response.sdp);\n }\n catch (error) {\n this.logger.error('UpdateMedia error', error);\n // this.setState('hangup')\n throw error;\n }\n }\n async hangup(id) {\n const rtcPeerId = id !== null && id !== void 0 ? id : this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(this.dialogParams(rtcPeerId));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('Hangup error:', error);\n }\n finally {\n if (rtcPeerId !== this.callId) {\n return this.logger.warn('Prevent setState hangup', rtcPeerId, this.callId);\n }\n this.setState('hangup');\n }\n }\n async hangupAll() {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(Object.assign({ cause: 'REJECT_ALL', causeCode: '825' }, this.dialogParams(rtcPeerId)));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('HangupAll error:', error);\n }\n finally {\n this.setState('hangup');\n }\n }\n async sendDigits(dtmf) {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to send DTMF');\n }\n const message = VertoInfo(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { dtmf }));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n /** @internal */\n doReinviteWithRelayOnly() {\n if (this.peer && this.active) {\n this.peer.restartIceWithRelayOnly();\n }\n }\n /** @internal */\n stopOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('audio');\n }\n }\n /** @internal */\n restoreOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('audio');\n }\n }\n /** @internal */\n stopOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('video');\n }\n }\n /** @internal */\n restoreOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('video');\n }\n }\n /** @internal */\n setState(state) {\n this.prevState = this.state;\n this.state = state;\n this.logger.trace(`Call ${this.id} state change from ${this.prevState} to ${this.state}`);\n // @ts-expect-error\n this.emitter.emit(this.state, this);\n switch (state) {\n case 'purge': {\n this._finalize();\n break;\n }\n case 'hangup': {\n this.setState('destroy');\n break;\n }\n case 'destroy':\n this._finalize();\n break;\n }\n }\n /** @internal */\n updateMediaOptions(options) {\n this.logger.debug('updateMediaOptions', Object.assign({}, options));\n this.options = Object.assign(Object.assign({}, this.options), options);\n this._checkDefaultMediaConstraints();\n }\n /**\n * Allow to define logic to munge the SDP\n *\n * @internal\n * */\n _mungeSDP(sdp) {\n return sdpRemoveLocalCandidates(sdp);\n }\n /**\n * Always use VIDEO_CONSTRAINTS if video: true\n * Always use AUDIO_CONSTRAINTS (or the SS one) if audio: true\n *\n * @internal\n */\n _checkDefaultMediaConstraints() {\n if (this.options.video === true) {\n this.options.video = VIDEO_CONSTRAINTS;\n }\n if (this.options.audio === true) {\n this.options.audio = this.options.screenShare\n ? AUDIO_CONSTRAINTS_SCREENSHARE\n : AUDIO_CONSTRAINTS;\n }\n }\n _initPeer() {\n // Build only for answer to be able to reject\n if (this.options.remoteSdp) {\n this.peer = this._buildPeer('answer');\n }\n }\n _buildPeer(type) {\n const rtcPeer = new RTCPeer(this, type);\n this.appendRTCPeer(rtcPeer);\n this.runRTCPeerWorkers(rtcPeer.uuid);\n return rtcPeer;\n }\n /** @internal */\n _finalize() {\n this.rtcPeerMap.forEach((rtcPeer) => {\n rtcPeer.stop();\n });\n this.rtcPeerMap.clear();\n }\n}\n//# sourceMappingURL=BaseConnection.js.map","import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n debounce,\n} from '@signalwire/core'\n\nconst addSDKPrefix = (input: string) => {\n return `sw-sdk-${input}`\n}\n\nconst buildVideo = () => {\n const video = document.createElement('video')\n video.muted = true\n video.autoplay = true\n video.playsInline = true\n\n /**\n * Local and Remov video elements should never be paused\n * and Safari/Firefox pause the video (ie: enabling PiP, switch cameras etc)\n * We try to force it to keep playing.\n */\n video.addEventListener('pause', () => {\n video.play().catch((error) => {\n getLogger().error('Video Element Paused', video, error)\n })\n })\n\n return video\n}\n\nconst waitForVideoReady = ({ element }: { element: HTMLVideoElement }) => {\n return new Promise<void>((resolve) => {\n element.addEventListener('canplay', function listener() {\n element.removeEventListener('canplay', listener)\n resolve()\n })\n element.addEventListener('resize', function listener() {\n element.removeEventListener('resize', listener)\n resolve()\n })\n })\n}\n\nconst _getLocationStyles = ({\n x,\n y,\n width,\n height,\n}: InternalVideoLayoutLayer) => {\n return {\n top: `${y}%`,\n left: `${x}%`,\n width: `${width}%`,\n height: `${height}%`,\n }\n}\n\nconst _buildLayer = ({ location }: { location: InternalVideoLayoutLayer }) => {\n const { top, left, width, height } = _getLocationStyles(location)\n const layer = document.createElement('div')\n layer.style.position = 'absolute'\n layer.style.overflow = 'hidden'\n layer.style.top = top\n layer.style.left = left\n layer.style.width = width\n layer.style.height = height\n\n return layer\n}\n\nexport interface LocalOverlay {\n readonly id: string\n status: 'hidden' | 'visible'\n domElement: HTMLDivElement | undefined\n hide(): void\n show(): void\n setLocalOverlayMediaStream(stream: MediaStream): void\n setLocalOverlayMirror(mirror?: boolean): void\n}\n\ninterface MakeLayoutChangedHandlerParams {\n localOverlay: LocalOverlay\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n myMemberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler =\n ({ localOverlay, rootElement }: MakeLayoutChangedHandlerParams) =>\n async ({ layout, myMemberId, localStream }: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layers = [] } = layout\n const location = layers.find(({ member_id }) => member_id === myMemberId)\n\n let myLayer = localOverlay.domElement\n // Update localOverlay.status if a location has been found\n localOverlay.status = location ? 'visible' : 'hidden'\n if (!location) {\n getLogger().debug('Location not found')\n if (myLayer) {\n getLogger().debug('Current layer not visible')\n localOverlay.hide()\n }\n\n return\n }\n\n if (!myLayer) {\n getLogger().debug('Build myLayer')\n myLayer = _buildLayer({ location })\n myLayer.id = localOverlay.id\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.disablePictureInPicture = true\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n localVideo.style.pointerEvents = 'none'\n localVideo.style.objectFit = 'cover'\n\n myLayer.appendChild(localVideo)\n\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n const exists = mcuLayers?.querySelector(`#${myLayer.id}`)\n if (mcuLayers && !exists) {\n getLogger().debug('Build myLayer append it')\n mcuLayers.appendChild(myLayer)\n localOverlay.domElement = myLayer\n localOverlay.setLocalOverlayMirror()\n return\n }\n\n getLogger().debug('Build myLayer >> wait next')\n return\n }\n\n const { top, left, width, height } = _getLocationStyles(location)\n getLogger().debug('Update myLayer:', top, left, width, height)\n /**\n * Show myLayer only if the localStream has a valid video track\n */\n const hasVideo =\n localStream\n .getVideoTracks()\n .filter((t) => t.enabled && t.readyState === 'live').length > 0\n if (hasVideo) {\n localOverlay.setLocalOverlayMediaStream(localStream)\n }\n myLayer.style.opacity = hasVideo ? '1' : '0'\n myLayer.style.top = top\n myLayer.style.left = left\n myLayer.style.width = width\n myLayer.style.height = height\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\n }\n }\n\nconst cleanupElement = (rootElement: HTMLElement) => {\n while (rootElement.firstChild) {\n rootElement.removeChild(rootElement.firstChild)\n }\n}\n\nconst setVideoMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLVideoElement\n}) => {\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n}\n\nconst createRootElementResizeObserver = ({\n video,\n rootElement,\n paddingWrapper,\n}: {\n video: HTMLVideoElement\n rootElement: HTMLElement\n paddingWrapper: HTMLDivElement\n}) => {\n const computePaddingWrapperWidth = (width: number, height: number) => {\n const nativeVideoRatio = video.videoWidth / video.videoHeight\n const rootElementRatio = width / height\n if (nativeVideoRatio > rootElementRatio) {\n return '100%'\n } else {\n return `${height * nativeVideoRatio}px`\n }\n }\n\n const maxPaddingBottom = (video.videoHeight / video.videoWidth) * 100\n // debounce to avoid multiple calls\n const update = debounce(\n ({ width, height }: { width: number; height: number }) => {\n if (paddingWrapper) {\n const pb = (height / width) * 100\n paddingWrapper.style.paddingBottom = `${\n pb > maxPaddingBottom ? maxPaddingBottom : pb\n }%`\n paddingWrapper.style.width = computePaddingWrapperWidth(width, height)\n }\n },\n 100\n )\n\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n // Firefox implements `contentBoxSize` as a single content rect, rather than an array\n const { inlineSize, blockSize } = Array.isArray(entry.contentBoxSize)\n ? entry.contentBoxSize[0]\n : entry.contentBoxSize\n update({ width: inlineSize, height: blockSize })\n } else if (entry.contentRect) {\n update({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n }\n })\n })\n\n return {\n start: () => observer.observe(rootElement),\n stop: () => observer.disconnect(),\n }\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n addSDKPrefix,\n createRootElementResizeObserver,\n}\n","const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n","import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n","import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n LocalOverlay,\n addSDKPrefix,\n createRootElementResizeObserver,\n} from '../../utils/videoElement'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport type { RoomSessionConnection } from '../../BaseRoomSession'\n\nexport const makeVideoElementSaga = ({\n rootElement,\n applyLocalVideoOverlay,\n}: {\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n}) => {\n return function* videoElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n try {\n const layerMap = new Map<string, HTMLDivElement>()\n const videoEl = buildVideo()\n\n /**\n * We used this `LocalOverlay` interface to interact with the localVideo\n * overlay DOM element in here and in the `layoutChangedHandler`.\n * The idea is to avoid APIs like `document.getElementById` because it\n * won't work if the SDK is used within a Shadow DOM tree.\n * Instead of querying the `document`, let's use our `layerMap`.\n */\n const localOverlay: LocalOverlay = {\n // Each `layout.changed` event will update `status`\n status: 'hidden',\n get id() {\n // FIXME: Use `id` until the `memberId` is stable between promote/demote\n return addSDKPrefix(room.id)\n },\n get domElement() {\n return layerMap.get(this.id)\n },\n set domElement(element: HTMLDivElement | undefined) {\n if (element) {\n getLogger().debug('Set localOverlay', element)\n layerMap.set(this.id, element)\n } else {\n getLogger().debug('Remove localOverlay')\n layerMap.delete(this.id)\n }\n },\n hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to hide')\n }\n this.domElement.style.opacity = '0'\n },\n show() {\n if (!this.domElement) {\n return getLogger().warn('Missing localOverlay to show')\n }\n if (this.status === 'hidden') {\n return getLogger().info('localOverlay not visible')\n }\n this.domElement.style.opacity = '1'\n },\n setLocalOverlayMediaStream(stream: MediaStream) {\n if (!this.domElement) {\n return getLogger().warn(\n 'Missing localOverlay to set the local overlay stream'\n )\n }\n const localVideo = this.domElement.querySelector('video')\n if (localVideo) {\n localVideo.srcObject = stream\n }\n },\n setLocalOverlayMirror(mirror: boolean) {\n if (!this.domElement || !this.domElement.firstChild) {\n return getLogger().warn('Missing localOverlay to set the mirror')\n }\n const videoEl = this.domElement.firstChild as HTMLVideoElement\n if (mirror ?? room.localOverlay.mirrored) {\n videoEl.style.transform = 'scale(-1, 1)'\n videoEl.style.webkitTransform = 'scale(-1, 1)'\n } else {\n videoEl.style.transform = 'scale(1, 1)'\n videoEl.style.webkitTransform = 'scale(1, 1)'\n }\n },\n }\n\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n localOverlay,\n })\n\n let hasVideoTrack = false\n let lastLayoutChanged: any = null\n\n const _processLayoutChanged = (params: any) => {\n // FIXME: expose a method on BaseConnection\n if (room.peer?.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n } else {\n localOverlay.hide()\n }\n }\n\n // @ts-expect-error\n room.on(`${LOCAL_EVENT_PREFIX}.mirror.video`, (value: boolean) => {\n localOverlay.setLocalOverlayMirror(value)\n })\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed - videoTrack', hasVideoTrack)\n if (hasVideoTrack) {\n _processLayoutChanged(params)\n return\n }\n\n lastLayoutChanged = params\n })\n\n /**\n * If the user joins with `join_video_muted: true` or\n * `join_audio_muted: true` we'll stop the streams\n * right away.\n */\n room.on('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n getLogger().error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n }\n\n if (room.localStream) {\n localOverlay.setLocalOverlayMediaStream(room.localStream)\n }\n })\n\n room.on('member.updated.video_muted', (params) => {\n try {\n const { member } = params\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted ? localOverlay.hide() : localOverlay.show()\n }\n } catch (error) {\n getLogger().error('Error handling video_muted', error)\n }\n })\n\n let videoTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'video': {\n videoTask = runSaga(videoElementSetupWorker, {\n applyLocalVideoOverlay,\n rootElement,\n track: event.track,\n element: videoEl,\n })\n\n hasVideoTrack = true\n if (lastLayoutChanged) {\n _processLayoutChanged(lastLayoutChanged)\n }\n break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the videoEl with the new track.\n */\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n cleanupElement(rootElement)\n layerMap.clear()\n videoTask?.cancel()\n })\n } catch (error) {\n getLogger().error('videoElementSaga', error)\n }\n }\n}\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<RoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = room.getAudioEl()\n let audioTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'audio': {\n audioTask = runSaga(audioElementSetupWorker, {\n track: event.track,\n element: audioEl,\n speakerId,\n room,\n })\n break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the audioEl with the new track.\n */\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n audioTask?.cancel()\n })\n } catch (error) {\n getLogger().error('audioElementSaga', error)\n }\n }\n}\n\nfunction* audioElementActionsWatcher({\n element,\n room,\n}: {\n element: HTMLAudioElement\n room: RoomSessionConnection\n}): SagaIterator {\n // TODO: For now we're handling individual actions but in the future\n // we might want to have a single action per custom saga and use it\n // in a similar fashion to `executeAction`\n const setSpeakerActionType = actions.getCustomSagaActionType(\n room.__uuid,\n audioSetSpeakerAction\n )\n\n while (true) {\n const action = yield sagaEffects.take([setSpeakerActionType])\n\n try {\n switch (action.type) {\n case setSpeakerActionType:\n const response = yield sagaEffects.call(\n setMediaElementSinkId,\n element,\n action.payload\n )\n\n room.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n action.payload\n )\n\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: response,\n kind: 'resolve',\n })\n break\n }\n } catch (error) {\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: error,\n kind: 'reject',\n })\n getLogger().error(error)\n }\n }\n}\n\nfunction* audioElementSetupWorker({\n track,\n element,\n speakerId,\n room,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n speakerId?: string\n room: RoomSessionConnection\n}): SagaIterator {\n setAudioMediaTrack({ track, element })\n if (speakerId) {\n // Catch no-op since setMediaElementSinkId already provides logs\n setMediaElementSinkId(element, speakerId).catch(() => {})\n }\n\n yield sagaEffects.fork(audioElementActionsWatcher, {\n element,\n room,\n })\n}\n\nfunction* videoElementSetupWorker({\n rootElement,\n applyLocalVideoOverlay = true,\n track,\n element,\n}: {\n // TODO: we'll move this to a separate type once we define how to\n // dispatch action that only target unique sagas\n rootElement: HTMLElement\n applyLocalVideoOverlay?: boolean\n track: MediaStreamTrack\n element: HTMLVideoElement\n}): SagaIterator {\n try {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n element.style.maxHeight = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\n return\n }\n if (rootElement.querySelector('.mcuContent')) {\n getLogger().debug('MCU Content already there')\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(element)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.classList.add('paddingWrapper')\n paddingWrapper.style.paddingBottom = '56.25%'\n paddingWrapper.style.position = 'relative'\n paddingWrapper.style.width = '100%'\n paddingWrapper.appendChild(mcuWrapper)\n\n const layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.classList.add('mcuContent')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.height = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.style.display = 'flex'\n relativeWrapper.style.alignItems = 'center'\n relativeWrapper.style.justifyContent = 'center'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.width = '100%'\n rootElement.style.height = '100%'\n rootElement.appendChild(relativeWrapper)\n\n getLogger().debug('MCU readyState 1 >>', element.readyState)\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n yield sagaEffects.call(waitForVideoReady, { element })\n }\n getLogger().debug('MCU is ready..')\n\n const rootElementResizeObserver = createRootElementResizeObserver({\n rootElement,\n video: element,\n paddingWrapper,\n })\n rootElementResizeObserver.start()\n track.addEventListener('ended', () => {\n if (rootElementResizeObserver) {\n rootElementResizeObserver.stop()\n }\n })\n\n layersWrapper.style.display = 'block'\n } catch (error) {\n getLogger().error('Handle video track error', error)\n }\n}\n","export const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n BaseConnectionState,\n RoomLeft,\n RoomLeftEventParams,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEvent } from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\ntype RoomSessionScreenShareEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionScreenShare) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEvent, () => void>\n\nexport type RoomSessionScreenShareEvents = {\n [k in keyof RoomSessionScreenShareEventsHandlerMap]: RoomSessionScreenShareEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<RoomSessionScreenShareEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionScreenShareEvents>['runWorker']\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<RoomSessionScreenShareEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * Represents a screen sharing.\n */\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n BaseConnectionState,\n RoomLeft,\n RoomLeftEventParams,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEvent } from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\ntype RoomSessionDeviceEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionDevice) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEvent, () => void>\n\nexport type RoomSessionDeviceEvents = {\n [k in keyof RoomSessionDeviceEventsHandlerMap]: RoomSessionDeviceEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<RoomSessionDeviceEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionDeviceEvents>['runWorker']\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<RoomSessionDeviceEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n SwEventChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { RoomSession } from '../RoomSession'\nimport type { VideoMemberListUpdatedParams } from '../utils/interfaces'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(EXTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: RoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n swEventChannel,\n instance,\n}: {\n swEventChannel: SwEventChannel\n instance: any\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n swEventChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<RoomSession> =\n function* membersChangedWorker({\n channels: { swEventChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n swEventChannel,\n instance,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n VideoMemberJoinedEvent,\n componentSelectors,\n componentActions,\n type ReduxComponent,\n} from '@signalwire/core'\n\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype ChildMemberJoinedWorkerOnDone = () => void\ntype ChildMemberJoinedWorkerOnFail = (args: { error: Error }) => void\n\nexport type ChildMemberJoinedWorkerHooks = SDKWorkerHooks<\n ChildMemberJoinedWorkerOnDone,\n ChildMemberJoinedWorkerOnFail\n>\n\nexport const childMemberJoinedWorker: SDKWorker<\n BaseConnection<any>,\n ChildMemberJoinedWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().trace('childMemberJoinedWorker started')\n const { channels, instance, initialState, onDone, onFail } = options\n const { swEventChannel } = channels\n const { parentId } = initialState\n if (!parentId) {\n throw new Error('Missing parentId for childMemberJoinedWorker')\n }\n\n const action: MapToPubSubShape<VideoMemberJoinedEvent> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'video.member.joined') {\n return action.payload.member.parent_id === parentId\n }\n return false\n })\n\n /**\n * On video.member.joined with a parent_id, check if we are the\n * owner of the object comparing parent_id in the state.\n * If so update the state with the room values to update the\n * object.\n */\n const { member } = action.payload\n if (member?.parent_id) {\n const byId: Record<string, ReduxComponent> = yield sagaEffects.select(\n componentSelectors.getComponentsById\n )\n const parent = Object.values(byId).find((row) => {\n return 'memberId' in row && row.memberId === member.parent_id\n })\n if (parent) {\n yield sagaEffects.put(\n componentActions.upsert({\n id: instance.callId,\n roomId: action.payload.room_id,\n roomSessionId: action.payload.room_session_id,\n memberId: member.id,\n })\n )\n\n onDone?.()\n } else {\n onFail?.({ error: new Error('Unknown parent_id') })\n }\n }\n getLogger().trace('childMemberJoinedWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoStreamEvent,\n RoomSessionStream,\n Rooms,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoStreamWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>\n): SagaIterator {\n getLogger().trace('videoStreamWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let streamInstance = get<RoomSessionStream>(payload.stream.id)\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: roomSession.store,\n payload,\n })\n } else {\n streamInstance.setPayload(payload)\n }\n set<RoomSessionStream>(payload.stream.id, streamInstance)\n\n switch (type) {\n case 'video.stream.started':\n roomSession.emit('stream.started', streamInstance)\n break\n case 'video.stream.ended':\n roomSession.emit('stream.ended', streamInstance)\n remove<RoomSessionStream>(payload.stream.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoStreamWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionRecording,\n Rooms,\n VideoRecordingEvent,\n VideoRecordingEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoRecordWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>\n): SagaIterator {\n getLogger().trace('videoRecordWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let recordingInstance = get<RoomSessionRecording>(payload.recording.id)\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: roomSession.store,\n payload,\n })\n } else {\n recordingInstance.setPayload(payload)\n }\n set<RoomSessionRecording>(payload.recording.id, recordingInstance)\n\n const event = stripNamespacePrefix(type) as VideoRecordingEventNames\n\n switch (type) {\n case 'video.recording.started':\n case 'video.recording.updated': {\n roomSession.emit(event, recordingInstance)\n break\n }\n case 'video.recording.ended':\n roomSession.emit(event, recordingInstance)\n remove<RoomSessionRecording>(payload.recording.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoRecordWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionPlayback,\n Rooms,\n VideoPlaybackEvent,\n VideoPlaybackEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoPlaybackWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>\n): SagaIterator {\n getLogger().trace('videoPlaybackWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: roomSession.store,\n payload,\n })\n } else {\n playbackInstance.setPayload(payload)\n }\n set<RoomSessionPlayback>(payload.playback.id, playbackInstance)\n\n const event = stripNamespacePrefix(type) as VideoPlaybackEventNames\n\n switch (type) {\n case 'video.playback.started':\n case 'video.playback.updated': {\n roomSession.emit(event, playbackInstance)\n break\n }\n case 'video.playback.ended':\n roomSession.emit(event, playbackInstance)\n remove<RoomSessionPlayback>(payload.playback.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoPlaybackWorker ended')\n}\n","import {\n MapToPubSubShape,\n SDKActions,\n SDKWorker,\n SagaIterator,\n VideoAPIEventParams,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n MemberPosition,\n VideoAPIEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { RoomSessionConnection } from '../BaseRoomSession'\nimport { videoStreamWorker } from './videoStreamWorker'\nimport { videoRecordWorker } from './videoRecordWorker'\nimport { videoPlaybackWorker } from './videoPlaybackWorker'\n\nexport type VideoWorkerParams<T> = SDKWorkerParams<RoomSessionConnection> & {\n action: T\n}\n\nexport const videoWorker: SDKWorker<RoomSessionConnection> = function* (\n options\n): SagaIterator {\n const { channels, instance: roomSession } = options\n const { swEventChannel } = channels\n\n function* worker(action: MapToPubSubShape<VideoAPIEventParams>) {\n const { type, payload } = action\n\n switch (type) {\n case 'video.room.subscribed':\n yield sagaEffects.spawn(MemberPosition.memberPositionWorker, {\n ...options,\n instance: roomSession,\n initialState: payload,\n })\n break\n case 'video.playback.started':\n case 'video.playback.updated':\n case 'video.playback.ended':\n yield sagaEffects.fork(videoPlaybackWorker, {\n action,\n ...options,\n })\n return // Return since we don't need to handle the raw event for this\n case 'video.recording.started':\n case 'video.recording.updated':\n case 'video.recording.ended':\n yield sagaEffects.fork(videoRecordWorker, {\n action,\n ...options,\n })\n return\n case 'video.stream.ended':\n case 'video.stream.started':\n yield sagaEffects.fork(videoStreamWorker, {\n action,\n ...options,\n })\n return\n case 'video.room.audience_count': {\n roomSession.emit('room.audienceCount', payload)\n return\n }\n case 'video.member.talking': {\n const { member } = payload\n if ('talking' in member) {\n const suffix = member.talking ? 'started' : 'ended'\n roomSession.emit(`member.talking.${suffix}`, payload)\n\n // Keep for backwards compat.\n const deprecatedSuffix = member.talking ? 'start' : 'stop'\n roomSession.emit(`member.talking.${deprecatedSuffix}`, payload)\n }\n break // Break here since we do need the raw event sent to the client\n }\n default:\n break\n }\n\n roomSession.emit(stripNamespacePrefix(type) as VideoAPIEventNames, payload)\n }\n\n const isVideoEvent = (action: SDKActions) => action.type.startsWith('video.')\n\n while (true) {\n const action: MapToPubSubShape<VideoAPIEventParams> =\n yield sagaEffects.take(swEventChannel, isVideoEvent)\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoWorker ended')\n}\n","import {\n connect,\n Rooms,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n VideoAuthorization,\n LOCAL_EVENT_PREFIX,\n validateEventsToSubscribe,\n EventEmitter,\n} from '@signalwire/core'\nimport {\n getDisplayMedia,\n BaseConnection,\n BaseConnectionOptions,\n BaseConnectionStateEventTypes,\n supportsMediaOutput,\n createSpeakerDeviceWatcher,\n getSpeakerById,\n} from '@signalwire/webrtc'\nimport type {\n RoomSessionObjectEvents,\n CreateScreenShareObjectOptions,\n AddDeviceOptions,\n AddCameraOptions,\n AddMicrophoneOptions,\n BaseRoomInterface,\n RoomMethods,\n StartScreenShareOptions,\n RoomSessionConnectionContract,\n BaseRoomSessionJoinParams,\n LocalOverlay,\n} from './utils/interfaces'\nimport { SCREENSHARE_AUDIO_CONSTRAINTS } from './utils/constants'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare,\n RoomSessionScreenShareEvents,\n} from './RoomSessionScreenShare'\nimport {\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDevice,\n RoomSessionDeviceEvents,\n} from './RoomSessionDevice'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<T>\n extends RoomMethods,\n RoomSessionConnectionContract,\n BaseComponentContract,\n BaseConnectionContract<RoomSessionObjectEvents> {\n /**\n * Joins the room session.\n */\n join(options?: BaseRoomSessionJoinParams): Promise<T>\n\n /**\n * Leaves the room. This detaches all the locally originating streams from the\n * room.\n */\n leave(): Promise<void>\n}\n\nexport class RoomSessionConnection\n extends BaseConnection<RoomSessionObjectEvents>\n implements BaseRoomInterface, RoomSessionConnectionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _deviceList = new Set<RoomSessionDevice>()\n private _mirrored: LocalOverlay['mirrored']\n private _audioEl:\n | HTMLAudioElement & {\n sinkId?: string\n setSinkId?: (id: string) => Promise<void>\n }\n\n constructor(\n options: BaseConnection<RoomSessionObjectEvents> & {\n mirrorLocalVideoOverlay: boolean\n }\n ) {\n super(options)\n this._mirrored = options.mirrorLocalVideoOverlay\n\n this.runWorker('videoWorker', {\n worker: workers.videoWorker,\n })\n }\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n get interactivityMode() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.join_as ?? ''\n })\n }\n\n get permissions() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.room?.scopes ?? []\n })\n }\n\n /**\n * This method will be called by `join()` right before the\n * `connect()` happens and it's a way for us to control\n * exactly when the workers are attached.\n * @internal\n */\n protected attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n return new Promise<RoomSessionScreenShare>(async (resolve, reject) => {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n RoomSessionScreenShareEvents,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.once('destroy', () => {\n screenShare.emit('room.left')\n this._screenShareList.delete(screenShare)\n })\n\n try {\n screenShare.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(screenShare),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n return await screenShare.join()\n }\n return resolve(screenShare)\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n reject(error)\n }\n })\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n return new Promise<RoomSessionDevice>(async (resolve, reject) => {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n RoomSessionDeviceEvents,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n })(options)\n\n roomDevice.once('destroy', () => {\n roomDevice.emit('room.left')\n this._deviceList.delete(roomDevice)\n })\n\n try {\n roomDevice.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(roomDevice),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n return await roomDevice.join()\n }\n return resolve(roomDevice)\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n reject(error)\n }\n })\n }\n\n join() {\n return super.invite<BaseRoomSession<this>>()\n }\n\n leave() {\n return this.hangup()\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n const prevId = this._audioEl.sinkId as string\n this.once(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n async (newId: string) => {\n const prevSpeaker = await getSpeakerById(prevId)\n const newSpeaker = await getSpeakerById(newId)\n\n const isSame = newSpeaker?.deviceId === prevSpeaker?.deviceId\n if (!newSpeaker?.deviceId || isSame) return\n\n this.emit('speaker.updated', {\n previous: {\n deviceId: prevSpeaker?.deviceId,\n label: prevSpeaker?.label,\n },\n current: {\n deviceId: newSpeaker.deviceId,\n label: newSpeaker.label,\n },\n })\n }\n )\n\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n private _attachSpeakerTrackListener() {\n if (!supportsMediaOutput()) return\n\n // @TODO: Stop the watcher when user leave/disconnects\n createSpeakerDeviceWatcher().then((deviceWatcher) => {\n deviceWatcher.on('removed', async (data) => {\n const sinkId = this._audioEl.sinkId\n const disconnectedSpeaker = data.changes.find((device) => {\n const payloadDeviceId = device.payload.deviceId\n\n return (\n payloadDeviceId === sinkId ||\n (payloadDeviceId === '' && sinkId === 'default') ||\n (payloadDeviceId === 'default' && sinkId === '')\n )\n })\n if (disconnectedSpeaker) {\n this.emit('speaker.disconnected', {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n })\n\n /**\n * In case the currently in-use speaker disconnects, OS by default fallbacks to the default speaker\n * Set the sink id here to make the SDK consistent with the OS\n */\n await this._audioEl.setSinkId?.('')\n\n const defaultSpeakers = await getSpeakerById('default')\n\n if (!defaultSpeakers?.deviceId) return\n\n // Emit the speaker.updated event since the OS will fallback to the default speaker\n this.emit('speaker.updated', {\n previous: {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n },\n current: {\n deviceId: defaultSpeakers.deviceId,\n label: defaultSpeakers.label,\n },\n })\n }\n })\n })\n }\n\n getAudioEl() {\n if (this._audioEl) return this._audioEl\n this._audioEl = new Audio()\n this._attachSpeakerTrackListener()\n return this._audioEl\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup(id)\n }\n\n /** @internal */\n protected _finalize() {\n this._screenShareList.clear()\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /**\n * @deprecated Use {@link getLayouts} instead. `getLayoutList` will\n * be removed in v3.0.0\n */\n getLayoutList() {\n // @ts-expect-error\n return this.getLayouts()\n }\n\n /**\n * @deprecated Use {@link getMembers} instead. `getMemberList` will\n * be removed in v3.0.0\n */\n getMemberList() {\n // @ts-expect-error\n return this.getMembers()\n }\n\n /**\n * Local video stream overlay\n */\n get localOverlay() {\n return {\n mirrored: this._mirrored,\n setMirrored: (value: boolean) => {\n this._mirrored = value\n this.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.mirror.video`,\n this._mirrored\n )\n },\n }\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video.${event}`\n ) as EventEmitter.EventNames<RoomSessionObjectEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const RoomSessionAPI = extendComponent<\n RoomSessionConnection,\n RoomMethods\n>(RoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n getMeta: Rooms.getMeta,\n setMeta: Rooms.setMeta,\n updateMeta: Rooms.updateMeta,\n deleteMeta: Rooms.deleteMeta,\n getMemberMeta: Rooms.getMemberMeta,\n setMemberMeta: Rooms.setMemberMeta,\n updateMemberMeta: Rooms.updateMemberMeta,\n deleteMemberMeta: Rooms.deleteMemberMeta,\n promote: Rooms.promote,\n demote: Rooms.demote,\n getStreams: Rooms.getStreams,\n startStream: Rooms.startStream,\n lock: Rooms.lock,\n unlock: Rooms.unlock,\n setRaisedHand: Rooms.setRaisedHand,\n setPrioritizeHandraise: Rooms.setPrioritizeHandraise,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions\n): BaseRoomSession<RoomSessionType> => {\n const room = connect<\n RoomSessionObjectEventsHandlerMapping,\n RoomSessionConnection,\n BaseRoomSession<RoomSessionType>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: RoomSessionAPI,\n })(params)\n\n return room\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomsSubscribedEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomsWorker = function* (\n options: VideoManagerWorkerParams<\n MapToPubSubShape<VideoManagerRoomsSubscribedEvent>\n >\n): SagaIterator {\n getLogger().trace('videoManagerRoomsWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n const modPayload = {\n rooms: payload.rooms.map((row) => toExternalJSON(row)),\n }\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n modPayload\n )\n\n getLogger().trace('videoManagerRoomsWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomWorker = function* (\n options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>\n): SagaIterator {\n getLogger().trace('videoManagerRoomWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n toExternalJSON(payload)\n )\n\n getLogger().trace('videoManagerRoomWorker ended')\n}\n","import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n SDKWorkerParams,\n} from '@signalwire/core'\nimport type { VideoManager } from '../VideoManager'\nimport { videoManagerRoomsWorker } from './videoManagerRoomsWorker'\nimport { videoManagerRoomWorker } from './videoManagerRoomWorker'\n\nexport type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {\n action: T\n}\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const {\n channels: { swEventChannel },\n } = options\n\n function* worker(action: MapToPubSubShape<VideoManagerEvent>) {\n const { type } = action\n\n switch (type) {\n case 'video-manager.rooms.subscribed':\n yield sagaEffects.fork(videoManagerRoomsWorker, {\n action,\n ...options,\n })\n break\n case 'video-manager.room.added':\n case 'video-manager.room.deleted':\n case 'video-manager.room.ended':\n case 'video-manager.room.started':\n case 'video-manager.room.updated':\n yield sagaEffects.fork(videoManagerRoomWorker, {\n action,\n ...options,\n })\n break\n default:\n getLogger().warn(`Unknown video-manager event: \"${type}\"`)\n break\n }\n }\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoManagerWorker ended')\n}\n","import {\n BaseComponentOptions,\n VideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n VideoManagerRoomEntity,\n validateEventsToSubscribe,\n EventEmitter,\n BaseConsumer,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: VideoManagerRoomEntity) => void\n>\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n constructor(options: BaseComponentOptions) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video-manager.${event}`\n ) as EventEmitter.EventNames<VideoManagerEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const createVideoManagerObject = (params: BaseComponentOptions) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n","import {\n BaseClient,\n ClientEvents,\n ClientContract,\n actions,\n Chat as ChatNamespace,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport type { CustomSaga } from '@signalwire/core'\nimport { ConnectionOptions } from '@signalwire/webrtc'\nimport {\n makeVideoElementSaga,\n makeAudioElementSaga,\n} from './features/mediaElements/mediaElementsSagas'\nimport {\n createBaseRoomSessionObject,\n RoomSessionConnection,\n} from './BaseRoomSession'\nimport { VideoManager, createVideoManagerObject } from './cantina'\nimport type { Client as ChatClient } from './chat/Client'\nimport type { Client as PubSubClient } from './pubSub/Client'\nimport type { RoomSession } from './RoomSession'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI<RoomSessionType>['rooms']\n chat: ClientAPI<RoomSessionType>['chat']\n pubSub: ClientAPI<RoomSessionType>['pubSub']\n}\n\nexport interface MakeRoomOptions extends ConnectionOptions {\n /** HTML element in which to display the video stream */\n rootElement?: HTMLElement\n /** Whether to apply the local-overlay on top of your video. Default: `true`. */\n applyLocalVideoOverlay?: boolean\n /** Whether to mirror the local video overlay. Default: `false`. */\n mirrorLocalVideoOverlay?: boolean\n /** Whether to stop the camera when the member is muted. Default: `true`. */\n stopCameraWhileMuted?: boolean\n /** Whether to stop the microphone when the member is muted. Default: `true`. */\n stopMicrophoneWhileMuted?: boolean\n /** Local media stream to override the local video and audio stream tracks */\n localStream?: MediaStream\n}\n\nexport class ClientAPI<\n RoomSessionType = RoomSession\n> extends BaseClient<ClientEvents> {\n private _videoManager: VideoManager\n private _chat: ChatClient\n private _pubSub: PubSubClient\n\n get rooms() {\n return {\n makeRoomObject: (makeRoomOptions: MakeRoomOptions) => {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n // TODO: This might not be needed here. We can initiate these sagas in the BaseRoomSession constructor.\n const customSagas: Array<CustomSaga<RoomSessionConnection>> = []\n\n /**\n * By default the SDK will attach the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n customSagas.push(\n makeAudioElementSaga({\n speakerId: options.speakerId,\n })\n )\n\n /**\n * If the user provides a `roomElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n customSagas.push(\n makeVideoElementSaga({\n rootElement,\n applyLocalVideoOverlay,\n })\n )\n }\n\n const room = createBaseRoomSessionObject<RoomSessionType>({\n ...options,\n store: this.store,\n customSagas,\n })\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audio_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'audio_muted' in member) {\n member.audio_muted\n ? room.stopOutboundAudio()\n : room.restoreOutboundAudio()\n }\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n })\n }\n\n /**\n * Stop and Restore outbound video on video_muted event\n */\n if (stopCameraWhileMuted) {\n room.on('member.updated.video_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted\n ? room.stopOutboundVideo()\n : room.restoreOutboundVideo()\n }\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n })\n }\n\n return room\n },\n }\n }\n\n get chat() {\n if (!this._chat) {\n this._chat = ChatNamespace.createBaseChatObject<ChatClient>({\n store: this.store,\n })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n","function e(e){this.message=e}e.prototype=new Error,e.prototype.name=\"InvalidCharacterError\";var r=\"undefined\"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,\"\");if(t.length%4==1)throw new e(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var n,o,a=0,i=0,c=\"\";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(o);return c};function t(e){var t=e.replace(/-/g,\"+\").replace(/_/g,\"/\");switch(t.length%4){case 0:break;case 2:t+=\"==\";break;case 3:t+=\"=\";break;default:throw\"Illegal base64url string!\"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t=\"0\"+t),\"%\"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if(\"string\"!=typeof e)throw new n(\"Invalid token specified\");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(\".\")[o]))}catch(e){throw new n(\"Invalid token specified: \"+e.message)}}n.prototype=new Error,n.prototype.name=\"InvalidTokenError\";export default o;export{n as InvalidTokenError};\n//# sourceMappingURL=jwt-decode.esm.js.map\n","import jwtDecode from 'jwt-decode'\nimport { getLogger } from '@signalwire/core'\n\n/**\n * Note: ready to support RN with a \"storage.native.ts\" file.\n */\nexport const getStorage = () => {\n if (window && window.sessionStorage) {\n return window.sessionStorage\n }\n return undefined\n}\n\nexport const sessionStorageManager = (token: string) => {\n let roomName: string = ''\n try {\n const jwtPayload = jwtDecode<{ r: string; ja: string }>(token)\n roomName = jwtPayload?.r ?? ''\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[sessionStorageManager] error decoding JWT', token)\n }\n roomName = ''\n }\n\n const valid = Boolean(roomName)\n return {\n authStateKey: valid && `as-${roomName}`,\n protocolKey: valid && `pt-${roomName}`,\n callIdKey: valid && `ci-${roomName}`,\n }\n}\n","import { SWCloseEvent as CoreCloseEvent } from '@signalwire/core'\n\nconst SwCloseEvent =\n typeof CloseEvent === 'function' ? CloseEvent : CoreCloseEvent\n\nexport { SwCloseEvent }\n","import jwtDecode from 'jwt-decode'\nimport {\n BaseJWTSession,\n getLogger,\n SessionOptions,\n SwAuthorizationState,\n type SWCloseEvent,\n} from '@signalwire/core'\nimport { getStorage, sessionStorageManager } from './utils/storage'\nimport { SwCloseEvent } from './utils/CloseEvent'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public CloseEventConstructor = SwCloseEvent\n public agent = process.env.SDK_PKG_AGENT!\n\n private tokenTyp: string\n\n constructor(public options: SessionOptions) {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<{ ch?: string; typ: string }>(options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: options.host || decodedJwt?.ch,\n })\n this.tokenTyp = decodedJwt.typ ?? 'VRT'\n }\n\n get allowReattach() {\n // @ts-expect-error\n return this.options?.reattach !== false && this.isVRT()\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowReattach) {\n return ''\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Search protocol for', protocolKey)\n return getStorage()?.getItem(protocolKey) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowReattach) {\n return\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Persist protocol', protocolKey, this.relayProtocol)\n getStorage()?.setItem(protocolKey, this.relayProtocol)\n }\n }\n\n protected override async retrieveSwAuthorizationState() {\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n return getStorage()?.getItem(authStateKey) ?? ''\n }\n return ''\n }\n\n protected override async persistSwAuthorizationState(\n state: SwAuthorizationState\n ) {\n if (!this.allowReattach) {\n return\n }\n\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n this.logger.trace('Persist auth state', authStateKey, state)\n getStorage()?.setItem(authStateKey, state)\n }\n }\n\n protected override _onSocketClose(event: SWCloseEvent) {\n if (this.status === 'unknown') {\n const { protocolKey, authStateKey, callIdKey } = sessionStorageManager(\n this.options.token\n )\n this.logger.debug('Cleaning up storage')\n if (protocolKey) {\n this.logger.debug('Remove protocolKey', protocolKey)\n getStorage()?.removeItem(protocolKey)\n }\n if (authStateKey) {\n this.logger.debug('Remove authStateKey', authStateKey)\n getStorage()?.removeItem(authStateKey)\n }\n if (callIdKey) {\n this.logger.debug('Remove callIdKey', callIdKey)\n getStorage()?.removeItem(callIdKey)\n }\n }\n\n super._onSocketClose(event)\n }\n\n private isVRT() {\n return this.tokenTyp === 'VRT'\n }\n}\n","import {\n ClientEvents,\n configureStore,\n connect,\n getEventEmitter,\n UserOptions,\n} from '@signalwire/core'\nimport { ClientAPI, Client } from './Client'\nimport { JWTSession } from './JWTSession'\n\n/**\n * With Video.createClient() you can establish a WebSocket connection\n * with SignalWire and interact with the client.\n *\n * ## Examples\n * Create a client\n *\n * @example\n * ```js\n * try {\n * const client = Video.createClient({\n * token: '<YourJWT>',\n * })\n *\n * await client.connect()\n * // Your client is ready now..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @internal\n */\nexport const createClient = <RoomSessionType>(userOptions: UserOptions) => {\n const baseUserOptions = {\n ...userOptions,\n emitter: getEventEmitter<ClientEvents>(),\n }\n const store = configureStore({\n userOptions: baseUserOptions,\n SessionConstructor: JWTSession,\n })\n const client = connect<\n ClientEvents,\n ClientAPI<RoomSessionType>,\n Client<RoomSessionType>\n >({\n store,\n Component: ClientAPI,\n })(baseUserOptions)\n\n return client\n}\n","import { UserOptions, getLogger } from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { MakeRoomOptions } from './Client'\nimport { BaseRoomSession } from './BaseRoomSession'\n\n/**\n * @internal\n * @deprecated Use {@link RoomSession} instead.\n **/\nexport interface Room extends BaseRoomSession<Room> {}\n\nexport interface CreateRoomObjectOptions\n extends UserOptions,\n Omit<MakeRoomOptions, 'rootElement'> {\n /** Id of the HTML element in which to display the video stream */\n rootElementId?: string\n /** Whether to automatically join the room session. */\n autoJoin?: boolean\n}\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n aspectRatio: { ideal: 16 / 9 },\n}\n\n/**\n * Using Video.createRoomObject() you can create a `RoomObject` to join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.createRoomObject({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * roomObj.join()\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const createRoomObject = (\n roomOptions: CreateRoomObjectOptions\n): Promise<Room> => {\n return new Promise(async (resolve, reject) => {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElementId,\n applyLocalVideoOverlay = true,\n autoJoin = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\n\n const client = createClient<Room>({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n roomObject.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n","import {\n UserOptions,\n getLogger,\n VideoAuthorization,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport { checkMediaParams, getJoinMediaParams } from './utils/roomSession'\nimport type { MakeRoomOptions } from './Client'\nimport type {\n BaseRoomSessionJoinParams,\n RoomSessionObjectEvents,\n} from './utils/interfaces'\nimport { getStorage, sessionStorageManager } from './utils/storage'\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'getMeta',\n 'setMeta',\n 'updateMeta',\n 'deleteMeta',\n 'getMemberMeta',\n 'setMemberMeta',\n 'updateMemberMeta',\n 'deleteMemberMeta',\n 'promote',\n 'demote',\n 'lock',\n 'unlock',\n]\n\n/**\n * List of events that the SDK must subscribe at the invite time.\n * ie. ScreenShare/AdditionaDevice are based on the member.joined logic.\n */\nconst REQUIRED_EVENTS: (keyof RoomSessionObjectEvents)[] = [\n 'member.joined',\n 'layout.changed',\n]\nconst noop = () => {}\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\nexport interface RoomSession extends BaseRoomSession<RoomSession> {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join({ receiveAudio: true, sendVideo: false })\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio: audioFromConstructor = true,\n video: videoFromConstructor = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n mirrorLocalVideoOverlay = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n ...userOptions\n } = roomOptions\n\n const deprecatedParams = ['audio', 'video']\n deprecatedParams.forEach((param) => {\n if (param in roomOptions) {\n getLogger().warn(\n `The '${param}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`\n )\n }\n })\n\n // @ts-expect-error - true by default\n const allowReattach = roomOptions?.reattach !== false\n\n const { callIdKey } = sessionStorageManager(userOptions.token)\n const reattachManager = {\n joined: ({ call_id }: VideoRoomSubscribedEventParams) => {\n if (allowReattach && callIdKey) {\n getStorage()?.setItem(callIdKey, call_id)\n }\n },\n init: () => {\n if (allowReattach) {\n room.on('room.subscribed', reattachManager.joined)\n }\n room.options.prevCallId = reattachManager.getPrevCallId()\n },\n destroy: () => {\n if (!allowReattach) {\n return\n }\n\n room.off('room.subscribed', reattachManager.joined)\n if (callIdKey) {\n getStorage()?.removeItem(callIdKey)\n }\n },\n getPrevCallId: () => {\n if (!allowReattach || !callIdKey) {\n return\n }\n\n return getStorage()?.getItem(callIdKey) ?? undefined\n },\n }\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n // audio,\n // video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n mirrorLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n prevCallId: reattachManager.getPrevCallId(),\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n room.emit('room.left', { reason: room.leaveReason })\n\n // Remove callId to reattach\n reattachManager.destroy()\n client.disconnect()\n })\n\n // @ts-expect-error\n client.session.once('session.disconnected', () => {\n room.destroy()\n })\n\n const join = (params?: BaseRoomSessionJoinParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n // Fallback to the constructor values for backwards compat.\n const audio = params?.audio ?? audioFromConstructor\n const video = params?.video ?? videoFromConstructor\n\n // @ts-expect-error\n const authState: VideoAuthorization = client._sessionAuthState\n getLogger().debug('getJoinMediaParams authState?', authState)\n if (authState && authState.type === 'video') {\n const mediaOptions = getJoinMediaParams({\n authState,\n // constructor values override the send\n sendAudio: Boolean(audio),\n sendVideo: Boolean(video),\n ...params,\n })\n\n if (!checkMediaParams(mediaOptions)) {\n client.disconnect()\n return reject(\n new Error(\n `Invalid arguments to join the room. The token used has join_as: '${\n authState.join_as\n }'. \\n${JSON.stringify(params, null, 2)}\\n`\n )\n )\n }\n getLogger().debug('Set mediaOptions', mediaOptions)\n\n /**\n * audio and video might be objects with MediaStreamConstraints\n * so if we must send media, we make sure to use the user's\n * preferences.\n * Note: params.sendAudio: `true` will override audio: `false` so\n * we're using `||` instead of `??` for that reason.\n */\n // @ts-expect-error\n room.updateMediaOptions({\n audio: mediaOptions.mustSendAudio ? audio || true : false,\n video: mediaOptions.mustSendVideo ? video || true : false,\n negotiateAudio: mediaOptions.mustRecvAudio,\n negotiateVideo: mediaOptions.mustRecvVideo,\n })\n }\n\n room.once('room.subscribed', () => {\n resolve(room)\n })\n\n // Hijack previous callId if present\n reattachManager.init()\n\n REQUIRED_EVENTS.forEach((event) => room.once(event, noop))\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n","import { getLogger } from '@signalwire/core'\nimport type { VideoAuthorization } from '@signalwire/core'\nimport type { BaseRoomSessionJoinParams } from './interfaces'\n\ntype GetJoinMediaParamsOptions = BaseRoomSessionJoinParams & {\n authState: VideoAuthorization\n}\n/**\n * getJoinMediaParams returns whether the Join method must send/recv\n * audio and video.\n * Based on values on the Auth block (media allowed and join_as type)\n * it matches the user's preferences and return an object that tells\n * if the negotiation has to include sendrecv/sendonly or recvonly\n * for audio and video.\n */\nexport const getJoinMediaParams = (options: GetJoinMediaParamsOptions) => {\n const {\n authState,\n audio = true,\n video = true,\n sendAudio,\n sendVideo,\n receiveAudio,\n receiveVideo,\n } = options\n getLogger().debug('getJoinMediaParams options', { ...options })\n const { audio_allowed, video_allowed, join_as } = authState\n // Fallback to 'member' in case of null/undefined\n const joinAs = join_as ?? 'member'\n const canSend = joinAs === 'member'\n\n const canSendAudio = canSend && audio_allowed === 'both'\n const canSendVideo = canSend && video_allowed === 'both'\n const canReceiveAudio = audio_allowed !== 'none'\n const canReceiveVideo = video_allowed !== 'none'\n\n const reqToSendAudio = Boolean(sendAudio ?? audio)\n const reqToSendVideo = Boolean(sendVideo ?? video)\n const reqToReceiveAudio = Boolean(receiveAudio ?? audio)\n const reqToReceiveVideo = Boolean(receiveVideo ?? video)\n\n if (!canSendAudio && reqToSendAudio) {\n getLogger().info(\n 'Not allowed to send audio on this room. Default values will be used.'\n )\n }\n if (!canSendVideo && reqToSendVideo) {\n getLogger().info(\n 'Not allowed to send video on this room. Default values will be used.'\n )\n }\n if (!canReceiveAudio && reqToReceiveAudio) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n if (!canReceiveVideo && reqToReceiveVideo) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n return {\n mustSendAudio: canSendAudio && reqToSendAudio,\n mustSendVideo: canSendVideo && reqToSendVideo,\n mustRecvAudio: canReceiveAudio && reqToReceiveAudio,\n mustRecvVideo: canReceiveVideo && reqToReceiveVideo,\n }\n}\n\nexport const checkMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n","import { CreateRoomObjectOptions, createRoomObject } from './createRoomObject'\n\n/**\n * Using Video.joinRoom() you can automatically join a room.\n *\n * @example\n * With an HTMLDivElement with id=\"root\" in the DOM.\n * ```js\n * // <div id=\"root\"></div>\n *\n * try {\n * const roomObj = await Video.joinRoom({\n * token: '<YourJWT>',\n * rootElementId: 'root',\n * })\n *\n * // You have joined the room..\n * } catch (error) {\n * console.error('Error', error)\n * }\n * ```\n * @deprecated Use {@link RoomSession} instead.\n */\nexport const joinRoom = (roomOptions: CreateRoomObjectOptions) => {\n return createRoomObject({\n ...roomOptions,\n autoJoin: true,\n })\n}\n","import { createHttpClient } from './createHttpClient'\n\ninterface SWClientOptions {\n httpHost?: string\n accessToken: string\n rootElement?: HTMLElement\n}\n\ninterface RegisterDeviceParams {\n deviceType: 'iOS' | 'Android' | 'Desktop'\n deviceToken: string\n}\n\n// TODO: extends from a Base class to share from core\nexport class SWClient {\n private httpClient: ReturnType<typeof createHttpClient>\n\n constructor(public options: SWClientOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.accessToken}`,\n },\n })\n }\n\n get httpHost() {\n return this.options.httpHost ?? 'fabric.signalwire.com'\n }\n\n async getAddresses() {\n const path = '/addresses' as const\n const { body } = await this.httpClient<any>(path)\n const anotherPage = async (url: string) => {\n const { search } = new URL(url)\n const { body } = await this.httpClient<any>(`${path}${search}`)\n return buildResult(body)\n }\n\n const buildResult = (body: any) => {\n return {\n addresses: body.data,\n nextPage: async () => {\n const { next } = body.links\n return next ? anotherPage(next) : undefined\n },\n prevPage: async () => {\n const { prev } = body.links\n return prev ? anotherPage(prev) : undefined\n },\n }\n }\n\n return buildResult(body)\n }\n\n async registerDevice({ deviceType, deviceToken }: RegisterDeviceParams) {\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<any>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n async unregisterDevice({ id }: { id: string }) {\n const path = `/subscriber/devices/${id}` as const\n return await this.httpClient<any>(path, {\n method: 'DELETE',\n })\n }\n}\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n // VideoMemberJoinedEvent,\n // componentSelectors,\n // componentActions,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype WSClientWorkerOnDone = () => void\ntype WSClientWorkerOnFail = (args: { error: Error }) => void\n\nexport type WSClientWorkerHooks = SDKWorkerHooks<\n WSClientWorkerOnDone,\n WSClientWorkerOnFail\n>\n\nexport const WSClientWorker: SDKWorker<\n ReturnType<typeof createClient<BaseConnection<any>>>,\n WSClientWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().debug('WSClientWorker started')\n const { channels, instance } = options\n const { swEventChannel } = channels\n getLogger().debug('WSClientWorker instance', instance)\n while (true) {\n const action: MapToPubSubShape<any> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n getLogger().debug('WSClientWorker action', action)\n if (action.type === 'webrtc.message') {\n return action.payload.method === 'verto.invite'\n }\n return false\n }\n )\n getLogger().debug('Build new call to answer', action)\n\n // TODO: invoke WSClient function to build and answer the invite\n // instance.buildInboundCall(action)\n }\n\n getLogger().trace('WSClientWorker ended')\n}\n","import { type UserOptions, getLogger, VertoSubscribe } from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { WSClientWorker } from './WSClientWorker'\n\ninterface PushNotification {\n encryption_type: 'aes_256_gcm'\n notification_uuid: string\n with_video: 'true' | 'false'\n incoming_caller_name: string\n incoming_caller_id: string\n tag: string\n invite: string\n title: string\n type: 'call_invite'\n iv: string\n version: string\n decrypted: Record<string, any>\n}\n\ninterface WSClientOptions extends UserOptions {\n rootElement?: HTMLElement\n}\n\nexport class WSClient {\n private wsClient: ReturnType<typeof createClient>\n private logger = getLogger()\n\n constructor(public options: WSClientOptions) {\n this.wsClient = createClient({\n host: this.options.host,\n token: this.options.token,\n debug: {\n logWsTraffic: true,\n },\n logLevel: 'debug',\n })\n }\n\n connect() {\n // @ts-ignore\n this.wsClient.runWorker('WSClientWorker', {\n worker: WSClientWorker,\n })\n return this.wsClient.connect()\n }\n\n disconnect() {\n return this.wsClient.disconnect()\n }\n\n async dial(params: { to: string; nodeId?: string }) {\n return new Promise(async (resolve, reject) => {\n try {\n console.log('WSClient dial with:', params)\n\n await this.connect()\n\n // const {\n // audio: audioFromConstructor = true,\n // video: videoFromConstructor = true,\n // iceServers,\n // rootElement,\n // applyLocalVideoOverlay = true,\n // stopCameraWhileMuted = true,\n // stopMicrophoneWhileMuted = true,\n // speakerId,\n // destinationNumber,\n // watchMediaPackets,\n // watchMediaPacketsTimeout,\n // ...userOptions\n // } = params\n\n const call = this.wsClient.rooms.makeRoomObject({\n // audio,\n // video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n // iceServers,\n rootElement: this.options.rootElement,\n applyLocalVideoOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n // speakerId,\n destinationNumber: params.to,\n watchMediaPackets: false,\n // watchMediaPacketsTimeout:,\n nodeId: params.nodeId,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n })\n\n this.wsClient.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n })\n\n // @ts-expect-error\n call.attachPreConnectWorkers()\n\n // @ts-expect-error\n call.start = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n call.once('verto.display', () => resolve(call))\n call.once('room.subscribed', () => resolve(call))\n\n await call.join()\n } catch (error) {\n getLogger().error('WSClient call start', error)\n\n reject(error)\n }\n })\n }\n\n resolve(call)\n } catch (error) {\n getLogger().error('WSClient dial', error)\n\n reject(error)\n }\n })\n }\n\n handlePushNotification(payload: PushNotification) {\n return new Promise(async (resolve, reject) => {\n const { decrypted, type } = payload\n if (type !== 'call_invite') {\n this.logger.warn('Unknown notification type', payload)\n return\n }\n this.logger.debug('handlePushNotification', payload)\n const { params: jsonrpc, node_id: nodeId } = decrypted\n const {\n params: {\n callID,\n sdp,\n caller_id_name,\n caller_id_number,\n callee_id_name,\n callee_id_number,\n display_direction,\n },\n } = jsonrpc\n this.logger.debug('handlePushNotification data', {\n callID,\n sdp,\n caller_id_name,\n caller_id_number,\n callee_id_name,\n callee_id_number,\n display_direction,\n })\n try {\n // Connect the client first\n await this.connect()\n\n // Catch the error temporarly\n try {\n // Send verto.subscribe\n await this.executeVertoSubscribe(callID, nodeId)\n } catch (error) {\n this.logger.warn('Verto Subscribe', error)\n }\n\n // Build the Call object and return to the user\n\n // const {\n // audio: audioFromConstructor = true,\n // video: videoFromConstructor = true,\n // iceServers,\n // rootElement,\n // applyLocalVideoOverlay = true,\n // stopCameraWhileMuted = true,\n // stopMicrophoneWhileMuted = true,\n // speakerId,\n // destinationNumber,\n // watchMediaPackets,\n // watchMediaPacketsTimeout,\n // ...userOptions\n // } = params\n\n const call = this.wsClient.rooms.makeRoomObject({\n negotiateAudio: true,\n negotiateVideo: true,\n rootElement: this.options.rootElement,\n applyLocalVideoOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n // speakerId,\n watchMediaPackets: false,\n // watchMediaPacketsTimeout:,\n\n remoteSdp: sdp,\n prevCallId: callID,\n nodeId,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n getLogger().debug('RTC Connection Destroyed')\n })\n\n // @ts-expect-error\n call.attachPreConnectWorkers()\n\n // // @ts-expect-error\n // call.attachOnSubscribedWorkers(payload)\n\n getLogger().debug('Resolving Call', call)\n resolve({ resultType: 'inboundCall', resultObject: call })\n } catch (error) {\n reject(error)\n }\n })\n }\n\n private async executeVertoSubscribe(callId: string, nodeId: string) {\n try {\n // @ts-expect-error\n return await this.wsClient.execute({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n subscribe: [],\n message: VertoSubscribe({\n sessid: callId,\n eventChannel: [],\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n updateToken(token: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.wsClient.once('session.auth_error', (error) => {\n reject(error)\n })\n this.wsClient.once('session.connected', () => {\n resolve()\n })\n\n // @ts-expect-error\n this.wsClient.reauthenticate(token)\n })\n }\n}\n","import { type UserOptions } from '@signalwire/core'\nimport { createHttpClient } from './createHttpClient'\n\ninterface RegisterDeviceParams {\n deviceType: 'iOS' | 'Android' | 'Desktop'\n deviceToken: string\n}\n\n// TODO: extends from a Base class to share from core\nexport class HTTPClient {\n private httpClient: ReturnType<typeof createHttpClient>\n\n constructor(public options: UserOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n })\n }\n\n get httpHost() {\n const { host } = this.options\n if (!host) {\n return 'fabric.signalwire.com'\n }\n return `fabric.${host.split('.').splice(1).join('.')}`\n }\n\n public async getAddresses() {\n const path = '/addresses' as const\n const { body } = await this.httpClient<any>(path)\n const anotherPage = async (url: string) => {\n const { search } = new URL(url)\n const { body } = await this.httpClient<any>(`${path}${search}`)\n return buildResult(body)\n }\n\n const buildResult = (body: any) => {\n return {\n addresses: body.data,\n nextPage: async () => {\n const { next } = body.links\n return next ? anotherPage(next) : undefined\n },\n prevPage: async () => {\n const { prev } = body.links\n return prev ? anotherPage(prev) : undefined\n },\n }\n }\n\n return buildResult(body)\n }\n\n public async registerDevice({\n deviceType,\n deviceToken,\n }: RegisterDeviceParams) {\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<any>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n public async unregisterDevice({ id }: { id: string }) {\n const path = `/subscriber/devices/${id}` as const\n return await this.httpClient<any>(path, {\n method: 'DELETE',\n })\n }\n}\n","import { type UserOptions } from '@signalwire/core'\nimport { HTTPClient } from './HTTPClient'\nimport { WSClient } from './WSClient'\n\ninterface SignalWireOptions extends UserOptions {\n rootElement?: HTMLElement\n}\n\ninterface SignalWireContract {\n httpHost: HTTPClient['httpHost']\n getAddresses: HTTPClient['getAddresses']\n registerDevice: HTTPClient['registerDevice']\n unregisterDevice: HTTPClient['unregisterDevice']\n connect: WSClient['connect']\n disconnect: WSClient['disconnect']\n dial: WSClient['dial']\n handlePushNotification: WSClient['handlePushNotification']\n updateToken: WSClient['updateToken']\n}\n\nexport const SignalWire = (\n options: SignalWireOptions\n): Promise<SignalWireContract> => {\n return new Promise(async (resolve, reject) => {\n try {\n const httpClient = new HTTPClient(options)\n const wsClient = new WSClient(options)\n\n resolve({\n httpHost: httpClient.httpHost,\n getAddresses: httpClient.getAddresses.bind(httpClient),\n registerDevice: httpClient.registerDevice.bind(httpClient),\n unregisterDevice: httpClient.unregisterDevice.bind(httpClient),\n connect: wsClient.connect.bind(wsClient),\n disconnect: wsClient.disconnect.bind(wsClient),\n dial: wsClient.dial.bind(wsClient),\n handlePushNotification: wsClient.handlePushNotification.bind(wsClient),\n updateToken: wsClient.updateToken.bind(wsClient),\n // @ts-expect-error\n __httpClient: httpClient,\n __wsClient: wsClient,\n })\n } catch (error) {\n reject(error)\n }\n })\n}\n","import { createHttpClient } from './createHttpClient'\nimport { buildCall } from './buildCall'\n\ninterface ClientOptions {\n host?: string\n accessToken: string\n}\n\n/**\n *\n *\n * // TODO: Remove this file\n * Replaced by SWClient.ts\n *\n */\nexport class Client {\n private httpClient: ReturnType<typeof createHttpClient>\n\n constructor(public options: ClientOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.host}`,\n headers: {\n Authorization: `Bearer ${this.options.accessToken}`,\n },\n })\n }\n\n get host() {\n return this.options.host ?? 'fabric.signalwire.com'\n }\n\n async getAddresses() {\n const path = '/addresses' as const\n const { body } = await this.httpClient<any>(path)\n const anotherPage = async (url: string) => {\n const { search } = new URL(url)\n const { body } = await this.httpClient<any>(`${path}${search}`)\n return buildResult(body)\n }\n\n const buildResult = (body: any) => {\n return {\n addresses: body.data,\n nextPage: async () => {\n const { next } = body.links\n return next ? anotherPage(next) : undefined\n },\n prevPage: async () => {\n const { prev } = body.links\n return prev ? anotherPage(prev) : undefined\n },\n }\n }\n\n return buildResult(body)\n }\n\n async createCall({\n uri,\n ...userParams\n }: {\n uri: string\n rootElement: HTMLElement\n }) {\n const path = '/call' as const\n const { body } = await this.httpClient<any>(path, {\n method: 'POST',\n body: { uri },\n })\n\n console.log('Dial Response', body)\n return buildCall({\n ...body,\n userParams: {\n host: this.host.includes('swire') ? 'relay.swire.io' : undefined,\n ...userParams,\n },\n })\n }\n}\n","import { MakeRoomOptions } from '../Client'\nimport { RoomSession } from '../video'\n\ntype Strategy = 'room'\ntype StrategyParams = RoomStrategyParams\ntype RoomStrategyParams = {\n token: string\n}\ninterface FabricCallResponse {\n strategy: Strategy\n params: StrategyParams\n userParams: MakeRoomOptions\n}\n\nexport const buildCall = ({\n strategy,\n params,\n userParams,\n}: FabricCallResponse) => {\n let obj: RoomSession\n let start: (...args: any[]) => void\n switch (strategy) {\n case 'room':\n obj = new RoomSession({\n token: params.token,\n debug: {\n logWsTraffic: true,\n },\n logLevel: 'debug',\n watchMediaPackets: false,\n ...userParams,\n })\n start = (joinParams: any) => {\n return new Promise((resolve, reject) => {\n obj.once('room.joined', (params) => resolve(params))\n // @ts-ignore\n obj.emitter.once('verto.display', (params) => resolve(params))\n return obj.join(joinParams).catch((error) => reject(error))\n })\n }\n break\n // case 'voice':\n // case 'script':\n // case 'whatever':\n default:\n throw new Error(`Unknown strategy: '${strategy}'`)\n }\n\n const interceptors = {\n start,\n }\n\n return new Proxy(obj, {\n get(target: typeof obj, prop: keyof typeof obj, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n","import type {\n ChatContract,\n ConsumerContract,\n UserOptions,\n Chat as ChatNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends ChatNamespace.BaseChatApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends ChatContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'getAllowedChannels',\n 'setMemberState',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { Chat } from '@signalwire/js'\n *\n * const chatClient = new Chat.Client({\n * token: '<your_chat_token>', // get this from the REST APIs\n * })\n *\n * await chatClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * chatClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await chatClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a chat\n * Client object.\n */\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient<Client>(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n","import { Chat } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport ChatMember = Chat.ChatMember\nimport ChatMessage = Chat.ChatMessage\n\nexport * from './Client'\n\nexport {\n ChatMember,\n ChatMessage,\n PagingCursor\n}\n","import type {\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends PubSubNamespace.BasePubSubApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'getAllowedChannels',\n 'subscribe',\n 'publish',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient<Client>(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n","import { PubSub } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\n\nexport {\n PubSubMessage,\n PagingCursor\n}\n","import { stopStream } from './primitives';\nimport { getUserMedia } from './getUserMedia';\n/**\n * Prompts the user to grant permissions for the devices matching the specified set of constraints.\n * @param constraints an optional [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * To only request audio permissions:\n *\n * ```typescript\n * await SignalWire.WebRTC.requestPermissions({audio: true, video: false})\n * ```\n *\n * @example\n * To request permissions for both audio and video, specifying constraints for the video:\n * ```typescript\n * const constraints = {\n * audio: true,\n * video: {\n * width: { min: 1024, ideal: 1280, max: 1920 },\n * height: { min: 576, ideal: 720, max: 1080 }\n * }\n * }\n * await SignalWire.WebRTC.requestPermissions(constraints)\n * ```\n */\nexport const requestPermissions = async (constraints) => {\n try {\n const stream = await getUserMedia(constraints);\n stopStream(stream);\n }\n catch (error) {\n throw error;\n }\n};\n//# sourceMappingURL=requestPermissions.js.map"],"names":["root","definition","this","noop","undefinedType","isIE","window","navigator","test","userAgent","logMethods","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","log","trace","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","undefined","realMethod","Logger","name","defaultLevel","factory","currentLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","location","indexOf","encodeURIComponent","exec","slice","levels","TRACE","DEBUG","INFO","WARN","ERROR","SILENT","getLevel","setLevel","persist","toUpperCase","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","initialLevel","defaultLogger","_loggersByName","getLogger","TypeError","logger","_log","noConflict","getLoggers","module","exports","getRandomValues","rnds8","Uint8Array","rng","crypto","Error","REGEX","byteToHex","push","toString","unsafeStringify","arr","offset","toLowerCase","DNS","URL","v35","version","hashfunc","generateUUID","value","namespace","buf","_namespace","str","unescape","bytes","charCodeAt","stringToBytes","uuid","validate","v","parseInt","parse","set","err","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","a","b","s","t","num","cnt","md5ff","c","d","md5gg","md5hh","md5ii","msg","input","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","native","randomUUID","v4","options","rnds","random","f","z","ROTL","n","_typeof","Symbol","iterator","constructor","_defineProperty","key","arg","hint","prim","toPrimitive","res","String","toPropertyKey","Object","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread2","target","source","forEach","getOwnPropertyDescriptors","defineProperties","formatProdErrorMessage","code","K","H","Array","isArray","N","Math","ceil","M","j","pow","floor","W","T","$$observable","observable","randomString","substring","split","join","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","subscribe","listener","isSubscribed","index","splice","dispatch","action","proto","getPrototypeOf","isPlainObject","type","listeners","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","next","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","state","hasChanged","nextState","_i","_key","previousStateForKey","nextStateForKey","bindActionCreator","actionCreator","compose","_len","funcs","reduce","applyMiddleware","middlewares","store","_dispatch","middlewareAPI","chain","map","middleware","_objectSpread","actionCreators","boundActionCreators","createSymbol","CANCEL","CHANNEL_END_TYPE","IO","MATCH","MULTICAST","SAGA_ACTION","SELF_CANCELLATION","TASK","TASK_CANCEL","TERMINATE","SAGA_LOCATION","_extends","assign","hasOwnProperty","undef","notUndef","func","string","array","promise","p","then","it","throw","pattern","pat","symbol","every","channel","ch","take","close","stringableFunc","Boolean","multicast","kTrue","konst","identity","assignWithSymbols","flatMap","mapper","concat","remove","item","once","fn","called","kThrow","kReturn","done","makeIterator","thro","meta","return","isSagaIterator","logError","error","sagaStack","createEmptyArray","wrapSagaDispatch","shouldTerminate","shouldCancel","shouldComplete","createAllStyleChildCallbacks","shape","parentCallback","completed","totalCount","completedCount","results","childCallbacks","chCbAtKey","isErr","cancel","getMetaInfo","getLocation","instrumented","zeroBuffer","isEmpty","put","none","expanding","initialSize","limit","overflowAction","pushIndex","popIndex","flush","items","doubledLimit","ringBuffer","TAKE","PUT","ALL","CALL","FORK","SELECT","CANCELLED","makeEffect","payload","combinator","detach","eff","detached","patternOrChannel","multicastPattern","warn","channel$1","getFnCallDescriptor","fnDescriptor","args","context","fork","_len3","_key3","spawn","_len4","_key4","select","selector","_len5","_key5","cancelled","queue","semaphore","task","suspend","release","asap","immediately","shift","patterns","some","matcher","predicate","_predicate","wildcard","matcherCreator","string$1","array$1","symbol$1","END","isEnd","buffer$1","closed","takers","cb","taker","eventChannel","buffer","chan","multicastChannel","currentTakers","nextTakers","ensureCanMutateNextTakers","stdChannel","RUNNING","ABORTED","DONE","resolvePromise","cancelPromise","_effectRunnerMap","current","nextSagaId","cancelSingleTask","taskToCancel","isRunning","effectRunnerMap","env","_ref3","_ref3$channel","maybe","takeCb","resolve","result","effects","_ref11","digestEffect","effectId","_ref12","response","childCbs","_ref4","_ref5","proc","_ref6","cpsCb","_ref7","_ref8","parent","taskIterator","resolved","createTaskIterator","getIteratorMetaInfo","child","addTask","isAborted","abort","taskOrTasks","_ref9","joinSingleTask","taskToJoin","joiner","joiners","_ref10","_ref13","_ref14","match","CANCELLED$1","data","_ref15","isCancelled","prop","_ref16","props","_ref17","formatLocation","fileName","lineNumber","sagaLocationAsString","sagaMeta","cancelledTasksAsString","cancelledTasks","crashedEffect","addSagaFrame","frame","clear","setCrashedEffect","effect","firstSaga","otherSagas","crashedEffectLocation","iterator$1","parentContext","parentEffectId","isRoot","cont","finalRunEffect","finalizeRunEffect","currCb","effectRunner","executingContext","mainTask","status","_task","taskResult","taskError","deferredEnd","cancelledDueToErrorTasks","create","onAbort","tasks","getTasks","cancelAll","forkQueue","end","onError","reject","id","setContext","toPromise","def","Promise","newTask","label","effectSettled","sagaMonitor","effectRejected","effectResolved","effectTriggered","effectCancelled","runSaga","saga","_ref$channel","_ref$context","effectMiddlewares","_ref$onError","rootSagaStarted","actionDispatched","runEffect","sagaMiddlewareFactory","_temp","boundRunSaga","excluded","sourceKeys","_objectWithoutPropertiesLoose","sagaMiddleware","run","has","prefix","Events","EE","addListener","emitter","event","evt","_events","_eventsCount","clearEvent","EventEmitter","__proto__","eventNames","events","names","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","on","removeAllListeners","off","prefixed","__defProp","__defProps","__getOwnPropDesc","__getOwnPropDescs","__getOwnPropNames","getOwnPropertyNames","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","__spreadValues","__spreadProps","__objRest","exclude","__export","all2","get","__copyProps","to","from","except","desc","__reExport","mod","secondTarget","__publicField","LOCAL_EVENT_PREFIX","SYNTHETIC_EVENT_PREFIX","PRODUCT_PREFIX_PUBSUB","originalFactory","logLevel","rawMethod","unshift","Date","toISOString","userLogger","defaultLoggerLevel","debugOptions","getLoggerInstance","wsTraffic","logWsTraffic","shouldStringify","JSON","stringify","info","Proxy","receiver","Reflect","UPPERCASE_REGEX","WEBRTC_EVENT_TYPES","isWebrtcEventType","eventType","includes","whitelistCodeRegex","parseResponse","nodeId","node_id","nestedResult","jsonrpc","DEFAULT_OPTIONS","propsToUpdateValue","toExternalJSON","__sw_symbol","__sw_proxy","entries","fromSnakeToCamelCase","endsWith","isTimestampProperty","timestamp","date","isNaN","getTime","toDateObject","part","fc","trim","remainingChars","substr","toInternalAction","event_type","params","vertoRPC","extendComponent","klass","methods","stripNamespacePrefix","regex","RegExp","replace","PROTOCOL_PATTERN","timeoutPromise","time","exception","timer","race","_resolve","setTimeout","finally","clearTimeout","WITH_CUSTOM_EVENT_NAMES","CLIENT_SIDE_EVENT_NAMES","validateEventsToSubscribe","valid","internalEvent","eventParts","cleanupEventNamespace","isSyntheticEvent","isLocalEvent","isSessionEvent","find","withCustomName","startsWith","Set","isSATAuth","makeRPCRequest","_a","makeRPCResponse","DEFAULT_CONNECT_VERSION","major","minor","revision","RPCConnect","tmpMap","destinationNumber","remoteCallerName","remoteCallerNumber","callerName","callerNumber","filterVertoParams","dialogParams","buildVertoRPCMessage","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoAnswer","VertoSubscribe","VertoPong","VertoResult","actions_exports","authErrorAction","authExpiringAction","authSuccessAction","createAction","destroyAction","getCustomSagaActionType","initAction","makeCustomSagaAction","reauthAction","sessionDisconnectedAction","sessionForceCloseAction","sessionReconnectingAction","socketMessageAction","toolkit_exports","prepareAction","prepared","configureStore","redux_star","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","IS_PRODUCTION","curriedGetDefaultMiddleware","devTools","enhancers","rootReducer2","baseProto","finalMiddleware","middlewareEnhancer","finalCompose","compose2","storeEnhancers","formatCustomSagaAction","executeReducerBuilderCallback","builderCallback","actionsMap","actionMatchers","defaultCaseReducer","builder","addCase","typeOrActionCreator","addMatcher","addDefaultCase","createDestroyableSlice","initialState","extraReducers","reducerNames","sliceCaseReducersByName","sliceCaseReducersByType","buildReducer","finalCaseReducers","mapOrBuilderCallback","getInitialState","finalActionMatchers","finalDefaultCaseReducer","caseReducers","reducer2","cr","previousState","caseReducer","createReducer","_reducer","reducerName","maybeReducerWithPrepare","prepareCallback","prepare","actions","createSlice","authorizingAction","sessionSlice","protocol","iceServers","authStatus","authState","authError","authCount","connected","_b","authorization","ice_servers","updateAuthState","sessionActions","sessionReducer","SW_SYMBOL","BaseSession","Map","for","host","sessionChannel","_host","checkWebSocketHost","_sessionChannel","_onSocketOpen","_onSocketError","_onSocketClose","_onSocketMessage","execute","connect","wsOpenHandler","_a2","_socket","removeEventListener","wsCloseHandler","wsErrorHandler","rpcConnectResult","_rpcConnectResult","relayProtocol","signature","jti","connecting","readyState","closing","_status","idle","ready","token","WebSocketConstructor","CloseEventConstructor","_clearTimers","_removeSocketListeners","destroySocket","_clearCheckPingTimer","_createSocket","_addSocketListeners","addEventListener","async","_checkCurrentStatus","message","_requests","rpcRequest","_send","_executeTimeoutMs","_executeTimeoutError","catch","_executeConnectionClosed","_swConnectError","_closeConnection","_addToExecuteQueue","agent","connectVersion","authentication","project","_relayProtocolIsValid","topics","contexts","forceClose","authenticate","_flushExecuteQueue","reason","_clearPendingRequests","_reconnectTimer","size","decode","isJSONRPCRequest","isJSONRPCResponse","request","delete","parseRPCResponse","_pingHandler","_payload","encode","safeParseJson","persistSwAuthorizationState","_","send","_executeQueue","add","_checkPingTimer","_checkPingDelay","now","BaseJWTSession","super","_checkTokenExpiration","reauthenticate","expiresAt","fabric_subscriber","expires_at","parsed","expiresIn","expired","_expiredDiffSeconds","jwt_token","prevProtocol","retrieveRelayProtocol","authorizationState","retrieveSwAuthorizationState","authorization_state","persistRelayProtocol","project_id","_checkTokenExpirationTimer","refreshTokenFn","_onRefreshToken","onRefreshToken","_refreshTokenNotificationDiff","_checkTokenExpirationDelay","redux_exports","configureStore2","createCatchableSaga","createRestartableSaga","componentSlice","byId","upsert","cleanup","componentId","ids","componentActions","componentReducer","rootReducer","components","session","sagaHelpers_exports","defaultCatchHandler","errorHandler","isWebrtcEvent","isVideoEvent","isSwAuthorizationState","sessionChannelWatcher","swEventChannel","swEventWorker","broadcastParams","onSwAuthorizationState","sessionChannelWorkerCatchable","AuthError","setPrototypeOf","HttpError","initSessionSaga","initSession","sessionEmitter","userOptions","channels","customTasks","workers","call2","all","fork2","sessionStatusTask","sessionStatusWatcher","take2","disconnect","reauthenticateWorker","put2","sessionAuthErrorSaga","sessionSelectors_exports","getAuthError","getAuthState","getAuthStatus","getIceServers","getSession","sessionListeners","Component","customSagas","sessionKeys","instance","cacheMap","storeUnsubscribe","reduxKey","cacheKey","updatedValue","fnName","taskList","destroyer","getEventEmitter","SessionConstructor","runSagaMiddleware","createSagaMiddleware","getDefaultMiddleware","getSession2","useSession","instanceMap","useInstanceMap","setDebugOptions","rootSaga_default","executeActionWorker","onDone","onFail","requestId","RPCExecute","call3","SW_SYMBOL2","BaseComponent","eventEmitter","__uuid","_destroyer","eventName","sessionEventNames","getSubscriptions","destroy","detachWorkers","transformParams","transformResolve","transformReject","runWorker","worker","triggerCustomSaga","dispatchId","_customSagaTriggers","settleCustomSagaTrigger","kind","selectorFn","getStateProperty","param","_sessionAuthStatus","_sessionAuthState","_waitUntilSessionAuthorized","authStatus2","_workers","_setWorker","_attachWorker","_runningWorkers","BaseClient","BaseConsumer","resetLatestExecuteParams","_latestExecuteParams","shouldExecuteSubscribe","execParams","subscriptions","subscribeMethod","subscribeParams","event_channel","INTERNAL_MEMBER_UPDATABLE_PROPS","audio_muted","video_muted","deaf","visible","input_volume","output_volume","input_sensitivity","MEMBER_UPDATABLE_PROPS","componentSelectors_exports","getComponent","getComponentsById","getComponentsToCleanup","toCleanup","responses","errors","rooms_exports","RoomSessionPlaybackAPI","RoomSessionRecordingAPI","RoomSessionStreamAPI","audioMuteMember","audioUnmuteMember","createRoomSessionPlaybackObject","createRoomSessionRecordingObject","createRoomSessionStreamObject","deafMember","deleteMemberMeta","deleteMeta","demote","getLayouts","getMemberMeta","getMembers","getMeta","getPlaybacks","getRecordings","getStreams","hideVideoMuted","lock","play","promote","removeAllMembers","removeMember","setDeaf","setHideVideoMuted","setInputSensitivityMember","setInputVolumeMember","setLayout","setMemberMeta","setMemberPosition","setMeta","setOutputVolumeMember","setPositions","setPrioritizeHandraise","setRaisedHand","showVideoMuted","startRecording","startStream","undeafMember","unlock","updateMemberMeta","updateMeta","videoMuteMember","videoUnmuteMember","baseCodeTransform","createRoomMethod","room_session_id","roomSessionId","createRoomMemberMethod","memberId","rest","member_id","layouts","members","recordings","recordingInstances","recording","recordingInstance","setPayload","room_id","roomId","playbacks","playbackInstances","playback","playbackInstance","seekPosition","currentTimecode","seek_position","createRoomMetaMethod","streams","streamInstances","stream","streamInstance","enable","mediaAllowed","joinAudioMuted","joinVideoMuted","media_allowed","join_audio_muted","join_video_muted","raised","duration","startedAt","started_at","endedAt","ended_at","recording_id","url","volume","position","seekable","playback_id","timecode","abs","stream_id","chat_exports","BaseChatAPI","BaseChatConsumer","ChatMember","ChatMessage","createBaseChatObject","getMemberState","getMembers2","getMessages","publish","setMemberState","baseCodeTransform2","createChatMethod","createChatMemberMethod","messages","cursor","member","transformParamChannels","list","toInternalChatChannels","pubSub_exports","BasePubSubConsumer","PubSubMessage","createBasePubSubObject","pubSubWorker","client","channel3","restMessage","externalJSON","pubSubMessage","isPubSubEvent","sagaEffects.take","sagaEffects.fork","toInternalPubSubChannels","initWorker","_getChannelsParam","_channels","_setSubscribeParams","_getSubscribeParams","_getUnsubscribeParams","channelsParam","_checkMissingSubscriptions","eventNamesWithPrefix","updateToken","content","publishedAt","chatWorker","chatMessage","isChatEvent2","memberPosition_exports","MEMBER_POSITION_COMPOUND_EVENTS","memberPositionWorker","memberUpdatedWorker","defaultDispatcher","memberPositionLayoutChangedWorker","memberList","dispatcher","processedMembers","layout","layers","layer","memberEventParams","current_position","mutateMemberCurrentPosition","currentPosition","updatedMemberEventParams","updated","memberUpdatedPayload","initializeMemberList","addToMemberList","action2","fork3","room_session","configureFullStack","configureJestStore","createMockedLogger","createSessionChannel","createSwEventChannel","rpcConnectResultVRT","wait","PROJECT_ID","TOKEN","fatal","jest","mockImplementation","ms","scopes","scope_id","resource","join_as","user_name","room","display_name","audio_allowed","video_allowed","urls","credential","credentialType","username","multicastChannel2","channel2","selectors","http","init","fetch","ok","errorResponse","json","errorMessage","parsedBody","createHttpClient","baseUrl","timeout","globalOptions","fetcher","path","headers","body","reqInit","getRequestInit","timerId","controller","AbortController","signal","getUrl","searchParams","append","supportsMediaDevices","mediaDevices","getMediaDevicesApi","getSupportedConstraints","streamIsValid","MediaStream","supportsMediaOutput","HTMLMediaElement","setMediaElementSinkId","el","deviceId","setSinkId","stopStream","getTracks","stopTrack","track","stop","dispatchEvent","Event","PERMISSIONS_MAPPING","camera","microphone","speaker","_getMediaDeviceKindByName","enumerateDevices","enumerateDevicesByKind","filterByKind","devices","_error","checkPermissions","permissions","query","_legacyCheckPermissions","checkCameraPermissions","checkMicrophonePermissions","checkSpeakerPermissions","getUserMedia","constraints","audio","video","useTimeout","promises","_useTimeoutForGUM","constraint","getDisplayMedia","getDevicesWithPermissions","fullList","getDevices","_filterDevices","found","groupId","targets","checkDefault","excludeDefault","getSpeakerDevices","assureDeviceId","deviceLabel","_deviceInfoToMap","deviceInfo","TARGET_PERMISSIONS_MAP","DEFAULT_TARGETS","ALLOWED_TARGETS_MSG","CHECK_SUPPORT_MAP","createDeviceWatcher","permission","supported","unsupported","checkTargetPermissions","needPermissionsTarget","filteredTargets","unsupportedTargets","needPermissions","validateTargets","currentDevices","kinds","knownDevices","oldDevices","newDevices","changes","removals","updates","additions","newDevice","oldDevice","removed","added","_getDeviceListDiff","hasAddedDevices","hasRemovedDevices","hasUpdatedDevices","createSpeakerDeviceWatcher","isMediaStream","getSpeakerById","_getUserMedia","getMediaConstraints","micId","micLabel","newMicId","exact","camId","camLabel","newCamId","SDPUtils","localCName","generateIdentifier","splitLines","blob","line","splitSections","getDescription","sections","getMediaSections","matchPrefix","parseCandidate","parts","candidate","foundation","component","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","sdp","parseIceOptions","parseRtpMap","payloadType","clockRate","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","parameters","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","description","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","sessionVersion","netType","addressType","isValidSDP","_isAudioLine","_isVideoLine","sdpStereoHack","endOfLine","sdpLines","opusIndex","findIndex","opusPayload","_getCodecPayloadType","fmtpLineIndex","RTCPeer","_negotiating","_processingRemoteSDP","_restartingIce","_onIce","_onEndedTrackHandler","prevCallId","localStream","_localStream","rtcConfigPolyfill","config","watchMediaPacketsTimeout","remoteStream","_remoteStream","isOffer","isAnswer","isSimulcast","simulcast","isSfu","sfu","localVideoTrack","videoSender","_getSenderByKind","localAudioTrack","audioSender","remoteVideoTrack","videoReceiver","_getReceiverByKind","remoteAudioTrack","audioReceiver","hasAudioSender","hasVideoSender","hasAudioReceiver","hasVideoReceiver","rtcPeerConfig","bundlePolicy","sdpSemantics","localSdp","localDescription","remoteSdp","remoteDescription","hasIceServers","getConfiguration","stopTrackSender","sender","removeTrack","newTrack","replaceTrack","addTrack","getDeviceId","getSettings","getTrackSettings","getDeviceLabel","restartIceWithRelayOnly","iceTransportPolicy","newConfig","setConfiguration","restartIce","triggerResume","_resumeTimer","clearTimers","leaveReason","setState","_closeWSConnection","resetNeedResume","clearResumeTimer","watchMediaPackets","startWatchMediaPackets","stopWatchMediaPackets","_mediaWatcher","rtcPeer","previousAudioValue","previousVideoValue","clearTimer","meter","audioPacketsReceived","videoPacketsReceived","stats","getStats","audioTrackId","videoTrackId","report","trackIdentifier","packetsReceived","lastPacketReceivedTimestamp","connectionState","start","watchRTCPeerMediaPackets","newConstraints","getConstraints","screenShare","applyConstraints","getSenders","getReceivers","force","additionalDevice","getTransceivers","tr","offerOptions","voiceActivityDetection","_supportsAddTransceiver","offerToReceiveAudio","negotiateAudio","offerToReceiveVideo","negotiateVideo","offer","createOffer","_setLocalDescription","_setRemoteDescription","answer","createAnswer","_sdpReady","iceGatheringState","_iceTimeout","_onIceTimeout","maxIceGatheringTimeout","onRemoteBye","_rejectStartMethod","_resolveStartMethod","hangup","_setupRTCPeerConnection","RTCPeerConnection","_attachListeners","_retrieveLocalStream","hasLocalTracks","audioTracks","getAudioTracks","videoTracks","getVideoTracks","addTransceiver","audioTransceiverParams","videoTransceiverParams","sendEncodings","rid","active","scaleResolutionDownBy","Number","msStreamsNumber","addStream","_checkMediaToNegotiate","startNegotiation","detachAndStop","transceiver","_c","_sdpIsValid","onLocalSDPReady","section","sdpHasValidCandidates","_forceNegotiation","iceGatheringTimeout","useStereo","googleMaxBitrate","googleMinBitrate","googleStartBitrate","max","min","sdpBitrateHack","setLocalDescription","localOffer","offerLines","answerLines","answerAudioIndex","answerVideoIndex","audioLines","videoLines","sdpMediaOrderHack","sessionDescr","setRemoteDescription","signalingState","emitMediaConnected","_connectionStateTimer","maxConnectionStateTimeout","clearConnectionStateTimer","iceConnectionState","_attachAudioTrackListener","_attachVideoTrackListener","clearWatchMediaPacketsTimer","_watchMediaPacketsTimer","mediaTrack","_detachAudioTrackListener","_detachVideoTrackListener","isWebrtcAction","vertoEventWorker","rtcPeerId","catchableWorker","sagaHelpers","jsonrpcId","callID","peer","getRTCPeerById","activeRTCPeer","onRemoteSdp","sagaEffects.put","sagaEffects.call","_getRPCMethod","onVertoBye","byeCause","cause","byeCauseCode","causeCode","redirectDestination","pongParams","__rest","mediaParams","applyMediaConstraints","setActiveRTCPeer","roomSubscribedWorker","call_id","clonedPayload","previewUrl","preview_url","transformPayload","Rooms","promoteDemoteWorker","sagaEffects.select","updateMediaOptions","_triggerNewRTCPeer","sessionAuthWorker","resume","AUDIO_CONSTRAINTS","echoCancellation","noiseSuppression","autoGainControl","AUDIO_CONSTRAINTS_SCREENSHARE","googAutoGainControl","VIDEO_CONSTRAINTS","width","ideal","height","aspectRatio","DEFAULT_CALL_OPTIONS","attach","userVariables","requestTimeout","autoApplyMediaParams","BaseConnection","gotEarly","doReinvite","prevState","rtcPeerMap","resuming","executeInvite","activeRTCPeerId","_checkDefaultMediaConstraints","_initPeer","trying","callId","componentSelectors","pingSupported","cameraId","cameraLabel","microphoneId","microphoneLabel","withAudio","withVideo","oldPeerId","appendRTCPeer","setLocalStream","prevAudioTracks","newAudioTracks","prevVideoTracks","newVideoTracks","updateStream","vertoExecute","_buildPeer","updateCamera","updateConstraints","updateMicrophone","manageSendersWithConstraints","stopOutboundAudio","stopOutboundVideo","attempt","newStream","oldConstraints","prevVideoTrack","prevAudioTrack","tracks","currentDirection","previous","runRTCPeerWorkers","workers.vertoEventWorker","workers.roomSubscribedWorker","workers.promoteDemoteWorker","invite","mungedSDP","_mungeSDP","_watchSessionAuth","executeUpdateMedia","executeAnswer","sessionAuthTask","workers.sessionAuthWorker","ssOpts","positions","dtmf","doReinviteWithRelayOnly","restoreOutboundAudio","restoreTrackSender","restoreOutboundVideo","_finalize","sdpRemoveLocalCandidates","buildVideo","createElement","muted","autoplay","playsInline","waitForVideoReady","element","_getLocationStyles","top","left","setVideoMediaTrack","srcObject","createRootElementResizeObserver","rootElement","paddingWrapper","maxPaddingBottom","videoHeight","videoWidth","update","wait2","callFirst","debouncedFn","debounceWrapper","callNow","call4","debounce","pb","style","paddingBottom","nativeVideoRatio","computePaddingWrapperWidth","ResizeObserver","entry","contentBoxSize","inlineSize","blockSize","contentRect","observe","setAudioMediaTrack","playsinline","audioSetSpeakerAction","makeVideoElementSaga","applyLocalVideoOverlay","layerMap","videoEl","localOverlay","domElement","hide","opacity","show","setLocalOverlayMediaStream","localVideo","querySelector","setLocalOverlayMirror","mirror","firstChild","mirrored","transform","webkitTransform","layoutChangedHandler","myMemberId","myLayer","overflow","_buildLayer","disablePictureInPicture","pointerEvents","objectFit","appendChild","mcuLayers","exists","hasVideo","enabled","makeLayoutChangedHandler","hasVideoTrack","lastLayoutChanged","_processLayoutChanged","videoTask","m","videoElementSetupWorker","removeChild","cleanupElement","audioElementActionsWatcher","setSpeakerActionType","audioElementSetupWorker","speakerId","maxHeight","mcuWrapper","right","bottom","classList","layersWrapper","display","relativeWrapper","margin","alignItems","justifyContent","HAVE_NOTHING","rootElementResizeObserver","SCREENSHARE_AUDIO_CONSTRAINTS","RoomSessionScreenShareAPI","leave","audioMute","audioUnmute","videoMute","videoUnmute","setMicrophoneVolume","setInputVolume","setInputSensitivity","RoomSessionDeviceAPI","EXTERNAL_MEMBER_LIST_UPDATED_EVENT","SYNTHETIC_MEMBER_LIST_UPDATED_EVENT","toSyntheticEvent","letter","fromCamelToSnakeCase","getNamespacedEvent","toInternalEventName","MEMBER_LIST_EVENTS","isMemberListEvent","getUpdatedMembers","actionMembers","getMembersFromAction","values","membersListUpdatedWatcher","pubSubAction","memberListUpdatedWorker","shouldHandleMemberList","getMemberListEventsToSubscribe","eventBridgeHandler","initMemberListSubscriptions","childMemberJoinedWorker","parentId","parent_id","row","videoStreamWorker","roomSession","videoRecordWorker","videoPlaybackWorker","videoWorker","sagaEffects.spawn","MemberPosition","talking","RoomSessionAPI","_screenShareList","_deviceList","_mirrored","_audioEl","mirrorLocalVideoOverlay","workers.videoWorker","screenShareList","deviceList","interactivityMode","attachPreConnectWorkers","workers.memberListUpdatedWorker","opts","startScreenShare","autoJoin","displayStream","recoverCall","memberCallId","workers.childMemberJoinedWorker","addCamera","addDevice","addMicrophone","roomDevice","updateSpeaker","prevId","sinkId","newId","prevSpeaker","newSpeaker","isSame","_attachSpeakerTrackListener","deviceWatcher","disconnectedSpeaker","device","payloadDeviceId","defaultSpeakers","getAudioEl","Audio","getLayoutList","getMemberList","setMirrored","undeaf","setOutputVolume","setSpeakerVolume","videoManagerRoomsWorker","modPayload","rooms","videoManagerRoomWorker","videoManagerWorker","VideoManagerAPI","ClientAPI","_videoManager","_chat","_pubSub","makeRoomObject","makeRoomOptions","stopCameraWhileMuted","stopMicrophoneWhileMuted","audioEl","audioTask","makeAudioElementSaga","chat","ChatNamespace","pubSub","PubSubNamespace","videoManager","manager","property","createVideoManagerObject","r","atob","o","fromCharCode","decodeURIComponent","header","getStorage","sessionStorage","sessionStorageManager","roomName","jwtPayload","jwtDecode","authStateKey","protocolKey","callIdKey","SwCloseEvent","CloseEvent","wasClean","JWTSession","WebSocket","tokenTyp","decodedJwt","typ","allowReattach","reattach","isVRT","getItem","setItem","createClient","baseUserOptions","createRoomObject","roomOptions","rootElementId","getElementById","roomObject","UNSAFE_PROP_ACCESS","REQUIRED_EVENTS","RoomSession","audioFromConstructor","videoFromConstructor","reattachManager","joined","getPrevCallId","interceptors","mediaOptions","sendAudio","sendVideo","receiveAudio","receiveVideo","canSend","canSendAudio","canSendVideo","canReceiveAudio","canReceiveVideo","reqToSendAudio","reqToSendVideo","reqToReceiveAudio","reqToReceiveVideo","mustSendAudio","mustSendVideo","mustRecvAudio","mustRecvVideo","getJoinMediaParams","SWClient","httpClient","httpHost","Authorization","accessToken","anotherPage","search","buildResult","addresses","nextPage","links","prevPage","prev","deviceType","deviceToken","device_type","device_token","WSClientWorker","WSClient","wsClient","handlePushNotification","decrypted","caller_id_name","caller_id_number","callee_id_name","callee_id_number","display_direction","executeVertoSubscribe","resultType","resultObject","sessid","HTTPClient","SignalWire","getAddresses","registerDevice","unregisterDevice","dial","__httpClient","__wsClient","userParams","strategy","joinParams","buildCall","INTERCEPTED_METHODS","Chat","chatOptions","_session","createInterceptor","PubSub","pubSubOptions","getMicrophoneAnalyzerMediaStream","audioContext","AudioContext","webkitAudioContext","analyser","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","createAnalyzer","rafId","createMediaStreamSource","startMetering","dataArray","frequencyBinCount","getByteFrequencyData","latestVol","final","requestAnimationFrame","cancelAnimationFrame"],"mappings":"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"}