@signalwire/js 3.13.0 → 3.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/src/BaseConsumer.d.ts.map +1 -1
- package/dist/core/src/pubSub/BasePubSub.d.ts +1 -0
- package/dist/core/src/pubSub/BasePubSub.d.ts.map +1 -1
- package/dist/core/src/testUtils.d.ts +36 -0
- package/dist/core/src/testUtils.d.ts.map +1 -1
- package/dist/core/src/utils/index.d.ts.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/dist/webrtc/src/index.d.ts +2 -2
- package/dist/webrtc/src/index.d.ts.map +1 -1
- package/dist/webrtc/src/utils/deviceHelpers.d.ts +1 -72
- package/dist/webrtc/src/utils/deviceHelpers.d.ts.map +1 -1
- package/dist/webrtc/src/utils/enumerateDevices.d.ts +25 -0
- package/dist/webrtc/src/utils/enumerateDevices.d.ts.map +1 -0
- package/dist/webrtc/src/utils/getDisplayMedia.d.ts +17 -0
- package/dist/webrtc/src/utils/getDisplayMedia.d.ts.map +1 -0
- package/dist/webrtc/src/utils/getUserMedia.d.ts +35 -0
- package/dist/webrtc/src/utils/getUserMedia.d.ts.map +1 -0
- package/dist/webrtc/src/utils/helpers.d.ts.map +1 -1
- package/dist/webrtc/src/utils/index.d.ts +7 -0
- package/dist/webrtc/src/utils/index.d.ts.map +1 -0
- package/dist/webrtc/src/utils/permissions.d.ts +48 -0
- package/dist/webrtc/src/utils/permissions.d.ts.map +1 -0
- package/dist/webrtc/src/utils/primitives.d.ts +54 -0
- package/dist/webrtc/src/utils/primitives.d.ts.map +1 -0
- package/dist/webrtc/src/utils/primitives.native.d.ts +35 -0
- package/dist/webrtc/src/utils/primitives.native.d.ts.map +1 -0
- package/dist/webrtc/src/utils/requestPermissions.d.ts +27 -0
- package/dist/webrtc/src/utils/requestPermissions.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/webrtc/src/utils/webrtcHelpers.d.ts +0 -136
- package/dist/webrtc/src/utils/webrtcHelpers.d.ts.map +0 -1
- package/dist/webrtc/src/utils/webrtcHelpers.native.d.ts +0 -14
- package/dist/webrtc/src/utils/webrtcHelpers.native.d.ts.map +0 -1
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../../../node_modules/loglevel/lib/loglevel.js","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/regex.js","../../../node_modules/uuid/dist/esm-browser/validate.js","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/v35.js","../../../node_modules/uuid/dist/esm-browser/parse.js","../../../node_modules/uuid/dist/esm-browser/md5.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../../../node_modules/uuid/dist/esm-browser/sha1.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../node_modules/redux/es/redux.js","../../../node_modules/uuid/dist/esm-browser/v3.js","../../../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/delay-p/dist/redux-saga-delay-p.esm.js","../../../node_modules/@redux-saga/core/dist/io-6de156f3.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","../../webrtc/dist/mjs/webrtc/src/utils/webrtcHelpers.js","../../webrtc/dist/mjs/webrtc/src/utils/deviceHelpers.js","../../webrtc/dist/mjs/webrtc/src/utils/helpers.js","../../webrtc/dist/mjs/webrtc/src/utils/sdpHelpers.js","../../webrtc/dist/mjs/webrtc/src/RTCPeer.js","../../webrtc/dist/mjs/webrtc/src/BaseConnection.js","../src/utils/videoElement.ts","../src/features/actions.ts","../src/features/mediaElements/mediaElementsSagas.ts","../src/utils/audioElement.ts","../src/utils/constants.ts","../src/RoomSessionScreenShare.ts","../src/RoomSessionDevice.ts","../src/video/memberListUpdatedWorker.ts","../src/video/memberPositionWorker.ts","../src/BaseRoomSession.ts","../src/cantina/workers.ts","../src/cantina/VideoManager.ts","../src/Client.ts","../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../src/JWTSession.ts","../src/createClient.ts","../src/chat/Client.ts","../src/chat/index.ts","../src/pubSub/Client.ts","../src/pubSub/index.ts","../src/createRoomObject.ts","../src/RoomSession.ts","../src/utils/roomSession.ts","../src/joinRoom.ts"],"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()).\nvar getRandomValues;\nvar 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. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\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 REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","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\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 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 var uuid = (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(); // 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 stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\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.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 var 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 (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(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 var v;\n var 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;","/*\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 var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var 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 var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var 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 var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var 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 var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var 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 var lsw = (x & 0xffff) + (y & 0xffff);\n var 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 rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var 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 (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(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 var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var 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 var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var 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 (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _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 var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 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 _defineProperty(obj, key, value) {\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\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\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\n/*\n * This is a dummy function to check if the function name has been altered by minification.\n * If the function has been minified and NODE_ENV !== 'production', warn the user.\n */\n\nfunction isCrushed() {}\n\nif (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {\n warning('You are currently using minified code outside of NODE_ENV === \"production\". ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or setting mode to production in webpack (https://webpack.js.org/concepts/mode/) ' + 'to ensure you have the correct code for your production build.');\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar 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 || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\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 { CANCEL } from '@redux-saga/symbols';\n\nfunction delayP(ms, val) {\n if (val === void 0) {\n val = true;\n }\n\n var timeoutId;\n var promise = new Promise(function (resolve) {\n timeoutId = setTimeout(resolve, ms, val);\n });\n\n promise[CANCEL] = function () {\n clearTimeout(timeoutId);\n };\n\n return promise;\n}\n\nexport default delayP;\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 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 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, actionChannel as O, PUT as P, sliding as Q, RACE as R, SELECT as S, TAKE as T, delay 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-6de156f3.js';\nexport { H as buffers, I as detach } from './io-6de156f3.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\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\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().replace(\"T\", \" \").replace(\"Z\", \"\");\nvar defaultLogger = log.getLogger(\"signalwire\");\nvar originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return function() {\n const messages = [datetime(), \"-\"];\n for (let i = 0; i < arguments.length; i++) {\n messages.push(arguments[i]);\n }\n rawMethod.apply(void 0, messages);\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/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 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 && code !== \"200\") {\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/common.ts\nvar UPPERCASE_REGEX = /[A-Z]/g;\nvar fromCamelToSnakeCase = (event) => {\n return event.replace(UPPERCASE_REGEX, (letter) => {\n return `_${letter.toLowerCase()}`;\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 } = event;\n if (event_type === \"queuing.relay.tasks\") {\n return {\n type: event_type,\n payload: event\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) => toSnakeCaseKeys(item, transform, result[index]));\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/proxyUtils.ts\nvar proxyToString = ({\n property,\n payload\n}) => {\n return typeof property === \"function\" ? () => JSON.stringify(payload) : property;\n};\nvar getAllMethods = (objTarget) => {\n let methods = {};\n let obj = objTarget;\n let shouldContinue = true;\n while (shouldContinue) {\n Object.getOwnPropertyNames(obj).forEach((k) => {\n if (typeof objTarget[k] === \"function\" && typeof k === \"string\" && !(k in methods)) {\n methods[k] = objTarget[k];\n }\n });\n if (!obj || !obj.__sw_symbol) {\n shouldContinue = false;\n } else {\n obj = Object.getPrototypeOf(obj);\n }\n }\n return methods;\n};\nvar serializeableProxy = ({\n instance,\n proxiedObj,\n payload,\n transformedPayload,\n transform\n}) => {\n const data = __spreadValues(__spreadProps(__spreadValues({}, transformedPayload), {\n _eventsNamespace: transform.getInstanceEventNamespace ? transform.getInstanceEventNamespace(payload) : void 0,\n eventChannel: transform.getInstanceEventChannel ? transform.getInstanceEventChannel(payload) : void 0\n }), getAllMethods(instance));\n return Object.defineProperties(proxiedObj, Object.entries(data).reduce((reducer, [key, value]) => {\n if (value === void 0) {\n return reducer;\n }\n reducer[key] = {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n };\n return reducer;\n }, {}));\n};\nvar proxyFactory = ({\n instance,\n transform,\n payload,\n transformedPayload\n}) => {\n const proxiedObj = new Proxy(instance, {\n get(target, prop, receiver) {\n if (prop === \"__sw_proxy\") {\n return true;\n }\n if (prop === \"toString\") {\n return proxyToString({\n property: target[prop],\n payload: transformedPayload\n });\n } else if (prop === \"_eventsNamespace\" && transform.getInstanceEventNamespace) {\n return transform.getInstanceEventNamespace(payload);\n } else if (prop === \"eventChannel\" && transform.getInstanceEventChannel) {\n return transform.getInstanceEventChannel(payload);\n } else if (prop in transformedPayload) {\n return transformedPayload[prop];\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n return serializeableProxy({\n instance,\n proxiedObj,\n payload,\n transformedPayload,\n transform\n });\n};\n\n// src/utils/eventTransformUtils.ts\nvar _instanceByTransformType = /* @__PURE__ */ new Map();\nvar _getOrCreateInstance = ({\n transform,\n payload\n}) => {\n if (!_instanceByTransformType.has(transform.type)) {\n const instance = transform.instanceFactory(payload);\n _instanceByTransformType.set(transform.type, instance);\n return instance;\n }\n return _instanceByTransformType.get(transform.type);\n};\nvar instanceProxyFactory = ({\n transform,\n payload\n}) => {\n const cachedInstance = _getOrCreateInstance({\n transform,\n payload\n });\n const transformedPayload = transform.payloadTransform(payload);\n const proxiedObj = proxyFactory({\n transform,\n payload,\n instance: cachedInstance,\n transformedPayload\n });\n return proxiedObj;\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 isInternalGlobalEvent = (event) => {\n return INTERNAL_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];\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) || 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};\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 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 closeConnectionAction: () => closeConnectionAction,\n compoundEventAttachAction: () => compoundEventAttachAction,\n createAction: () => createAction,\n destroyAction: () => destroyAction,\n executeAction: () => executeAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionAuthErrorAction: () => sessionAuthErrorAction,\n sessionConnectedAction: () => sessionConnectedAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionExpiringAction: () => sessionExpiringAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketClosedAction: () => socketClosedAction,\n socketErrorAction: () => socketErrorAction,\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 closeConnectionAction = createAction(\"swSdk/closeConnection\");\nvar reauthAction = createAction(\"swSdk/reauth\");\nvar executeAction = createAction(\"swSdk/executeRequest\");\nvar authErrorAction = createAction(\"auth/error\");\nvar authSuccessAction = createAction(\"auth/success\");\nvar authExpiringAction = createAction(\"auth/expiring\");\nvar socketClosedAction = createAction(\"socket/closed\");\nvar socketErrorAction = createAction(\"socket/error\");\nvar socketMessageAction = createAction(\"socket/message\");\nvar sessionConnectedAction = createAction(\"session.connected\");\nvar sessionDisconnectedAction = createAction(\"session.disconnected\");\nvar sessionReconnectingAction = createAction(\"session.reconnecting\");\nvar sessionAuthErrorAction = createAction(\"session.auth_error\");\nvar sessionExpiringAction = createAction(\"session.expiring\");\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};\nvar compoundEventAttachAction = createAction(\"compound_event:attach\");\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};\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 },\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 }\n});\nvar {\n actions: sessionActions,\n reducer: sessionReducer\n} = sessionSlice;\n\n// src/BaseSession.ts\nvar SW_SYMBOL = Symbol(\"BaseSession\");\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, \"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, \"_checkPingDelay\", 15 * 1e3);\n __publicField(this, \"_checkPingTimer\", null);\n __publicField(this, \"_status\", \"unknown\");\n var _a, _b;\n const { host, logLevel = \"info\" } = options;\n if (host) {\n this._host = checkWebSocketHost(host);\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 }\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 var _a, _b;\n return (_b = (_a = this._rpcConnectResult) == null ? void 0 : _a.authorization) == null ? void 0 : _b.signature;\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 set token(token) {\n this.options.token = token;\n }\n connect() {\n if (!(this == null ? void 0 : this.WebSocketConstructor)) {\n this.logger.error(\"Missing WebSocketConstructor\");\n return;\n }\n if (this._socket) {\n this.logger.warn(\"Session already connected.\");\n return;\n }\n this._socket = this._createSocket();\n const openHandler = (event) => {\n var _a;\n (_a = this._socket) == null ? void 0 : _a.removeEventListener(\"open\", openHandler);\n this._onSocketOpen(event);\n };\n this._socket.addEventListener(\"open\", openHandler);\n const closeHandler = (event) => {\n var _a;\n (_a = this._socket) == null ? void 0 : _a.removeEventListener(\"close\", closeHandler);\n this._onSocketClose(event);\n };\n this._socket.addEventListener(\"close\", closeHandler);\n const errorHandler = (event) => {\n var _a;\n (_a = this._socket) == null ? void 0 : _a.removeEventListener(\"error\", errorHandler);\n this._onSocketError(event);\n };\n this._socket.addEventListener(\"error\", errorHandler);\n this._socket.removeEventListener(\"message\", this._onSocketMessage);\n this._socket.addEventListener(\"message\", this._onSocketMessage);\n }\n _createSocket() {\n return new this.WebSocketConstructor(this._host);\n }\n async disconnect() {\n if (!this._socket || this.closing) {\n this.logger.warn(\"Session not connected or already in closing state.\");\n return;\n }\n clearTimeout(this._checkPingTimer);\n this._requests.clear();\n this._closeConnection(\"disconnected\");\n }\n execute(msg) {\n if (this._status === \"idle\" || !this.connected) {\n return Promise.reject(\"Can't call `execute` when Session is not authorized.\");\n }\n let promise;\n if (\"params\" in msg) {\n promise = new Promise((resolve, reject) => {\n this._requests.set(msg.id, { rpcRequest: msg, resolve, reject });\n });\n } else {\n promise = Promise.resolve();\n }\n this.logger.wsTraffic({ type: \"send\", payload: msg });\n this._socket.send(this.encode(msg));\n return timeoutPromise(promise, this._executeTimeoutMs, this._executeTimeoutError).catch((error) => {\n if (error === this._executeTimeoutError) {\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;\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.contexts) == null ? void 0 : _a.length) {\n params.contexts = this.options.contexts;\n }\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n }\n async _onSocketOpen(event) {\n this.logger.debug(\"_onSocketOpen\", event.type);\n try {\n await this.authenticate();\n this._status = \"connected\";\n this.dispatch(authSuccessAction());\n } catch (error) {\n this.logger.error(\"Auth Error\", error);\n this.dispatch(authErrorAction({ error }));\n }\n }\n _onSocketError(event) {\n this.logger.debug(\"_onSocketError\", event);\n this.dispatch(socketErrorAction());\n }\n _onSocketClose(event) {\n this.logger.debug(\"_onSocketClose\", event.type, event.code, event.reason);\n this._status = event.code >= 1006 && event.code <= 1014 ? \"reconnecting\" : \"disconnected\";\n this.dispatch(socketClosedAction());\n this._socket = null;\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 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 this._handleWebSocketMessage(payload);\n }\n }\n _handleWebSocketMessage(_payload) {\n }\n dispatch(_payload) {\n throw new Error(\"Method not implemented\");\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 _pingHandler(payload) {\n var _a;\n clearTimeout(this._checkPingTimer);\n this._checkPingTimer = setTimeout(() => {\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 _closeConnection(status) {\n this._status = status;\n this.dispatch(sessionActions.authStatus(\"unknown\"));\n this.dispatch(closeConnectionAction());\n if (this._socket) {\n this._socket.close();\n this._socket = null;\n }\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, _b, _c;\n const expiresAt = (_c = (_b = (_a = this == null ? void 0 : this._rpcConnectResult) == null ? void 0 : _a.authorization) == null ? void 0 : _b.expires_at) != null ? _c : 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.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 this._rpcConnectResult = await this.execute(RPCConnect(params));\n await this.persistRelayProtocol();\n this._checkTokenExpiration();\n }\n async retrieveRelayProtocol() {\n return \"\";\n }\n async persistRelayProtocol() {\n }\n async reauthenticate() {\n if (this.expired) {\n return this.connect();\n }\n const params = {\n project: this._rpcConnectResult.authorization.project,\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 _checkTokenExpiration() {\n if (!this.expiresAt) {\n return;\n }\n if (this.expiresIn <= this._refreshTokenNotificationDiff) {\n this.dispatch(authExpiringAction());\n if (this.options._onRefreshToken) {\n this.options._onRefreshToken();\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 closeConnectionAction: () => closeConnectionAction,\n compoundEventAttachAction: () => compoundEventAttachAction,\n configureStore: () => configureStore2,\n connect: () => connect,\n createAction: () => createAction,\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n destroyAction: () => destroyAction,\n executeAction: () => executeAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionAuthErrorAction: () => sessionAuthErrorAction,\n sessionConnectedAction: () => sessionConnectedAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionExpiringAction: () => sessionExpiringAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketClosedAction: () => socketClosedAction,\n socketErrorAction: () => socketErrorAction,\n socketMessageAction: () => socketMessageAction\n});\nimport createSagaMiddleware, {\n multicastChannel\n} from \"@redux-saga/core\";\n\n// src/redux/features/component/componentSlice.ts\nvar initialComponentState = {\n byId: {}\n};\nvar requestUpdater = ({\n state,\n payload,\n componentId,\n key,\n requestId\n}) => {\n if (componentId in state.byId) {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [componentId]: __spreadProps(__spreadValues({}, state.byId[componentId]), {\n [key]: __spreadProps(__spreadValues({}, state.byId[componentId][key]), {\n [requestId]: payload\n })\n })\n })\n });\n } else {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [componentId]: {\n id: componentId,\n [key]: {\n [requestId]: payload\n }\n }\n })\n });\n }\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 executeSuccess: (state, { payload }) => {\n const { componentId, requestId, response } = payload;\n return requestUpdater({\n componentId,\n requestId,\n state,\n key: \"responses\",\n payload: response\n });\n },\n executeFailure: (state, { payload }) => {\n const { componentId, requestId, error, action } = payload;\n return requestUpdater({\n componentId,\n requestId,\n state,\n key: \"errors\",\n payload: {\n action,\n jsonrpc: error\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/features/executeQueue/executeQueueSlice.ts\nvar initialExecuteQueueState = {\n queue: []\n};\nvar executeQueueSlice = createDestroyableSlice({\n name: \"executeQueue\",\n initialState: initialExecuteQueueState,\n reducers: {\n add: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n queue: state.queue.concat(payload)\n });\n },\n clean: () => {\n return initialExecuteQueueState;\n }\n }\n});\nvar {\n actions: executeQueueActions,\n reducer: executeQueueReducer\n} = executeQueueSlice;\n\n// src/redux/rootReducer.ts\nvar rootReducer = (0, toolkit_exports.combineReducers)({\n components: componentReducer,\n session: sessionReducer,\n executeQueue: executeQueueReducer\n});\n\n// src/redux/rootSaga.ts\nimport { fork as fork4, call as call3, take as take4, put as put4, delay as delay2, all } from \"@redux-saga/core/effects\";\n\n// src/redux/features/session/sessionSaga.ts\nimport { eventChannel } from \"@redux-saga/core\";\nimport {\n call as call2,\n put,\n take,\n fork,\n select,\n cancelled\n} 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});\nimport { call, spawn } from \"@redux-saga/core/effects\";\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/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/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/redux/features/session/sessionSaga.ts\nvar isWebrtcEvent = (e) => {\n return (e == null ? void 0 : e.event_type) === \"webrtc.message\";\n};\nvar isVideoEvent = (e) => {\n var _a;\n return !!((_a = e == null ? void 0 : e.event_type) == null ? void 0 : _a.startsWith(\"video.\"));\n};\nfunction* executeActionWatcher(session) {\n function* worker(action) {\n const authStatus = yield select(getAuthStatus);\n if (authStatus !== \"authorized\") {\n return;\n }\n const { componentId, requestId, method, params } = action.payload;\n try {\n const message = RPCExecute({\n id: requestId,\n method,\n params\n });\n const response = yield call2(session.execute, message);\n if (componentId && requestId) {\n yield put(componentActions.executeSuccess({\n componentId,\n requestId,\n response\n }));\n }\n } catch (error) {\n getLogger().warn(\"worker error\", componentId, JSON.stringify(error));\n if (componentId && requestId) {\n yield put(componentActions.executeFailure({\n componentId,\n requestId,\n action,\n error\n }));\n }\n } finally {\n const isCancelled = yield cancelled();\n if (isCancelled && componentId && requestId) {\n const error = {\n jsonrpc: \"2.0\",\n id: requestId,\n error: {\n code: -32600,\n message: \"Cancelled task\"\n }\n };\n getLogger().debug(\"executeActionWorker cancelled\", {\n requestId,\n componentId,\n error\n });\n yield put(componentActions.executeFailure({\n componentId,\n requestId,\n action,\n error\n }));\n }\n }\n }\n while (true) {\n const action = yield take(executeAction.type);\n yield fork(worker, action);\n }\n}\nfunction* sessionChannelWatcher({\n session,\n sessionChannel,\n pubSubChannel,\n swEventChannel\n}) {\n function* vertoWorker({ jsonrpc, nodeId }) {\n var _a, _b;\n const { id, method, params = {} } = jsonrpc;\n switch (method) {\n case \"verto.media\": {\n const component = {\n id: params.callID,\n state: \"early\",\n remoteSDP: params.sdp,\n nodeId\n };\n yield put(componentActions.upsert(component));\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoResult(id, method),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.answer\": {\n const component = {\n id: params.callID,\n state: \"active\",\n nodeId\n };\n if (params == null ? void 0 : params.sdp) {\n component.remoteSDP = params.sdp;\n }\n yield put(componentActions.upsert(component));\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoResult(id, method),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.bye\": {\n const component = {\n id: params.callID,\n state: \"hangup\",\n nodeId,\n byeCause: (_a = params == null ? void 0 : params.cause) != null ? _a : \"\",\n byeCauseCode: (_b = params == null ? void 0 : params.causeCode) != null ? _b : 0,\n redirectDestination: params == null ? void 0 : params.redirectDestination\n };\n yield put(componentActions.upsert(component));\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoResult(id, method),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.ping\": {\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoPong(params),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.punt\":\n return session.disconnect();\n case \"verto.mediaParams\": {\n const { callID, mediaParams = {} } = params;\n if (!callID) {\n getLogger().debug(`Invalid mediaParams event`, params);\n break;\n }\n const component = { id: callID };\n if (mediaParams == null ? void 0 : mediaParams.video) {\n component.videoConstraints = mediaParams.video;\n }\n if (mediaParams == null ? void 0 : mediaParams.audio) {\n component.audioConstraints = mediaParams.audio;\n }\n yield put(componentActions.upsert(component));\n break;\n }\n case \"verto.info\":\n return getLogger().debug(\"Verto Info\", params);\n case \"verto.clientReady\":\n return getLogger().debug(\"Verto ClientReady\", params);\n case \"verto.announce\":\n return getLogger().debug(\"Verto Announce\", params);\n default:\n return getLogger().debug(`Unknown Verto method: ${method}`, params);\n }\n }\n function* videoAPIWorker(params) {\n switch (params.event_type) {\n case \"video.member.updated\": {\n return;\n }\n case \"video.room.subscribed\": {\n yield put(componentActions.upsert({\n id: params.params.call_id,\n roomId: params.params.room_session.room_id,\n roomSessionId: params.params.room_session.id,\n memberId: params.params.member_id,\n previewUrl: params.params.room_session.preview_url\n }));\n yield put(pubSubChannel, {\n type: \"video.room.joined\",\n payload: params.params\n });\n break;\n }\n case \"video.member.joined\": {\n const { member } = params.params;\n if (member == null ? void 0 : member.parent_id) {\n const parent = yield select(getComponent, member.parent_id);\n if (parent) {\n yield put(componentActions.upsert({\n id: member.id,\n roomId: params.params.room_id,\n roomSessionId: params.params.room_session_id,\n memberId: member.id\n }));\n }\n }\n break;\n }\n case \"video.member.talking\": {\n const { member } = params.params;\n if (\"talking\" in member) {\n const suffix = member.talking ? \"started\" : \"ended\";\n yield put(pubSubChannel, {\n type: `video.member.talking.${suffix}`,\n payload: params.params\n });\n const deprecatedSuffix = member.talking ? \"start\" : \"stop\";\n yield put(pubSubChannel, {\n type: `video.member.talking.${deprecatedSuffix}`,\n payload: params.params\n });\n }\n break;\n }\n }\n yield put(pubSubChannel, {\n type: params.event_type,\n payload: params.params\n });\n }\n function* swEventWorker(broadcastParams) {\n yield put(swEventChannel, toInternalAction(broadcastParams));\n if (isWebrtcEvent(broadcastParams)) {\n yield fork(vertoWorker, {\n jsonrpc: broadcastParams.params,\n nodeId: broadcastParams.node_id\n });\n return;\n }\n if (isVideoEvent(broadcastParams)) {\n yield fork(videoAPIWorker, broadcastParams);\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}\nfunction createSessionChannel(session) {\n return eventChannel((emit) => {\n session.dispatch = (payload) => {\n emit(payload);\n };\n const unsubscribe = () => {\n getLogger().debug(\"sessionChannel unsubscribe\");\n session.disconnect();\n };\n return unsubscribe;\n });\n}\n\n// src/redux/features/pubSub/pubSubSaga.ts\nimport { take as take2 } from \"@redux-saga/core/effects\";\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 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 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)) {\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/redux/features/pubSub/pubSubSaga.ts\nfunction* pubSubSaga({\n pubSubChannel,\n emitter\n}) {\n while (true) {\n const pubSubAction = yield take2(pubSubChannel, \"*\");\n const { type, payload } = pubSubAction;\n try {\n const namespace = findNamespaceInPayload(pubSubAction);\n if (isInternalGlobalEvent(type)) {\n emitter.emit(type, payload);\n }\n getLogger().trace(\"Emit:\", toInternalEventName({ namespace, event: type }));\n emitter.emit(toInternalEventName({ namespace, event: type }), payload);\n } catch (error) {\n getLogger().error(error);\n }\n }\n}\n\n// src/redux/features/executeQueue/executeQueueSaga.ts\nimport { put as put2, take as take3, fork as fork2, select as select2 } from \"@redux-saga/core/effects\";\n\n// src/redux/features/executeQueue/executeQueueSelectors.ts\nvar getExecuteQueue = ({ executeQueue }) => {\n return executeQueue;\n};\n\n// src/redux/features/executeQueue/executeQueueSaga.ts\nfunction* executeQueueWatcher() {\n function* worker(action) {\n const authStatus = yield select2(getAuthStatus);\n if (authStatus !== \"authorized\") {\n yield put2(executeQueueActions.add(action.payload));\n }\n }\n while (true) {\n const action = yield take3(executeAction.type);\n yield fork2(worker, action);\n }\n}\nfunction* flushExecuteQueueWorker() {\n const { queue } = yield select2(getExecuteQueue);\n for (const params of queue) {\n yield put2(executeAction(params));\n }\n yield put2(executeQueueActions.clean());\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/features/component/componentSaga.ts\nimport { delay, fork as fork3, put as put3, select as select3 } from \"@redux-saga/core/effects\";\nfunction* componentCleanupSagaWorker() {\n const toCleanup = yield select3(getComponentsToCleanup);\n if (toCleanup.length) {\n yield put3(componentActions.cleanup({\n ids: toCleanup\n }));\n }\n}\nfunction* componentCleanupSaga() {\n while (true) {\n yield delay(36e5);\n yield fork3(componentCleanupSagaWorker);\n }\n}\n\n// src/redux/rootSaga.ts\nfunction* initSessionSaga({\n SessionConstructor,\n userOptions,\n channels\n}) {\n var _a;\n const session = new SessionConstructor(userOptions);\n const sessionChannel = yield call3(createSessionChannel, session);\n const pubSubChannel = channels.pubSubChannel;\n const swEventChannel = channels.swEventChannel;\n let customTasks = [];\n if ((_a = userOptions.workers) == null ? void 0 : _a.length) {\n try {\n const effects = userOptions.workers.map((saga) => {\n return call3(createRestartableSaga(saga));\n });\n customTasks = yield all(effects);\n } catch (error) {\n getLogger().error(\"Error running custom workers\", error);\n }\n }\n yield fork4(sessionChannelWatcher, {\n session,\n sessionChannel,\n pubSubChannel,\n swEventChannel\n });\n yield fork4(sessionStatusWatcher, {\n session,\n sessionChannel,\n pubSubChannel,\n userOptions\n });\n const compCleanupTask = yield fork4(componentCleanupSaga);\n session.connect();\n yield take4(destroyAction.type);\n compCleanupTask == null ? void 0 : compCleanupTask.cancel();\n pubSubChannel.close();\n sessionChannel.close();\n swEventChannel.close();\n customTasks.forEach((task) => task.cancel());\n}\nfunction* socketClosedWorker({\n session,\n sessionChannel,\n pubSubChannel\n}) {\n getLogger().debug(\"socketClosedWorker\", session.status);\n if (session.status === \"reconnecting\") {\n yield put4(pubSubChannel, sessionReconnectingAction());\n yield delay2(Math.random() * 2e3);\n yield call3(session.connect);\n } else if (session.status === \"disconnected\") {\n yield put4(pubSubChannel, sessionDisconnectedAction());\n sessionChannel.close();\n } else {\n getLogger().warn(\"Unhandled Session Status\", session.status);\n if (process.env.NODE_ENV === \"development\") {\n throw new Error(`Unhandled Session Status: '${session.status}'`);\n }\n }\n}\nfunction* reauthenticateWorker({\n session,\n token,\n pubSubChannel\n}) {\n try {\n if (session.reauthenticate) {\n session.token = token;\n yield call3(session.reauthenticate);\n yield put4(pubSubChannel, sessionConnectedAction());\n }\n } catch (error) {\n getLogger().error(\"Reauthenticate Error\", error);\n yield put4(authErrorAction({ error }));\n }\n}\nfunction* sessionStatusWatcher(options) {\n while (true) {\n const action = yield take4([\n authSuccessAction.type,\n authErrorAction.type,\n authExpiringAction.type,\n socketErrorAction.type,\n socketClosedAction.type,\n reauthAction.type\n ]);\n getLogger().debug(\"sessionStatusWatcher\", action.type, action.payload);\n switch (action.type) {\n case authSuccessAction.type:\n yield fork4(startSaga, options);\n break;\n case authErrorAction.type: {\n yield fork4(sessionAuthErrorSaga, {\n action,\n userOptions: options.userOptions,\n pubSubChannel: options.pubSubChannel\n });\n break;\n }\n case authExpiringAction.type: {\n yield put4(options.pubSubChannel, sessionExpiringAction());\n break;\n }\n case socketErrorAction.type:\n break;\n case socketClosedAction.type:\n yield fork4(socketClosedWorker, options);\n break;\n case reauthAction.type: {\n yield fork4(reauthenticateWorker, {\n session: options.session,\n token: action.payload.token,\n pubSubChannel: options.pubSubChannel\n });\n break;\n }\n }\n }\n}\nfunction* startSaga(options) {\n const { session, pubSubChannel, userOptions } = options;\n const pubSubTask = yield fork4(pubSubSaga, {\n pubSubChannel,\n emitter: userOptions.emitter\n });\n const executeActionTask = yield fork4(executeActionWatcher, session);\n yield put4(sessionActions.connected(session.rpcConnectResult));\n yield put4(pubSubChannel, sessionConnectedAction());\n const flushExecuteQueueTask = yield fork4(flushExecuteQueueWorker);\n yield take4(closeConnectionAction.type);\n pubSubTask.cancel();\n executeActionTask.cancel();\n flushExecuteQueueTask.cancel();\n}\nfunction* sessionAuthErrorSaga(options) {\n const { pubSubChannel, userOptions, action } = options;\n const { error: authError } = action.payload;\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n const pubSubTask = yield fork4(pubSubSaga, {\n pubSubChannel,\n emitter: userOptions.emitter\n });\n yield put4(pubSubChannel, sessionAuthErrorAction(error));\n yield take4(sessionDisconnectedAction);\n pubSubTask.cancel();\n throw error;\n}\nvar rootSaga_default = (options) => {\n return function* root({\n userOptions,\n channels\n }) {\n if (userOptions.logger) {\n setLogger(userOptions.logger);\n }\n if (userOptions.debug) {\n setDebugOptions(userOptions.debug);\n }\n yield fork4(executeQueueWatcher);\n yield take4(initAction.type);\n try {\n yield call3(initSessionSaga, __spreadProps(__spreadValues({}, options), {\n userOptions,\n channels\n }));\n } catch (error) {\n getLogger().error(\"RootSaga Error:\", error);\n return;\n }\n };\n};\n\n// src/redux/connect.ts\nvar connect = (options) => {\n const {\n componentListeners = {},\n sessionListeners = {},\n store,\n Component,\n customSagas = []\n } = options;\n const componentKeys = Object.keys(componentListeners);\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 component = getComponent(state, instance.__uuid) || {};\n for (const reduxKey of componentKeys) {\n if (run === false) {\n return;\n }\n const cacheKey = `${instance.__uuid}.${reduxKey}`;\n const current = cacheMap.get(cacheKey);\n const updatedValue = component[reduxKey];\n if (updatedValue !== void 0 && current !== updatedValue) {\n cacheMap.set(cacheKey, updatedValue);\n const fnName = componentListeners[reduxKey];\n if (typeof fnName === \"string\") {\n instance[fnName](component);\n } else {\n fnName(component);\n }\n }\n }\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/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 pubSubChannel = multicastChannel();\n const swEventChannel = multicastChannel();\n const channels = {\n pubSubChannel,\n swEventChannel\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 runSaga = (saga, args) => {\n return sagaMiddleware.run(saga, __spreadProps(__spreadValues({}, args), {\n channels\n }));\n };\n if (runSagaMiddleware) {\n const saga = rootSaga_default({\n SessionConstructor\n });\n sagaMiddleware.run(saga, { userOptions, channels });\n }\n return __spreadProps(__spreadValues({}, store), {\n runSaga\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, \"_proxyFactoryCache\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"_eventsPrefix\", \"\");\n __publicField(this, \"_eventsRegisterQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_eventsEmitQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_eventsNamespace\");\n __publicField(this, \"_eventsTransformsCache\", /* @__PURE__ */ new Map());\n __publicField(this, \"_requests\", /* @__PURE__ */ new Map());\n __publicField(this, \"_customSagaTriggers\", /* @__PURE__ */ new Map());\n __publicField(this, \"_destroyer\");\n __publicField(this, \"_emitterTransforms\", /* @__PURE__ */ new Map());\n __publicField(this, \"_emitterListenersCache\", /* @__PURE__ */ new Map());\n __publicField(this, \"_trackedEvents\", []);\n __publicField(this, \"_runningWorkers\", []);\n __publicField(this, \"_workers\", /* @__PURE__ */ new Map());\n }\n get __uuid() {\n return this.uuid;\n }\n _handleCompoundEvents(event) {\n const internalEvent = this._getInternalEvent(event);\n let compoundEvents;\n for (const evt of this.getCompoundEvents().keys()) {\n if (this._getInternalEvent(evt) === internalEvent) {\n compoundEvents = this.getCompoundEvents().get(evt);\n break;\n }\n }\n if (!compoundEvents || compoundEvents.length === 0) {\n return;\n }\n this.store.dispatch(compoundEventAttachAction({\n compoundEvents,\n event: internalEvent,\n namespace: this._eventsNamespace\n }));\n compoundEvents.forEach((compoundEvent) => {\n if (typeof compoundEvent === \"string\") {\n this._trackEvent(compoundEvent);\n }\n });\n }\n _getNamespacedEvent(event) {\n let namespace = this._eventsNamespace;\n if (typeof event === \"string\" && isLocalEvent(event)) {\n namespace = this.__uuid;\n }\n return toInternalEventName({\n event,\n namespace\n });\n }\n _getPrefixedEvent(event) {\n if (this._eventsPrefix && typeof event === \"string\" && !event.includes(`${this._eventsPrefix}.`) && !isSessionEvent(event)) {\n return `${this._eventsPrefix}.${event}`;\n }\n return event;\n }\n _getInternalEvent(event) {\n return this._getNamespacedEvent(this._getPrefixedEvent(event));\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 emitter() {\n return this.options.emitter;\n }\n addEventToRegisterQueue(options) {\n const [event, fn] = options.params;\n this.logger.trace(\"Adding event to the register queue\", { event, fn });\n this._eventsRegisterQueue.add({\n type: options.type,\n params: options.params\n });\n return this.emitter;\n }\n _addEventToEmitQueue(event, args) {\n this.logger.trace(\"Adding to the emit queue\", event);\n this._eventsEmitQueue.add({ event, args });\n }\n shouldAddToQueue() {\n return this._eventsNamespace === void 0;\n }\n runAndCacheEventHandlerTransform({\n internalEvent,\n transform,\n payload\n }) {\n if (transform.mode === \"no-cache\") {\n const instance = transform.instanceFactory(payload);\n return instance;\n } else if (!this._eventsTransformsCache.has(internalEvent)) {\n const instance = transform.instanceFactory(payload);\n this._eventsTransformsCache.set(internalEvent, instance);\n return instance;\n }\n return this._eventsTransformsCache.get(internalEvent);\n }\n cleanupEventHandlerTransformCache({\n internalEvent,\n force\n }) {\n const instance = this._eventsTransformsCache.get(internalEvent);\n const eventCount = this.listenerCount(internalEvent);\n if (instance && (force || eventCount <= 1)) {\n if (instance.__uuid !== this.__uuid && typeof instance.destroy === \"function\") {\n instance.destroy();\n }\n return this._eventsTransformsCache.delete(internalEvent);\n }\n this.logger.trace(`[cleanupEventHandlerTransformCache] Key wasn't cached`, internalEvent);\n return false;\n }\n getEmitterListenersMapByInternalEventName(internalEvent) {\n var _a;\n return (_a = this._emitterListenersCache.get(internalEvent)) != null ? _a : /* @__PURE__ */ new Map();\n }\n getAndRemoveStableEventHandler(internalEvent, fn) {\n const cacheByEventName = this.getEmitterListenersMapByInternalEventName(internalEvent);\n if (fn && cacheByEventName.has(fn)) {\n const handler = cacheByEventName.get(fn);\n cacheByEventName.delete(fn);\n this._emitterListenersCache.set(internalEvent, cacheByEventName);\n return handler;\n }\n return fn;\n }\n _createStableEventHandler(internalEvent, fn) {\n const wrapperHandler = (payload) => {\n const transform = this._emitterTransforms.get(internalEvent);\n this.logger.trace(\"Got emitterTransform for\", internalEvent, transform);\n if (!transform) {\n return fn(payload);\n }\n const cachedInstance = this.runAndCacheEventHandlerTransform({\n internalEvent,\n transform,\n payload\n });\n let proxiedObj;\n if (this._proxyFactoryCache.has(payload)) {\n proxiedObj = this._proxyFactoryCache.get(payload);\n } else {\n const transformedPayload = this._parseNestedFields(payload, transform);\n proxiedObj = proxyFactory({\n instance: cachedInstance,\n payload,\n transformedPayload,\n transform\n });\n this._proxyFactoryCache.set(payload, proxiedObj);\n }\n return fn(proxiedObj);\n };\n return wrapperHandler;\n }\n _parseNestedFields(obj, transform, process2 = (p) => p, result = void 0) {\n if (!transform.nestedFieldsToProcess) {\n return transform.payloadTransform(obj);\n }\n if (obj.__sw_proxy) {\n return obj;\n }\n if (!result) {\n const r = transform.payloadTransform(obj);\n return this._parseNestedFields(r, transform, process2, r);\n }\n if (Array.isArray(obj)) {\n result = obj.map((item, index) => {\n return this._parseNestedFields(process2(item), transform, process2, obj[index]);\n });\n } else if (obj && typeof obj === \"object\") {\n Object.entries(obj).forEach(([key, value]) => {\n var _a;\n const nestedTransform = (_a = transform.nestedFieldsToProcess) == null ? void 0 : _a[key];\n const transformToUse = nestedTransform ? this._emitterTransforms.get(nestedTransform.eventTransformType) : void 0;\n if (value && typeof value === \"object\") {\n result[key] = this._parseNestedFields(value, transform, (p) => {\n if (nestedTransform && transformToUse && p && typeof p === \"object\") {\n return instanceProxyFactory({\n transform: transformToUse,\n payload: process2(nestedTransform.processInstancePayload(p))\n });\n }\n return p;\n }, result[key]);\n } else {\n result[key] = process2(value);\n }\n });\n }\n return result;\n }\n getOrCreateStableEventHandler(internalEvent, fn) {\n const cacheByEventName = this.getEmitterListenersMapByInternalEventName(internalEvent);\n let handler = cacheByEventName.get(fn);\n if (!handler) {\n handler = this._createStableEventHandler(internalEvent, fn);\n cacheByEventName.set(fn, handler);\n this._emitterListenersCache.set(internalEvent, cacheByEventName);\n }\n return handler;\n }\n _trackEvent(internalEvent) {\n this._trackedEvents = Array.from(new Set(this._trackedEvents.concat(internalEvent)));\n }\n _untrackEvent(internalEvent) {\n this._trackedEvents = this._trackedEvents.filter((evt) => evt !== internalEvent);\n }\n _addListener(event, fn, once) {\n this._handleCompoundEvents(event);\n const internalEvent = this._getInternalEvent(event);\n this._trackEvent(internalEvent);\n const type = once ? \"once\" : \"on\";\n if (this.shouldAddToQueue()) {\n this.addEventToRegisterQueue({\n type,\n params: [event, fn]\n });\n return this.emitter;\n }\n const wrappedHandler = this.getOrCreateStableEventHandler(internalEvent, fn);\n this.logger.trace(\"Registering event\", internalEvent);\n return this.emitter[type](internalEvent, wrappedHandler);\n }\n on(event, fn) {\n return this._addListener(event, fn);\n }\n once(event, fn) {\n return this._addListener(event, fn, true);\n }\n off(event, fn) {\n if (this.shouldAddToQueue()) {\n this.addEventToRegisterQueue({\n type: \"off\",\n params: [event, fn]\n });\n return this.emitter;\n }\n const internalEvent = this._getInternalEvent(event);\n const handler = this.getAndRemoveStableEventHandler(internalEvent, fn);\n this.cleanupEventHandlerTransformCache({\n internalEvent,\n force: !handler\n });\n this.logger.trace(\"Removing event listener\", internalEvent);\n this._untrackEvent(internalEvent);\n return this.emitter.off(internalEvent, handler);\n }\n removeAllListeners(event) {\n if (this.shouldAddToQueue()) {\n this.addEventToRegisterQueue({\n type: \"removeAllListeners\",\n params: [event]\n });\n return this.emitter;\n }\n if (event) {\n return this.off(event);\n }\n this.eventNames().forEach((eventName) => {\n this.off(eventName);\n });\n return this.emitter;\n }\n eventNames() {\n return this._trackedEvents;\n }\n getSubscriptions() {\n return validateEventsToSubscribe(this.eventNames());\n }\n emit(event, ...args) {\n if (this.shouldAddToQueue()) {\n this._addEventToEmitQueue(event, args);\n return false;\n }\n const internalEvent = this._getInternalEvent(event);\n this.logger.trace(\"Emit on event:\", internalEvent);\n return this.emitter.emit(internalEvent, ...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._requests.set(requestId, {\n resolve,\n reject,\n transformResolve,\n transformReject\n });\n this.store.dispatch(executeAction({\n requestId,\n componentId: this.__uuid,\n method,\n params: transformParams(params)\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 onError(component) {\n this._requests.forEach((value, key) => {\n if ((component == null ? void 0 : component.errors[key]) !== void 0) {\n value.reject(value.transformReject(component.errors[key]));\n this._requests.delete(key);\n }\n });\n }\n onSuccess(component) {\n this._requests.forEach((value, key) => {\n if ((component == null ? void 0 : component.responses[key]) !== void 0) {\n value.resolve(value.transformResolve(component.responses[key]));\n this._requests.delete(key);\n }\n });\n }\n getStateProperty(param) {\n return this[param];\n }\n flushEventsRegisterQueue() {\n this._eventsRegisterQueue.forEach((item) => {\n this[item.type](...item.params);\n this._eventsRegisterQueue.delete(item);\n });\n }\n flushEventsEmitQueue() {\n this._eventsEmitQueue.forEach((item) => {\n const { event, args } = item;\n this.emit(event, ...args);\n this._eventsEmitQueue.delete(item);\n });\n }\n flushEventsQueue() {\n this.flushEventsRegisterQueue();\n this.flushEventsEmitQueue();\n }\n _attachListeners(namespace) {\n if (typeof namespace === \"string\") {\n this._eventsNamespace = namespace;\n }\n this.flushEventsQueue();\n }\n getCompoundEvents() {\n return /* @__PURE__ */ new Map();\n }\n getEmitterTransforms() {\n return /* @__PURE__ */ new Map();\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 _setEmitterTransform({\n event,\n handler,\n local\n }) {\n const internalEvent = this._getInternalEvent(event);\n if (local ? !isLocalEvent(event) : isLocalEvent(event) || !this.eventNames().includes(internalEvent)) {\n return;\n }\n this._emitterTransforms.set(internalEvent, handler);\n }\n applyEmitterTransforms({ local = false } = { local: false }) {\n this.getEmitterTransforms().forEach((handlersObj, key) => {\n if (Array.isArray(key)) {\n key.forEach((k) => {\n this._setEmitterTransform({\n event: k,\n handler: handlersObj,\n local\n });\n });\n } else {\n this._setEmitterTransform({\n event: key,\n handler: handlersObj,\n local\n });\n }\n this._emitterTransforms.set(handlersObj.type, handlersObj);\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 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 }\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 this._attachListeners(\"\");\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 this.applyEmitterTransforms({ local: true });\n }\n shouldExecuteSubscribe(execParams) {\n return !this._latestExecuteParams || JSON.stringify(execParams) !== JSON.stringify(this._latestExecuteParams);\n }\n async subscribe() {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.warn(\"`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 this.applyEmitterTransforms();\n await this.execute(execParams);\n return resolve(void 0);\n } catch (error) {\n return reject(error);\n }\n });\n }\n};\n\n// src/utils/EventEmitter.ts\nimport EventEmitter2 from \"eventemitter3\";\nvar getEventEmitter = () => {\n return new EventEmitter2();\n};\n\n// src/types/videoMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS = {\n audio_muted: true,\n video_muted: true,\n deaf: true,\n on_hold: 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/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 audioMuteMember: () => audioMuteMember,\n audioUnmuteMember: () => audioUnmuteMember,\n createRoomSessionPlaybackObject: () => createRoomSessionPlaybackObject,\n createRoomSessionRecordingObject: () => createRoomSessionRecordingObject,\n deafMember: () => deafMember,\n getLayouts: () => getLayouts,\n getMembers: () => getMembers,\n getPlaybacks: () => getPlaybacks,\n getRecordings: () => getRecordings,\n hideVideoMuted: () => hideVideoMuted,\n play: () => play,\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 undeafMember: () => undeafMember,\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 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 = createRoomMethod(\"video.recording.list\", {\n transformResolve: (payload) => ({\n recordings: payload.recordings.map((row) => toExternalJSON(row))\n })\n});\nvar startRecording = {\n value: function() {\n return new Promise(async (resolve) => {\n const handler = (instance) => {\n resolve(instance);\n };\n this.on(toLocalEvent(\"video.recording.start\"), handler);\n try {\n const payload = await this.execute({\n method: \"video.recording.start\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n this.emit(toLocalEvent(\"video.recording.start\"), __spreadProps(__spreadValues({}, payload), {\n room_session_id: this.roomSessionId\n }));\n } catch (error) {\n this.off(toLocalEvent(\"video.recording.start\"), handler);\n throw error;\n }\n });\n }\n};\nvar getPlaybacks = createRoomMethod(\"video.playback.list\", {\n transformResolve: (payload) => ({\n playbacks: payload.playbacks.map((row) => toExternalJSON(row))\n })\n});\nvar play = {\n value: function(params) {\n return new Promise(async (resolve) => {\n const handler = (instance) => {\n resolve(instance);\n };\n this.on(toLocalEvent(\"video.playback.start\"), handler);\n try {\n const payload = await this.execute({\n method: \"video.playback.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n });\n this.emit(toLocalEvent(\"video.playback.start\"), __spreadProps(__spreadValues({}, payload), {\n room_session_id: this.roomSessionId\n }));\n } catch (error) {\n this.off(toLocalEvent(\"video.playback.start\"), handler);\n throw error;\n }\n });\n }\n};\nvar setMeta = createRoomMethod(\"video.set_meta\", {\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});\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 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 setMemberMeta = createRoomMemberMethod(\"video.member.set_meta\", {\n transformResolve: baseCodeTransform\n});\n\n// src/rooms/RoomSessionRecording.ts\nvar RoomSessionRecordingAPI = class extends BaseComponent {\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 componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return recording;\n};\n\n// src/rooms/RoomSessionPlayback.ts\nvar RoomSessionPlaybackAPI = class extends BaseComponent {\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 componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return playback;\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/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/pubSub/workers.ts\nvar pubSubWorker = function* pubSubWorker2({ channels: { pubSubChannel } }) {\n while (true) {\n const action = yield sagaEffects.take((action2) => {\n return action2.type.startsWith(`${PRODUCT_PREFIX_PUBSUB}.`);\n });\n getLogger().debug(\"pubSubWorker:\", action);\n switch (action.type) {\n case `${PRODUCT_PREFIX_PUBSUB}.channel.message`: {\n yield sagaEffects.put(pubSubChannel, {\n type: `${PRODUCT_PREFIX_PUBSUB}.message`,\n payload: action.payload\n });\n break;\n }\n default: {\n getLogger().warn(\"[pubSubWorker] Unrecognized Action\", action);\n break;\n }\n }\n }\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, \"_eventsPrefix\", PRODUCT_PREFIX_PUBSUB);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_PUBSUB}.subscribe`);\n this._attachListeners(\"\");\n this.runWorker(\"pubSub\", { worker: pubSubWorker });\n }\n getEmitterTransforms() {\n return /* @__PURE__ */ new Map([\n [\n [\"message\"],\n {\n type: \"pubSubMessage\",\n instanceFactory: () => {\n return new PubSubMessage({});\n },\n payloadTransform: (payload) => {\n const {\n channel,\n message: _a\n } = payload.params, _b = _a, { member } = _b, restMessage = __objRest(_b, [\"member\"]);\n return toExternalJSON(__spreadProps(__spreadValues({}, restMessage), {\n channel\n }));\n }\n }\n ]\n ]);\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 async subscribe(channels) {\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.once(\"session.auth_error\", (error) => {\n reject(error);\n });\n this.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};\nvar createBasePubSubObject = (params) => {\n const pubSub = connect({\n store: params.store,\n Component: BasePubSubConsumer,\n componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return pubSub;\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/chat/ChatMessage.ts\nvar ChatMessage = class extends PubSubMessage {\n get member() {\n return this.payload.member;\n }\n};\n\n// src/chat/workers.ts\nvar chatWorker = function* chatWorker2({\n channels: { pubSubChannel }\n}) {\n while (true) {\n const action = yield sagaEffects.take((action2) => {\n return action2.type.startsWith(\"chat.\");\n });\n getLogger().debug(\"chatWorker:\", action);\n switch (action.type) {\n case \"chat.channel.message\": {\n if (PRODUCT_PREFIX_CHAT === PRODUCT_PREFIX_PUBSUB) {\n break;\n }\n yield sagaEffects.put(pubSubChannel, {\n type: \"chat.message\",\n payload: action.payload\n });\n break;\n }\n case \"chat.member.joined\":\n case \"chat.member.updated\":\n case \"chat.member.left\":\n yield sagaEffects.put(pubSubChannel, action);\n break;\n default: {\n getLogger().warn(\"[chatWorker] Unrecognized Action\", action);\n break;\n }\n }\n }\n};\n\n// src/chat/BaseChat.ts\nvar BaseChatConsumer = class extends BasePubSubConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"_eventsPrefix\", PRODUCT_PREFIX_CHAT);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_CHAT}.subscribe`);\n this.runWorker(\"chat\", { worker: chatWorker });\n }\n getEmitterTransforms() {\n return /* @__PURE__ */ new Map([\n [\n [\"message\"],\n {\n type: \"chatMessage\",\n instanceFactory: () => {\n return new ChatMessage({});\n },\n payloadTransform: (payload) => {\n const { channel, message } = payload.params;\n return toExternalJSON(__spreadProps(__spreadValues({}, message), {\n channel\n }));\n }\n }\n ],\n [\n [\"member.joined\", \"member.left\", \"member.updated\"],\n {\n type: \"chatMember\",\n instanceFactory: (payload) => {\n const { member } = payload.params;\n return new ChatMember(toExternalJSON(member));\n },\n payloadTransform: (payload) => {\n const { member } = payload.params;\n return toExternalJSON(member);\n }\n }\n ]\n ]);\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 componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return chat;\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 fork5, put as put5 } from \"@redux-saga/core/effects\";\nfunction* memberPositionLayoutChangedWorker(options) {\n const {\n action,\n memberList,\n channels: { pubSubChannel }\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 put5(pubSubChannel, {\n type: \"video.member.updated\",\n payload\n });\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 put5(pubSubChannel, {\n type: \"video.member.updated\",\n payload: updatedMemberEventParams\n });\n }\n }\n}\nfunction* memberUpdatedWorker({\n action,\n channels,\n memberList\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 put5(channels.pubSubChannel, {\n type,\n payload: memberUpdatedPayload\n });\n }\n yield put5(channels.pubSubChannel, {\n type: action.type,\n payload: memberUpdatedPayload\n });\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}) {\n if (!initialState) {\n return;\n }\n const { swEventChannel } = channels;\n let memberList = initializeMemberList(initialState);\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 && findNamespaceInPayload(action2) === instance._eventsNamespace;\n });\n switch (action.type) {\n case \"video.member.updated\": {\n yield fork5(memberUpdatedWorker, {\n action,\n channels,\n memberList,\n instance\n });\n break;\n }\n case \"video.member.joined\": {\n const member = action.payload.member;\n memberList.set(member.id, 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 fork5(memberPositionLayoutChangedWorker, {\n action,\n channels,\n memberList,\n instance\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/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 EventEmitter2 as EventEmitter,\n GLOBAL_VIDEO_EVENTS,\n HttpError,\n INTERNAL_MEMBER_UPDATABLE_PROPS,\n INTERNAL_MEMBER_UPDATED_EVENTS,\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 VertoAnswer,\n VertoAttach,\n VertoBye,\n VertoInfo,\n VertoInvite,\n VertoModify,\n VertoPong,\n VertoResult,\n actions_exports as actions,\n componentActions,\n componentReducer,\n componentSelectors_exports as componentSelectors,\n configureStore2 as configureStore,\n connect,\n extendComponent,\n findNamespaceInPayload,\n getEventEmitter,\n getLogger,\n initialComponentState,\n isGlobalEvent,\n makeRPCRequest,\n makeRPCResponse,\n sagaEffects,\n sagaHelpers_exports as sagaHelpers,\n selectors,\n serializeableProxy,\n setLogger,\n timeoutPromise,\n toExternalJSON,\n toInternalEventName,\n toLocalEvent,\n toSnakeCaseKeys,\n toSyntheticEvent,\n v4 as uuid,\n validateEventsToSubscribe\n};\n//# sourceMappingURL=index.esm.js.map\n","import { getLogger, timeoutPromise } from '@signalwire/core';\nconst GUM_TIMEOUT = 5000;\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 whether the current environment supports `getUserMedia`.\n */\nexport const supportsGetUserMedia = () => {\n var _a;\n return typeof ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) === 'function';\n};\n/**\n * Returns whether the current environment supports `getDisplayMedia`.\n */\nexport const supportsGetDisplayMedia = () => {\n var _a;\n return typeof ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getDisplayMedia) === 'function';\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 * 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 exception = new Error(\"Looks like it's not possible to read from your devices\");\n return await timeoutPromise(promise, GUM_TIMEOUT, exception);\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/**\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/**\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/**\n * Returns a dictionary whose fields specify the constrainable properties the user agent understands.\n *\n * @example\n * ```typescript\n * SignalWire.WebRTC.getSupportedConstraints()\n * // {\n * // \"aspectRatio\": true,\n * // \"autoGainControl\": true,\n * // \"brightness\": true,\n * // \"channelCount\": true,\n * // \"colorTemperature\": true,\n * // ...\n * // }\n * ```\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//# sourceMappingURL=webrtcHelpers.js.map","import { getLogger, EventEmitter } from '@signalwire/core';\nimport * as WebRTC from './webrtcHelpers';\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};\nconst _getMediaDeviceKindByName = (name) => {\n if (!name) {\n return undefined;\n }\n return PERMISSIONS_MAPPING[name];\n};\n/**\n * For browsers not supporting the Permissions API\n * @param {string} kind\n * @returns\n */\nconst _legacyCheckPermissions = async (kind) => {\n const devices = await WebRTC.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');\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 WebRTC.getUserMedia(constraints);\n }\n const devices = await WebRTC.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 WebRTC.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');\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 WebRTC.getUserMedia(constraints);\n WebRTC.stopStream(stream);\n }\n catch (error) {\n throw error;\n }\n};\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 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: WebRTC.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/**\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 WebRTC.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 WebRTC.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 WebRTC.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};\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 WebRTC.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//# sourceMappingURL=deviceHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport * as WebRTC from './webrtcHelpers';\nimport { assureDeviceId } from './deviceHelpers';\nexport const getUserMedia = (constraints) => {\n getLogger().info('RTCService.getUserMedia', constraints);\n const { audio, video } = constraints;\n if (!audio && !video) {\n return;\n }\n return WebRTC.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","const _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//# sourceMappingURL=sdpHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport { getUserMedia, getMediaConstraints } from './utils/helpers';\nimport { sdpStereoHack, sdpBitrateHack, sdpMediaOrderHack, } from './utils/sdpHelpers';\nimport { sdpToJsonHack, RTCPeerConnection, streamIsValid, stopTrack, } from './utils/webrtcHelpers';\nexport default class RTCPeer {\n constructor(call, type) {\n this.call = call;\n this.type = type;\n this._negotiating = false;\n this.options = call.options;\n this.logger.debug('New Peer with type:', this.type, 'Options:', this.options);\n this._onIce = this._onIce.bind(this);\n }\n get logger() {\n return getLogger();\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 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 stopTrackSender(kind) {\n var _a, _b;\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 (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.localStream) === null || _b === void 0 ? void 0 : _b.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, _b;\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 (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.localStream) === null || _b === void 0 ? void 0 : _b.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 const config = this.instance.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.instance.setConfiguration(newConfig);\n // @ts-ignore\n this.instance.restartIce();\n }\n catch (error) {\n this.logger.error('RTCPeer restartIce error', error);\n }\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).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 offer = await this.instance.createOffer({\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 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 }\n catch (error) {\n this.logger.error(`Error creating ${this.type}:`, error);\n }\n }\n async onRemoteSdp(sdp) {\n try {\n const type = this.isOffer ? 'answer' : 'offer';\n await this._setRemoteDescription({ sdp, type });\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 }\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.options.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 const { localStream = null } = this.options;\n if (localStream && streamIsValid(localStream)) {\n const audioTracks = localStream.getAudioTracks();\n this.logger.debug('Local audio tracks: ', audioTracks);\n const videoTracks = localStream.getVideoTracks();\n this.logger.debug('Local video tracks: ', videoTracks);\n // FIXME: 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 // Use addTransceiver\n audioTracks.forEach((track) => {\n this.instance.addTransceiver(track, {\n direction: 'sendrecv',\n streams: [localStream],\n });\n });\n const transceiverParams = {\n direction: 'sendrecv',\n streams: [localStream],\n };\n if (this.isSimulcast) {\n const rids = ['0', '1', '2'];\n transceiverParams.sendEncodings = rids.map((rid) => ({\n active: true,\n rid: rid,\n scaleResolutionDownBy: Number(rid) * 6 || 1.0,\n }));\n }\n this.logger.debug('Applying video transceiverParams', transceiverParams);\n videoTracks.forEach((track) => {\n this.instance.addTransceiver(track, transceiverParams);\n });\n if (this.isSfu) {\n const { msStreamsNumber = 5 } = this.options;\n this.logger.debug('Add ', msStreamsNumber, 'recvonly MS Streams');\n transceiverParams.direction = 'recvonly';\n for (let i = 0; i < Number(msStreamsNumber); i++) {\n this.instance.addTransceiver('video', transceiverParams);\n }\n }\n }\n else if (typeof this.instance.addTrack === 'function') {\n // Use addTrack\n audioTracks.forEach((track) => {\n this.instance.addTrack(track, localStream);\n });\n videoTracks.forEach((track) => {\n this.instance.addTrack(track, localStream);\n });\n }\n else {\n // Fallback to legacy addStream ..\n // @ts-ignore\n this.instance.addStream(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 else {\n this.startNegotiation();\n }\n });\n }\n _checkMediaToNegotiate(kind) {\n // addTransceiver of 'kind' if not present\n const sender = this._getSenderByKind(kind);\n if (!sender && this.instance.addTransceiver) {\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 this._iceTimeout = null;\n if (!this.instance.localDescription) {\n return;\n }\n const { sdp, type } = 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 this.logger.debug('LOCAL SDP \\n', `Type: ${type}`, '\\n\\n', sdp);\n this.instance.removeEventListener('icecandidate', this._onIce);\n try {\n await this.call.onLocalSDPReady(this.instance.localDescription);\n }\n catch (error) {\n this._rejectStartMethod(error);\n }\n }\n _onIce(event) {\n if (!this._iceTimeout) {\n this._iceTimeout = setTimeout(() => this._sdpReady(), this.options.iceGatheringTimeout);\n }\n if (event.candidate) {\n this.logger.debug('IceCandidate:', event.candidate);\n // @ts-expect-error\n this.call.emit('icecandidate', event);\n }\n else {\n this._sdpReady();\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('LOCAL SDP \\n', `Type: ${localDescription.type}`, '\\n\\n', localDescription.sdp);\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 break;\n case 'have-local-offer': {\n if (this.instance.iceGatheringState === 'complete') {\n this._sdpReady();\n }\n break;\n }\n case 'closed':\n // @ts-ignore\n delete this.instance;\n break;\n default:\n this._negotiating = true;\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.options.remoteStream = event.streams[0];\n });\n // @ts-ignore\n this.instance.addEventListener('addstream', (event) => {\n if (event.stream) {\n this.options.remoteStream = event.stream;\n }\n });\n }\n}\n//# sourceMappingURL=RTCPeer.js.map","import { VertoBye, VertoInfo, VertoInvite, BaseComponent, selectors, VertoModify, componentSelectors, } from '@signalwire/core';\nimport RTCPeer from './RTCPeer';\nimport { stopStream, stopTrack, getUserMedia } from './utils/webrtcHelpers';\nconst DEFAULT_CALL_OPTIONS = {\n destinationNumber: 'room',\n remoteCallerName: 'Outbound Call',\n remoteCallerNumber: '',\n callerName: '',\n callerNumber: '',\n audio: true,\n video: { aspectRatio: 16 / 9 },\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};\nexport class BaseConnection extends BaseComponent {\n constructor(options) {\n super(options);\n /** @internal */\n this.gotEarly = false;\n /** @internal */\n this.doReinvite = false;\n /** @internal */\n this._eventsPrefix = 'video';\n this.state = 'new';\n this.prevState = 'new';\n this.options = Object.assign(Object.assign({}, DEFAULT_CALL_OPTIONS), options);\n this.setState('new');\n this.logger.debug('New Call with Options:', this.options);\n this.applyEmitterTransforms({ local: true });\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 localStream() {\n return this.options.localStream;\n }\n get remoteStream() {\n return this.options.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.id)) ||\n {});\n }\n get nodeId() {\n var _a, _b;\n // This is only set during `hangup` when\n // `redirectDestination` is present\n if (this._nodeId) {\n return this._nodeId;\n }\n // @ts-expect-error\n return (_b = (_a = this.component) === null || _a === void 0 ? void 0 : _a.nodeId) !== null && _b !== void 0 ? _b : '';\n }\n set nodeId(id) {\n this._nodeId = id;\n }\n /** @internal */\n get messagePayload() {\n const { destinationNumber, attach, callerName, callerNumber, remoteCallerName, remoteCallerNumber, userVariables, screenShare, additionalDevice, pingSupported = true, } = this.options;\n return {\n sessid: this.options.sessionid,\n dialogParams: {\n id: this.__uuid,\n destinationNumber,\n attach,\n callerName,\n callerNumber,\n remoteCallerName,\n remoteCallerNumber,\n userVariables,\n screenShare,\n additionalDevice,\n pingSupported,\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 // TODO: use peer to check audio tracks\n return this.remoteStream\n ? this.remoteStream.getAudioTracks().length > 0\n : false;\n }\n /** @internal */\n get withVideo() {\n // TODO: use peer to check video tracks\n return this.remoteStream\n ? this.remoteStream.getVideoTracks().length > 0\n : false;\n }\n get localVideoTrack() {\n return this.peer.localVideoTrack;\n }\n get localAudioTrack() {\n return this.peer.localAudioTrack;\n }\n /**\n * @internal\n * Verto messages have to be wrapped into an execute\n * request and sent using the 'video.message' method.\n */\n vertoExecute(vertoMessage) {\n const params = {\n message: vertoMessage,\n node_id: this.nodeId,\n };\n if (vertoMessage.method === 'verto.invite') {\n if (this.options.screenShare) {\n /** Only being used for debugging purposes */\n params.subscribe = ['video.room.screenshare'];\n }\n else if (this.options.additionalDevice) {\n /** Only being used for debugging purposes */\n params.subscribe = ['video.room.additionaldevice'];\n }\n else {\n params.subscribe = this.getSubscriptions();\n }\n }\n else {\n // nodeId is required for all the requests (except for verto.invite)\n if (!this.nodeId) {\n this.logger.warn(`Skip Request. Missing nodeId for '${vertoMessage.method}'.`);\n return;\n }\n }\n return this.execute({\n method: 'video.message',\n params,\n });\n }\n /** @internal */\n onStateChange(component) {\n this.logger.debug('onStateChange', component);\n switch (component.state) {\n case 'hangup':\n this._hangup(component);\n break;\n default:\n this.setState(component.state);\n break;\n }\n }\n /** @internal */\n onRemoteSDP(component) {\n this.logger.debug('onRemoteSDP', component);\n if (component.remoteSDP) {\n this.peer.onRemoteSdp(component.remoteSDP);\n }\n }\n /** @internal */\n onRoomSubscribed(component) {\n this.logger.debug('onRoomSubscribed', component);\n /**\n * For screenShare/additionalDevice we're using\n * the `memberId` to namespace the object.\n **/\n if (this.options.additionalDevice || this.options.screenShare) {\n this._attachListeners(this.memberId);\n }\n else {\n this._attachListeners(this.roomSessionId);\n }\n // FIXME: Move to a better place when rework _attachListeners too.\n this.applyEmitterTransforms();\n }\n /** @internal */\n onVideoConstraints(component) {\n this.logger.debug('onVideoConstraints', component);\n if (component === null || component === void 0 ? void 0 : component.videoConstraints) {\n this.peer.applyMediaConstraints('video', component.videoConstraints);\n }\n }\n /** @internal */\n onAudioConstraints(component) {\n this.logger.debug('onAudioConstraints', component);\n if (component === null || component === void 0 ? void 0 : component.audioConstraints) {\n this.peer.applyMediaConstraints('audio', component.audioConstraints);\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;\n try {\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;\n }\n let newStream;\n try {\n newStream = await getUserMedia(constraints);\n }\n catch (error) {\n /**\n * In Firefox you cannot open more than one\n * microphone at a time, per process. When this\n * happens we'll try to do the following:\n * 1. Stop the current audio track\n * 2. Try to get another audio track with the new\n * constraints\n * 3. If we get an error: restore the media tracks\n * using the previous constraints.\n * @see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1238038\n */\n if (error instanceof DOMException &&\n error.message === 'Concurrent mic process limit.') {\n let oldConstraints = {};\n (_a = this.options.localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => {\n var _a;\n /**\n * We'll keep a reference of the original\n * constraints so if something fails we should\n * 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 to retrieve new ones');\n stopTrack(track);\n (_a = this.options.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n try {\n return resolve(this.updateConstraints(constraints, {\n attempt: attempt + 1,\n }));\n }\n catch (error) {\n this.logger.error('Restoring previous constraints');\n return resolve(this.updateConstraints(oldConstraints, {\n attempt: attempt + 1,\n }));\n }\n }\n this.logger.error('updateConstraints', error);\n return reject(error);\n }\n this.logger.debug('updateConstraints got stream', newStream);\n if (!this.options.localStream) {\n this.options.localStream = new MediaStream();\n }\n const { instance } = this.peer;\n const tracks = newStream.getTracks();\n this.logger.debug(`updateConstraints got ${tracks.length} tracks`);\n for (let i = 0; i < tracks.length; i++) {\n const newTrack = tracks[i];\n this.logger.debug('updateConstraints 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('updateConstraints got transceiver', transceiver.currentDirection, transceiver.mid);\n await transceiver.sender.replaceTrack(newTrack);\n this.logger.debug('updateConstraints replaceTrack');\n transceiver.direction = 'sendrecv';\n this.logger.debug('updateConstraints set to sendrecv');\n this.options.localStream.getTracks().forEach((track) => {\n var _a;\n if (track.kind === newTrack.kind && track.id !== newTrack.id) {\n this.logger.debug('updateConstraints stop old track and apply new one - ');\n stopTrack(track);\n (_a = this.options.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n this.options.localStream.addTrack(newTrack);\n }\n else {\n this.logger.debug('updateConstraints no transceiver found. addTrack and start dancing!');\n this.peer.type = 'offer';\n this.doReinvite = true;\n this.options.localStream.addTrack(newTrack);\n instance.addTrack(newTrack, this.options.localStream);\n }\n this.logger.debug('updateConstraints simply update mic/cam');\n if (newTrack.kind === 'audio') {\n this.options.micId = newTrack.getSettings().deviceId;\n }\n else if (newTrack.kind === 'video') {\n this.options.camId = newTrack.getSettings().deviceId;\n }\n }\n this.logger.debug('updateConstraints done');\n resolve();\n }\n catch (error) {\n this.logger.error('updateConstraints', error);\n reject(error);\n }\n });\n }\n /** @internal */\n invite() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'outbound';\n this.peer = new RTCPeer(this, '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 this.peer = new RTCPeer(this, 'answer');\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(localDescription) {\n var _a;\n const { type, sdp } = localDescription;\n const mungedSDP = this._mungeSDP(sdp);\n this.logger.debug('MUNGED SDP \\n', `Type: ${type}`, '\\n\\n', mungedSDP);\n switch (type) {\n case 'offer':\n // If we have a remoteDescription already, send reinvite\n if ((_a = this.peer.instance) === null || _a === void 0 ? void 0 : _a.remoteDescription) {\n return this.executeUpdateMedia(mungedSDP);\n }\n else {\n return this.executeInvite(mungedSDP);\n }\n case 'answer':\n this.logger.warn('Unhandled verto.answer');\n // this.executeAnswer()\n break;\n default:\n return this.logger.error(`Unknown SDP type: '${type}' on call ${this.id}`);\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 redirect to a different node so need to send\n * again the offer with a different nodeId.\n *\n * @internal\n */\n async executeInvite(sdp) {\n const validStates = ['new', 'requesting'];\n if (!validStates.includes(this.state)) {\n /**\n * Something bad happened. Either App logic invoking\n * methods in a wrong order or events are not correct.\n */\n throw new Error(`Invalid state: '${this.state}' for connection id: ${this.id}`);\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 msg = VertoInvite(Object.assign(Object.assign(Object.assign({}, this.messagePayload), ssOpts), { sdp }));\n const response = await this.vertoExecute(msg);\n this.logger.debug('Invite response', response);\n }\n catch (error) {\n this.setState('hangup');\n throw error.jsonrpc;\n }\n }\n /** @internal */\n async executeUpdateMedia(sdp) {\n try {\n const msg = VertoModify(Object.assign(Object.assign({}, this.messagePayload), { sdp, action: 'updateMedia' }));\n const response = await this.vertoExecute(msg);\n if (!response.sdp) {\n this.logger.error('UpdateMedia invalid SDP answer', response);\n }\n this.logger.debug('UpdateMedia response', response);\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.jsonrpc;\n }\n }\n async hangup() {\n try {\n const bye = VertoBye(this.messagePayload);\n await this.vertoExecute(bye);\n }\n catch (error) {\n this.logger.error('Hangup error:', error);\n }\n finally {\n this._hangup();\n }\n }\n /** @internal */\n dtmf(dtmf) {\n const msg = VertoInfo(Object.assign(Object.assign({}, this.messagePayload), { dtmf }));\n this.vertoExecute(msg);\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.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`);\n // @ts-expect-error\n this.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.options = Object.assign(Object.assign({}, this.options), options);\n }\n /** @internal */\n _hangup(params = {}) {\n const { byeCause = 'NORMAL_CLEARING', byeCauseCode = '16', redirectDestination, } = params;\n this.cause = byeCause;\n this.causeCode = byeCauseCode;\n if (redirectDestination && this.peer.localSdp) {\n this.logger.debug('Redirect Destination to:', redirectDestination);\n this.nodeId = redirectDestination;\n return this.executeInvite(this.peer.localSdp);\n }\n return this.setState('hangup');\n }\n /**\n * Allow to define logic to munge the SDP\n *\n * @internal\n * */\n _mungeSDP(sdp) {\n return sdp;\n }\n /** @internal */\n _finalize() {\n if (this.peer && this.peer.instance) {\n this.peer.instance.close();\n // @ts-ignore\n delete this.peer;\n }\n const { remoteStream, localStream } = this.options;\n stopStream(remoteStream);\n stopStream(localStream);\n this.destroy();\n }\n}\n//# sourceMappingURL=BaseConnection.js.map","import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\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}\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.style.width = '100%'\n localVideo.style.height = '100%'\n\n myLayer.appendChild(localVideo)\n\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n const exists = mcuLayers?.querySelector(`#${myLayer.id}`)\n if (mcuLayers && !exists) {\n mcuLayers.appendChild(myLayer)\n localOverlay.domElement = myLayer\n }\n\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 = localStream.getVideoTracks().length > 0\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\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n addSDKPrefix,\n}\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} 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} 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 return addSDKPrefix(room.memberId)\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 }\n\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n localOverlay,\n })\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed')\n if (room.peer.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n // @ts-expect-error\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n }\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.once('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\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 // Remove listener when done with video\n room.off('track', trackHandler)\n break\n }\n }\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 = new Audio()\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 // Remove listener when done with audio\n room.off('track', trackHandler)\n break\n }\n }\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 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 const handleVideoTrack = async (track: MediaStreamTrack) => {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\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.style.paddingBottom = '56.25%'\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.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.display = 'flex'\n rootElement.style.alignItems = 'center'\n rootElement.style.justifyContent = 'center'\n rootElement.appendChild(relativeWrapper)\n\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element })\n }\n layersWrapper.style.display = 'block'\n }\n\n handleVideoTrack(track).catch((error) => {\n getLogger().error('Handle video track error', error)\n })\n\n // TODO: take destroy\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","export const ROOM_COMPONENT_LISTENERS = {\n state: 'onStateChange',\n remoteSDP: 'onRemoteSDP',\n roomId: 'onRoomSubscribed',\n videoConstraints: 'onVideoConstraints',\n audioConstraints: 'onAudioConstraints',\n errors: 'onError',\n responses: 'onSuccess',\n}\n\nexport 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} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<BaseConnectionStateEventTypes> {\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} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<BaseConnectionStateEventTypes> {\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 PubSubChannel,\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 = 'video.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 = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {\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(INTERNAL_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 // @ts-expect-error\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 pubSubChannel,\n}: {\n pubSubChannel: PubSubChannel\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 // TODO: add typings\n yield sagaEffects.put(pubSubChannel, {\n type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,\n payload: memberListPayload as any,\n })\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n pubSubChannel,\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: { pubSubChannel },\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 pubSubChannel,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n","import {\n SagaIterator,\n SDKWorker,\n MemberPosition,\n sagaEffects,\n} from '@signalwire/core'\n\nexport const memberPositionWorker: SDKWorker<any> =\n function* memberPositionWorker(options): SagaIterator {\n if (!options.initialState) {\n throw new Error('[memberPositionWorker] Missing initialState')\n }\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, options)\n }\n","import {\n connect,\n Rooms,\n EventTransform,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n toLocalEvent,\n toExternalJSON,\n VideoRoomEventParams,\n MemberPosition,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport {\n getDisplayMedia,\n BaseConnection,\n BaseConnectionOptions,\n BaseConnectionStateEventTypes,\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 RoomSessionJoinAudienceParams,\n} from './utils/interfaces'\nimport {\n ROOM_COMPONENT_LISTENERS,\n SCREENSHARE_AUDIO_CONSTRAINTS,\n} from './utils/constants'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare,\n} from './RoomSessionScreenShare'\nimport {\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDevice,\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(): Promise<T>\n /** @internal */\n joinAudience(options?: RoomSessionJoinAudienceParams): Promise<T>\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\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n /** @internal */\n protected getEmitterTransforms() {\n return new Map<string | string[], EventTransform>([\n [\n ['video.room.joined'],\n {\n type: 'roomSession',\n instanceFactory: () => {\n return {}\n },\n payloadTransform: (payload: VideoRoomSubscribedEventParams) => {\n return payload\n },\n nestedFieldsToProcess: {\n recordings: {\n eventTransformType: 'roomSessionRecording',\n processInstancePayload: (payload) => ({ recording: payload }),\n },\n playbacks: {\n eventTransformType: 'roomSessionPlayback',\n processInstancePayload: (payload) => ({ member: payload }),\n },\n },\n },\n ],\n [\n [\n toLocalEvent('video.recording.start'),\n 'video.recording.started',\n 'video.recording.updated',\n 'video.recording.ended',\n ],\n {\n type: 'roomSessionRecording',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionRecordingObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.recording,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n [\n [\n toLocalEvent('video.playback.start'),\n 'video.playback.started',\n 'video.playback.updated',\n 'video.playback.ended',\n ],\n {\n type: 'roomSessionPlayback',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.playback,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n ])\n }\n\n /** @internal */\n protected override getCompoundEvents() {\n return new Map<any, any>([\n ...MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS,\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 /**\n * This method will be called right after\n * `room.subscribed` happened\n * @internal\n */\n protected attachOnSubscribedWorkers(payload: VideoRoomEventParams) {\n this.runWorker('memberPositionWorker', {\n worker: workers.memberPositionWorker,\n initialState: payload,\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 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<RoomSessionObjectEvents> = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n BaseConnectionStateEventTypes,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\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.on('destroy', () => {\n this._screenShareList.delete(screenShare)\n })\n\n try {\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n await screenShare.join()\n }\n return screenShare\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n throw error\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 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<RoomSessionObjectEvents> = {\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.__uuid,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n BaseConnectionStateEventTypes,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n roomDevice.on('destroy', () => {\n this._deviceList.delete(roomDevice)\n })\n\n try {\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n await roomDevice.join()\n }\n return roomDevice\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n throw error\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 return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n /** @internal */\n async hangup() {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup()\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\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 setMeta: Rooms.setMeta,\n setMemberMeta: Rooms.setMemberMeta,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions<RoomSessionObjectEventsHandlerMapping>\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 componentListeners: ROOM_COMPONENT_LISTENERS,\n })(params)\n\n return room\n}\n","import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n} from '@signalwire/core'\nimport type { VideoManager } from './VideoManager'\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const { channels } = options\n const { swEventChannel, pubSubChannel } = channels\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.put(pubSubChannel, action)\n }\n}\n","import {\n BaseComponentOptions,\n BaseConsumer,\n VideoManagerRoomEventNames,\n InternalVideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n EventTransform,\n toExternalJSON,\n VideoManagerRoomEntity,\n VideoManagerRoomsSubscribedEventParams,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\ntype EmitterTransformsEvents = InternalVideoManagerRoomEventNames\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 protected _eventsPrefix = 'video-manager' as const\n\n constructor(options: BaseComponentOptions<VideoManagerEvents>) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n getEmitterTransforms() {\n return new Map<\n EmitterTransformsEvents | EmitterTransformsEvents[],\n EventTransform\n >([\n [\n ['video-manager.rooms.subscribed'],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n payloadTransform: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n },\n ],\n [\n [\n 'video-manager.room.started',\n 'video-manager.room.added',\n 'video-manager.room.updated',\n 'video-manager.room.ended',\n 'video-manager.room.deleted',\n ],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: (payload) => toExternalJSON(payload),\n payloadTransform: (payload) => toExternalJSON(payload),\n },\n ],\n ])\n }\n}\n\nexport const createVideoManagerObject = (\n params: BaseComponentOptions<VideoManagerEvents>\n) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\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 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}\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 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 // @ts-expect-error\n emitter: this.emitter,\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 // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\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 // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n // @ts-expect-error\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 { BaseJWTSession, getLogger, SessionOptions } from '@signalwire/core'\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public agent = process.env.SDK_PKG_AGENT!\n\n constructor(public options: SessionOptions) {\n let decodedJwt\n try {\n decodedJwt = jwtDecode<{ ch?: string }>(options.token, { header: true })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n }\n\n get allowHijack() {\n // @ts-expect-error\n return this.options._hijack\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowHijack) {\n return ''\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info('Hijacking: search protocol for', roomName)\n return window.sessionStorage.getItem(roomName) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowHijack) {\n return\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info(\n 'Hijacking: persist protocol',\n roomName,\n this.relayProtocol\n )\n window.sessionStorage.setItem(roomName, this.relayProtocol)\n }\n }\n\n private getRoomNameFromJWT() {\n try {\n const jwtPayload = jwtDecode<{ r: string }>(this.options.token)\n return jwtPayload?.r\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[getRoomNameFromJWT] error decoding the JWT')\n }\n return ''\n }\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 componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(baseUserOptions)\n\n return client\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\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\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 return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\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 'subscribe',\n 'publish',\n 'updateToken',\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 return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\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 { 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 // @ts-expect-error\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 Authorization,\n} from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport {\n getJoinAudienceMediaParams,\n isValidJoinAudienceMediaParams,\n} from './utils/roomSession'\nimport type { MakeRoomOptions } from './Client'\nimport type { RoomSessionJoinAudienceParams } from './utils/interfaces'\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n}\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 'setMeta',\n 'setMemberMeta',\n]\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()\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\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 stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n // @ts-expect-error\n room.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\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 joinAudience = (params?: RoomSessionJoinAudienceParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n const session = await client.connect()\n\n // @ts-expect-error\n const authState: Authorization = session._sessionAuthState\n const mediaOptions = getJoinAudienceMediaParams({\n authState,\n ...params,\n })\n\n if (!isValidJoinAudienceMediaParams(mediaOptions)) {\n await session.disconnect()\n return reject(\n new Error(\n '[joinAudience] Either (or both) `audio` and `video` must be `true` when calling this method.'\n )\n )\n }\n\n // @ts-expect-error\n room.updateMediaOptions(mediaOptions)\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession JoinAudience', 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 joinAudience,\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 { Authorization, MediaDirectionAllowed } from '@signalwire/core'\nimport type { RoomSessionJoinAudienceParams } from './interfaces'\n\n// `joinAudience` utils\nconst getJoinAudienceMediaParams = ({\n authState,\n receiveAudio = true,\n receiveVideo = true,\n}: RoomSessionJoinAudienceParams & {\n authState: Authorization\n}) => {\n const getMediaValue = ({\n remote,\n local,\n kind,\n }: {\n remote: MediaDirectionAllowed\n local: boolean\n kind: 'audio' | 'video'\n }) => {\n const remoteAllowed = remote !== 'none'\n if (!remoteAllowed && local) {\n getLogger().warn(\n `[joinAudience] ${kind} is currently not allowed on this room.`\n )\n }\n\n return !!(remoteAllowed && local)\n }\n\n return {\n audio: false,\n video: false,\n negotiateAudio: getMediaValue({\n remote: authState.audio_allowed,\n local: receiveAudio,\n kind: 'audio',\n }),\n negotiateVideo: getMediaValue({\n remote: authState.video_allowed,\n local: receiveVideo,\n kind: 'video',\n }),\n }\n}\n\nconst isValidJoinAudienceMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport { getJoinAudienceMediaParams, isValidJoinAudienceMediaParams }\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"],"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","realMethod","undefined","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","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","msCrypto","Error","REGEX","validate","uuid","byteToHex","push","toString","substr","stringify","arr","offset","toLowerCase","v35","version","hashfunc","generateUUID","value","namespace","buf","str","unescape","bytes","charCodeAt","stringToBytes","v","parseInt","parse","set","err","DNS","URL","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","a","b","s","t","num","cnt","md5ff","c","d","md5gg","md5hh","md5ii","v4","options","rnds","random","f","z","ROTL","n","_defineProperty","key","Object","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread2","target","source","forEach","getOwnPropertyDescriptors","defineProperties","formatProdErrorMessage","code","msg","input","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","K","H","Array","isArray","N","Math","ceil","M","_i","j","pow","floor","_i2","W","_t","_t2","T","$$observable","Symbol","observable","randomString","substring","split","join","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","isPlainObject","proto","getPrototypeOf","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","subscribe","listener","isSubscribed","index","splice","dispatch","action","type","listeners","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","next","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","state","hasChanged","nextState","_key","previousStateForKey","nextStateForKey","bindActionCreator","actionCreator","compose","_len","funcs","arg","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","iterator","it","throw","pattern","pat","symbol","every","channel","ch","take","close","Boolean","constructor","delayP","ms","val","timeoutId","Promise","resolve","setTimeout","clearTimeout","kTrue","konst","identity","assignWithSymbols","remove","item","once","fn","called","kThrow","kReturn","done","makeIterator","thro","meta","return","isSagaIterator","logError","error","sagaStack","createEmptyArray","wrapSagaDispatch","shouldTerminate","res","shouldCancel","shouldComplete","createAllStyleChildCallbacks","shape","parentCallback","completed","totalCount","completedCount","results","childCallbacks","chCbAtKey","isErr","cancel","getMetaInfo","getLocation","instrumented","zeroBuffer","isEmpty","put","TAKE","CALL","FORK","SELECT","makeEffect","payload","combinator","detach","eff","detached","patternOrChannel","multicastPattern","channel$1","getFnCallDescriptor","fnDescriptor","args","context","fork","_len3","_key3","select","selector","_len5","_key5","delay","queue","semaphore","task","suspend","release","asap","flush","immediately","shift","patterns","some","matcher","predicate","_predicate","String","wildcard","matcherCreator","string$1","array$1","stringableFunc","symbol$1","END","isEnd","buffer$1","limit","overflowAction","pushIndex","popIndex","items","doubledLimit","ringBuffer","initialSize","closed","takers","cb","taker","multicastChannel","currentTakers","nextTakers","ensureCanMutateNextTakers","stdChannel","chan","resolvePromise","cancelPromise","_effectRunnerMap","current","nextSagaId","cancelSingleTask","taskToCancel","isRunning","effectRunnerMap","env","_ref3","_ref3$channel","maybe","takeCb","result","effects","_ref11","digestEffect","effectId","_ref12","response","childCbs","_ref4","_ref5","proc","_ref6","cpsCb","concat","_ref7","_ref8","parent","taskIterator","resolved","createTaskIterator","getIteratorMetaInfo","child","addTask","isAborted","abort","taskOrTasks","_ref9","joinSingleTask","taskToJoin","joiner","joiners","_ref10","_ref13","_ref14","buffer","match","data","_ref15","isCancelled","prop","_ref16","props","_ref17","formatLocation","fileName","lineNumber","sagaLocationAsString","sagaMeta","cancelledTasksAsString","cancelledTasks","crashedEffect","addSagaFrame","frame","clear","firstSaga","otherSagas","crashedEffectLocation","iterator$1","parentContext","parentEffectId","isRoot","cont","finalRunEffect","finalizeRunEffect","effect","currCb","effectRunner","executingContext","mainTask","status","_task","taskResult","taskError","deferredEnd","cancelledDueToErrorTasks","create","onAbort","tasks","getTasks","cancelAll","forkQueue","end","onError","reject","id","setContext","toPromise","def","newTask","label","effectSettled","sagaMonitor","effectRejected","effectResolved","setCrashedEffect","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","INTERNAL_GLOBAL_VIDEO_EVENTS","datetime","Date","toISOString","replace","originalFactory","logLevel","rawMethod","messages","userLogger","defaultLoggerLevel","debugOptions","getLoggerInstance","wsTraffic","logWsTraffic","shouldStringify","JSON","info","Proxy","receiver","Reflect","parseResponse","nodeId","node_id","nestedResult","jsonrpc","DEFAULT_OPTIONS","propsToUpdateValue","toExternalJSON","__sw_symbol","__sw_proxy","entries","fromSnakeToCamelCase","includes","endsWith","isTimestampProperty","timestamp","date","isNaN","getTime","toDateObject","part","fc","trim","remainingChars","UPPERCASE_REGEX","toInternalEventName","letter","fromCamelToSnakeCase","getNamespacedEvent","startsWith","extendComponent","klass","methods","proxyFactory","instance","transform","transformedPayload","proxiedObj","_eventsNamespace","getInstanceEventNamespace","eventChannel","getInstanceEventChannel","objTarget","shouldContinue","k","getAllMethods","serializeableProxy","property","proxyToString","_instanceByTransformType","Map","PROTOCOL_PATTERN","timeoutPromise","time","exception","timer","race","_resolve","finally","isSessionEvent","WITH_CUSTOM_EVENT_NAMES","CLIENT_SIDE_EVENT_NAMES","validateEventsToSubscribe","valid","internalEvent","eventParts","cleanupEventNamespace","isSyntheticEvent","find","withCustomName","Set","isLocalEvent","toLocalEvent","makeRPCRequest","params","_a","makeRPCResponse","DEFAULT_CONNECT_VERSION","major","minor","revision","RPCConnect","tmpMap","destinationNumber","remoteCallerName","remoteCallerNumber","callerName","callerNumber","filterVertoParams","dialogParams","buildVertoRPCMessage","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoPong","VertoResult","actions_exports","authErrorAction","authExpiringAction","authSuccessAction","closeConnectionAction","compoundEventAttachAction","createAction","destroyAction","executeAction","getCustomSagaActionType","initAction","makeCustomSagaAction","reauthAction","sessionAuthErrorAction","sessionConnectedAction","sessionDisconnectedAction","sessionExpiringAction","sessionReconnectingAction","socketClosedAction","socketErrorAction","socketMessageAction","toolkit_exports","prepareAction","prepared","configureStore","redux_star","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","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","sessionSlice","protocol","iceServers","authStatus","authState","authError","authCount","connected","_b","authorization","ice_servers","sessionActions","sessionReducer","SW_SYMBOL","redux_exports","configureStore2","connect","createCatchableSaga","createRestartableSaga","requestUpdater","componentId","requestId","byId","componentSlice","upsert","executeSuccess","executeFailure","cleanup","ids","componentActions","componentReducer","initialExecuteQueueState","executeQueueSlice","add","clean","executeQueueActions","executeQueueReducer","rootReducer","components","session","executeQueue","_len4","_key4","spawn","defaultCatchHandler","errorHandler","sessionSelectors_exports","getAuthError","getAuthState","getAuthStatus","getIceServers","getSession","componentSelectors_exports","getComponent","getComponentsById","getComponentsToCleanup","toCleanup","responses","errors","executeActionWatcher","worker","message","RPCExecute","call2","execute","warn","sessionChannelWatcher","sessionChannel","pubSubChannel","swEventChannel","vertoWorker","component","callID","remoteSDP","sdp","byeCause","cause","byeCauseCode","causeCode","redirectDestination","disconnect","mediaParams","video","videoConstraints","audio","audioConstraints","videoAPIWorker","event_type","call_id","roomId","room_session","room_id","roomSessionId","memberId","member_id","previewUrl","preview_url","member","parent_id","room_session_id","suffix","talking","deprecatedSuffix","swEventWorker","broadcastParams","toInternalAction","isWebrtcEvent","isVideoEvent","sessionChannelWorkerCatchable","createSessionChannel","findNamespaceInPayload","isVideoMemberEvent","isVideoLayoutEvent","isVideoRecordingEvent","isVideoPlaybackEvent","isVideoRoomEvent","isChatEvent","isVoiceCallEvent","tag","pubSubSaga","pubSubAction","take2","getExecuteQueue","executeQueueWatcher","select2","put2","take3","fork2","flushExecuteQueueWorker","AuthError","super","setPrototypeOf","componentCleanupSagaWorker","select3","put3","componentCleanupSaga","fork3","initSessionSaga","SessionConstructor","userOptions","channels","call3","customTasks","workers","all","fork4","sessionStatusWatcher","compCleanupTask","take4","socketClosedWorker","put4","delay2","reauthenticateWorker","token","reauthenticate","startSaga","sessionAuthErrorSaga","pubSubTask","executeActionTask","rpcConnectResult","flushExecuteQueueTask","componentListeners","sessionListeners","Component","customSagas","componentKeys","sessionKeys","cacheMap","storeUnsubscribe","__uuid","reduxKey","cacheKey","updatedValue","fnName","taskList","destroyer","runSagaMiddleware","createSagaMiddleware","getDefaultMiddleware","setDebugOptions","rootSaga_default","SW_SYMBOL2","BaseComponent","WeakMap","_handleCompoundEvents","_getInternalEvent","compoundEvents","getCompoundEvents","compoundEvent","_trackEvent","_getNamespacedEvent","_getPrefixedEvent","_eventsPrefix","_destroyer","addEventToRegisterQueue","_eventsRegisterQueue","_addEventToEmitQueue","_eventsEmitQueue","shouldAddToQueue","runAndCacheEventHandlerTransform","mode","instanceFactory","_eventsTransformsCache","cleanupEventHandlerTransformCache","force","eventCount","destroy","delete","getEmitterListenersMapByInternalEventName","_emitterListenersCache","getAndRemoveStableEventHandler","cacheByEventName","handler","_createStableEventHandler","_emitterTransforms","cachedInstance","_proxyFactoryCache","_parseNestedFields","process2","nestedFieldsToProcess","payloadTransform","r","nestedTransform","transformToUse","eventTransformType","_getOrCreateInstance","instanceProxyFactory","processInstancePayload","getOrCreateStableEventHandler","_trackedEvents","_untrackEvent","_addListener","wrappedHandler","eventName","getSubscriptions","detachWorkers","transformParams","transformResolve","transformReject","_requests","triggerCustomSaga","dispatchId","_customSagaTriggers","settleCustomSagaTrigger","kind","selectorFn","onSuccess","getStateProperty","param","flushEventsRegisterQueue","flushEventsEmitQueue","flushEventsQueue","_attachListeners","getEmitterTransforms","_sessionAuthStatus","_sessionAuthState","_waitUntilSessionAuthorized","authStatus2","_setEmitterTransform","local","applyEmitterTransforms","handlersObj","runWorker","_workers","_setWorker","_attachWorker","_runningWorkers","BaseClient","BaseConsumer","shouldExecuteSubscribe","execParams","_latestExecuteParams","subscriptions","subscribeMethod","subscribeParams","event_channel","async","INTERNAL_MEMBER_UPDATABLE_PROPS","audio_muted","video_muted","deaf","on_hold","visible","input_volume","output_volume","input_sensitivity","MEMBER_UPDATABLE_PROPS","rooms_exports","RoomSessionPlaybackAPI","RoomSessionRecordingAPI","audioMuteMember","audioUnmuteMember","createRoomSessionPlaybackObject","createRoomSessionRecordingObject","deafMember","getLayouts","getMembers","getPlaybacks","getRecordings","hideVideoMuted","play","removeAllMembers","removeMember","setDeaf","setHideVideoMuted","setInputSensitivityMember","setInputVolumeMember","setLayout","setMemberMeta","setMemberPosition","setMeta","setOutputVolumeMember","setPositions","showVideoMuted","startRecording","undeafMember","videoMuteMember","videoUnmuteMember","baseCodeTransform","createRoomMethod","createRoomMemberMethod","rest","layouts","members","recordings","row","playbacks","pause","recording_id","resume","stop","playback_id","setVolume","volume","seek","timecode","position","abs","forward","rewind","chat_exports","BaseChatAPI","BaseChatConsumer","ChatMember","ChatMessage","createBaseChatObject","getMemberState","getMembers2","getMessages","publish","setMemberState","baseCodeTransform2","createChatMethod","createChatMemberMethod","cursor","transformParamChannels","list","toInternalChatChannels","pubSub_exports","BasePubSubConsumer","PubSubMessage","createBasePubSubObject","content","publishedAt","pubSubWorker","sagaEffects.take","action2","sagaEffects.put","toInternalPubSubChannels","restMessage","_getChannelsParam","_channels","_setSubscribeParams","_getSubscribeParams","_getUnsubscribeParams","channelsParam","updateToken","chatWorker","memberPosition_exports","memberPositionLayoutChangedWorker","memberList","processedMembers","layout","layers","layer","memberEventParams","current_position","mutateMemberCurrentPosition","currentPosition","put5","updatedMemberEventParams","memberUpdatedWorker","updated","memberUpdatedPayload","MEMBER_POSITION_COMPOUND_EVENTS","memberPositionWorker","initializeMemberList","fork5","selectors","supportsMediaDevices","mediaDevices","getMediaDevicesApi","getUserMedia","constraints","constraint","getSupportedConstraints","getDisplayMedia","enumerateDevices","enumerateDevicesByKind","filterByKind","devices","catch","_error","streamIsValid","stream","MediaStream","supportsMediaOutput","HTMLMediaElement","setMediaElementSinkId","el","deviceId","setSinkId","stopStream","getTracks","stopTrack","track","readyState","dispatchEvent","Event","PERMISSIONS_MAPPING","camera","microphone","speaker","_getMediaDeviceKindByName","checkPermissions","permissions","query","WebRTC.enumerateDevicesByKind","_legacyCheckPermissions","checkCameraPermissions","checkMicrophonePermissions","checkSpeakerPermissions","getDevicesWithPermissions","fullList","getDevices","_filterDevices","found","groupId","targets","checkDefault","excludeDefault","WebRTC.getUserMedia","WebRTC.stopStream","assureDeviceId","deviceLabel","_deviceInfoToMap","deviceInfo","TARGET_PERMISSIONS_MAP","DEFAULT_TARGETS","ALLOWED_TARGETS_MSG","CHECK_SUPPORT_MAP","WebRTC.supportsMediaOutput","createDeviceWatcher","permission","supported","unsupported","checkTargetPermissions","_","needPermissionsTarget","filteredTargets","unsupportedTargets","needPermissions","validateTargets","currentDevices","WebRTC.enumerateDevices","kinds","knownDevices","WebRTC.getMediaDevicesApi","addEventListener","oldDevices","newDevices","changes","removals","updates","additions","newDevice","oldDevice","removed","added","_getDeviceListDiff","hasAddedDevices","hasRemovedDevices","hasUpdatedDevices","isMediaStream","getMediaConstraints","micId","micLabel","newMicId","exact","camId","camLabel","newCamId","_isAudioLine","line","_isVideoLine","sdpStereoHack","sdpLines","opusIndex","findIndex","opusPayload","RegExp","_getCodecPayloadType","fmtpLineIndex","RTCPeer","_negotiating","_onIce","isOffer","isAnswer","isSimulcast","simulcast","isSfu","sfu","localVideoTrack","videoSender","_getSenderByKind","localAudioTrack","audioSender","hasAudioSender","hasVideoSender","hasAudioReceiver","_getReceiverByKind","hasVideoReceiver","config","rtcPeerConfig","bundlePolicy","sdpSemantics","localSdp","localDescription","stopTrackSender","sender","localStream","removeTrack","restoreTrackSender","newTrack","replaceTrack","addTrack","getDeviceId","getSettings","getTrackSettings","getDeviceLabel","restartIceWithRelayOnly","getConfiguration","iceTransportPolicy","newConfig","setConfiguration","restartIce","applyMediaConstraints","newConstraints","getConstraints","screenShare","applyConstraints","getSenders","getReceivers","startNegotiation","additionalDevice","getTransceivers","tr","direction","removeEventListener","offer","createOffer","voiceActivityDetection","_setLocalDescription","_setRemoteDescription","remoteSdp","answer","createAnswer","_sdpReady","onRemoteSdp","_resolveStartMethod","hangup","_rejectStartMethod","_setupRTCPeerConnection","RTCPeerConnection","start","_retrieveLocalStream","setState","audioTracks","getAudioTracks","videoTracks","getVideoTracks","addTransceiver","streams","transceiverParams","sendEncodings","rid","active","scaleResolutionDownBy","Number","msStreamsNumber","addStream","negotiateAudio","_checkMediaToNegotiate","negotiateVideo","transceiver","_iceTimeout","onLocalSDPReady","iceGatheringTimeout","candidate","useStereo","googleMaxBitrate","googleMinBitrate","googleStartBitrate","max","min","lines","sdpBitrateHack","setLocalDescription","remoteDescription","localOffer","endOfLine","offerLines","answerLines","answerAudioIndex","answerVideoIndex","audioLines","videoLines","sdpMediaOrderHack","sessionDescr","setRemoteDescription","signalingState","iceGatheringState","iceConnectionState","remoteStream","DEFAULT_CALL_OPTIONS","aspectRatio","attach","userVariables","requestTimeout","autoApplyMediaParams","BaseConnection","gotEarly","doReinvite","prevState","trying","componentSelectors","_nodeId","messagePayload","pingSupported","sessid","sessionid","cameraId","peer","cameraLabel","microphoneId","microphoneLabel","withAudio","withVideo","vertoExecute","vertoMessage","onStateChange","_hangup","onRemoteSDP","onRoomSubscribed","onVideoConstraints","onAudioConstraints","updateCamera","updateConstraints","updateMicrophone","manageSendersWithConstraints","stopOutboundAudio","stopOutboundVideo","attempt","newStream","DOMException","oldConstraints","tracks","mid","currentDirection","invite","mungedSDP","_mungeSDP","executeUpdateMedia","executeInvite","ssOpts","positions","bye","dtmf","doReinviteWithRelayOnly","restoreOutboundAudio","restoreOutboundVideo","_finalize","updateMediaOptions","buildVideo","createElement","muted","autoplay","playsInline","_getLocationStyles","width","height","top","left","audioSetSpeakerAction","makeVideoElementSaga","rootElement","applyLocalVideoOverlay","room","layerMap","videoEl","localOverlay","domElement","element","hide","style","opacity","show","layoutChangedHandler","myMemberId","myLayer","overflow","_buildLayer","localVideo","srcObject","appendChild","mcuLayers","querySelector","exists","hasVideo","makeLayoutChangedHandler","videoTask","m","trackHandler","videoElementSetupWorker","firstChild","removeChild","cleanupElement","audioElementActionsWatcher","setSpeakerActionType","sagaEffects.call","audioElementSetupWorker","speakerId","playsinline","setAudioMediaTrack","sagaEffects.fork","setVideoMediaTrack","mcuWrapper","right","bottom","paddingWrapper","paddingBottom","layersWrapper","classList","display","relativeWrapper","margin","alignItems","justifyContent","HAVE_NOTHING","waitForVideoReady","handleVideoTrack","ROOM_COMPONENT_LISTENERS","SCREENSHARE_AUDIO_CONSTRAINTS","echoCancellation","noiseSuppression","autoGainControl","googAutoGainControl","RoomSessionScreenShareAPI","leave","audioMute","Rooms","audioUnmute","videoMute","videoUnmute","setMicrophoneVolume","setInputVolume","setInputSensitivity","RoomSessionDeviceAPI","EXTERNAL_MEMBER_LIST_UPDATED_EVENT","INTERNAL_MEMBER_LIST_UPDATED_EVENT","SYNTHETIC_MEMBER_LIST_UPDATED_EVENT","toSyntheticEvent","MEMBER_LIST_EVENTS","membersListUpdatedWatcher","memberListPayload","actionMembers","getMembersFromAction","values","getUpdatedMembers","memberListUpdatedWorker","shouldHandleMemberList","getMemberListEventsToSubscribe","eventBridgeHandler","initMemberListSubscriptions","MemberPosition","RoomSessionAPI","_screenShareList","_deviceList","screenShareList","deviceList","recording","_payload","playback","attachPreConnectWorkers","workers.memberListUpdatedWorker","attachOnSubscribedWorkers","workers.memberPositionWorker","createScreenShareObject","opts","startScreenShare","autoJoin","displayStream","recoverCall","memberCallId","addCamera","addDevice","addMicrophone","roomDevice","updateSpeaker","device","getLayoutList","getMemberList","undeaf","setOutputVolume","setSpeakerVolume","videoManagerWorker","VideoManagerAPI","rooms","ClientAPI","_videoManager","_chat","_pubSub","makeRoomObject","makeRoomOptions","stopCameraWhileMuted","stopMicrophoneWhileMuted","Audio","audioEl","audioTask","makeAudioElementSaga","chat","ChatNamespace","pubSub","PubSubNamespace","videoManager","manager","createVideoManagerObject","atob","o","fromCharCode","decodeURIComponent","header","JWTSession","for","host","_host","checkWebSocketHost","_onSocketOpen","_onSocketError","_onSocketClose","_onSocketMessage","_rpcConnectResult","relayProtocol","signature","connecting","_socket","closing","_status","WebSocketConstructor","_createSocket","openHandler","closeHandler","_checkPingTimer","_closeConnection","rpcRequest","send","encode","_executeTimeoutMs","_executeTimeoutError","authenticate","agent","connectVersion","authentication","project","_relayProtocolIsValid","contexts","reason","decode","isJSONRPCRequest","isJSONRPCResponse","request","parseRPCResponse","_pingHandler","_handleWebSocketMessage","safeParseJson","_checkPingDelay","now","_checkTokenExpiration","expiresAt","_c","expires_at","parsed","expiresIn","expired","_expiredDiffSeconds","jwt_token","prevProtocol","retrieveRelayProtocol","persistRelayProtocol","_checkTokenExpirationTimer","_refreshTokenNotificationDiff","_onRefreshToken","_checkTokenExpirationDelay","WebSocket","decodedJwt","jwtDecode","allowHijack","_hijack","roomName","getRoomNameFromJWT","sessionStorage","getItem","setItem","createClient","baseUserOptions","EventEmitter2","INTERCEPTED_METHODS","Chat","chatOptions","client","createInterceptor","PubSub","pubSubOptions","VIDEO_CONSTRAINTS","ideal","createRoomObject","roomOptions","rootElementId","getElementById","body","roomObject","UNSAFE_PROP_ACCESS","interceptors","joinAudience","mediaOptions","receiveAudio","receiveVideo","getMediaValue","remote","remoteAllowed","audio_allowed","video_allowed","getJoinAudienceMediaParams","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","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/regex.js","../../../node_modules/uuid/dist/esm-browser/validate.js","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/v35.js","../../../node_modules/uuid/dist/esm-browser/parse.js","../../../node_modules/uuid/dist/esm-browser/md5.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../../../node_modules/uuid/dist/esm-browser/sha1.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../node_modules/redux/es/redux.js","../../../node_modules/uuid/dist/esm-browser/v3.js","../../../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/delay-p/dist/redux-saga-delay-p.esm.js","../../../node_modules/@redux-saga/core/dist/io-6de156f3.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","../../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","../../webrtc/dist/mjs/webrtc/src/utils/sdpHelpers.js","../../webrtc/dist/mjs/webrtc/src/RTCPeer.js","../../webrtc/dist/mjs/webrtc/src/BaseConnection.js","../src/utils/videoElement.ts","../src/features/actions.ts","../src/features/mediaElements/mediaElementsSagas.ts","../src/utils/audioElement.ts","../src/utils/constants.ts","../src/RoomSessionScreenShare.ts","../src/RoomSessionDevice.ts","../src/video/memberListUpdatedWorker.ts","../src/video/memberPositionWorker.ts","../src/BaseRoomSession.ts","../src/cantina/workers.ts","../src/cantina/VideoManager.ts","../src/Client.ts","../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../src/JWTSession.ts","../src/createClient.ts","../src/chat/Client.ts","../src/chat/index.ts","../src/pubSub/Client.ts","../src/pubSub/index.ts","../src/createRoomObject.ts","../src/RoomSession.ts","../src/utils/roomSession.ts","../src/joinRoom.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()).\nvar getRandomValues;\nvar 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. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\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 REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","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\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 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 var uuid = (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(); // 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 stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\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.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 var 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 (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(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 var v;\n var 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;","/*\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 var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var 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 var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var 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 var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var 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 var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var 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 var lsw = (x & 0xffff) + (y & 0xffff);\n var 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 rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var 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 (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(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 var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var 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 var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var 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 (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _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 var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 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 _defineProperty(obj, key, value) {\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\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\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\n/*\n * This is a dummy function to check if the function name has been altered by minification.\n * If the function has been minified and NODE_ENV !== 'production', warn the user.\n */\n\nfunction isCrushed() {}\n\nif (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {\n warning('You are currently using minified code outside of NODE_ENV === \"production\". ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or setting mode to production in webpack (https://webpack.js.org/concepts/mode/) ' + 'to ensure you have the correct code for your production build.');\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar 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 || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\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 { CANCEL } from '@redux-saga/symbols';\n\nfunction delayP(ms, val) {\n if (val === void 0) {\n val = true;\n }\n\n var timeoutId;\n var promise = new Promise(function (resolve) {\n timeoutId = setTimeout(resolve, ms, val);\n });\n\n promise[CANCEL] = function () {\n clearTimeout(timeoutId);\n };\n\n return promise;\n}\n\nexport default delayP;\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 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 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, actionChannel as O, PUT as P, sliding as Q, RACE as R, SELECT as S, TAKE as T, delay 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-6de156f3.js';\nexport { H as buffers, I as detach } from './io-6de156f3.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\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\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().replace(\"T\", \" \").replace(\"Z\", \"\");\nvar defaultLogger = log.getLogger(\"signalwire\");\nvar originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return function() {\n const messages = [datetime(), \"-\"];\n for (let i = 0; i < arguments.length; i++) {\n messages.push(arguments[i]);\n }\n rawMethod.apply(void 0, messages);\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/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 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 && code !== \"200\") {\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/common.ts\nvar UPPERCASE_REGEX = /[A-Z]/g;\nvar fromCamelToSnakeCase = (event) => {\n return event.replace(UPPERCASE_REGEX, (letter) => {\n return `_${letter.toLowerCase()}`;\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 } = event;\n if (event_type === \"queuing.relay.tasks\") {\n return {\n type: event_type,\n payload: event\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) => toSnakeCaseKeys(item, transform, result[index]));\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/proxyUtils.ts\nvar proxyToString = ({\n property,\n payload\n}) => {\n return typeof property === \"function\" ? () => JSON.stringify(payload) : property;\n};\nvar getAllMethods = (objTarget) => {\n let methods = {};\n let obj = objTarget;\n let shouldContinue = true;\n while (shouldContinue) {\n Object.getOwnPropertyNames(obj).forEach((k) => {\n if (typeof objTarget[k] === \"function\" && typeof k === \"string\" && !(k in methods)) {\n methods[k] = objTarget[k];\n }\n });\n if (!obj || !obj.__sw_symbol) {\n shouldContinue = false;\n } else {\n obj = Object.getPrototypeOf(obj);\n }\n }\n return methods;\n};\nvar serializeableProxy = ({\n instance,\n proxiedObj,\n payload,\n transformedPayload,\n transform\n}) => {\n const data = __spreadValues(__spreadProps(__spreadValues({}, transformedPayload), {\n _eventsNamespace: transform.getInstanceEventNamespace ? transform.getInstanceEventNamespace(payload) : void 0,\n eventChannel: transform.getInstanceEventChannel ? transform.getInstanceEventChannel(payload) : void 0\n }), getAllMethods(instance));\n return Object.defineProperties(proxiedObj, Object.entries(data).reduce((reducer, [key, value]) => {\n if (value === void 0) {\n return reducer;\n }\n reducer[key] = {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n };\n return reducer;\n }, {}));\n};\nvar proxyFactory = ({\n instance,\n transform,\n payload,\n transformedPayload\n}) => {\n const proxiedObj = new Proxy(instance, {\n get(target, prop, receiver) {\n if (prop === \"__sw_proxy\") {\n return true;\n }\n if (prop === \"toString\") {\n return proxyToString({\n property: target[prop],\n payload: transformedPayload\n });\n } else if (prop === \"_eventsNamespace\" && transform.getInstanceEventNamespace) {\n return transform.getInstanceEventNamespace(payload);\n } else if (prop === \"eventChannel\" && transform.getInstanceEventChannel) {\n return transform.getInstanceEventChannel(payload);\n } else if (prop in transformedPayload) {\n return transformedPayload[prop];\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n return serializeableProxy({\n instance,\n proxiedObj,\n payload,\n transformedPayload,\n transform\n });\n};\n\n// src/utils/eventTransformUtils.ts\nvar _instanceByTransformType = /* @__PURE__ */ new Map();\nvar _getOrCreateInstance = ({\n transform,\n payload\n}) => {\n if (!_instanceByTransformType.has(transform.type)) {\n const instance = transform.instanceFactory(payload);\n _instanceByTransformType.set(transform.type, instance);\n return instance;\n }\n return _instanceByTransformType.get(transform.type);\n};\nvar instanceProxyFactory = ({\n transform,\n payload\n}) => {\n const cachedInstance = _getOrCreateInstance({\n transform,\n payload\n });\n const transformedPayload = transform.payloadTransform(payload);\n const proxiedObj = proxyFactory({\n transform,\n payload,\n instance: cachedInstance,\n transformedPayload\n });\n return proxiedObj;\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 isInternalGlobalEvent = (event) => {\n return INTERNAL_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];\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};\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 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 closeConnectionAction: () => closeConnectionAction,\n compoundEventAttachAction: () => compoundEventAttachAction,\n createAction: () => createAction,\n destroyAction: () => destroyAction,\n executeAction: () => executeAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionAuthErrorAction: () => sessionAuthErrorAction,\n sessionConnectedAction: () => sessionConnectedAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionExpiringAction: () => sessionExpiringAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketClosedAction: () => socketClosedAction,\n socketErrorAction: () => socketErrorAction,\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 closeConnectionAction = createAction(\"swSdk/closeConnection\");\nvar reauthAction = createAction(\"swSdk/reauth\");\nvar executeAction = createAction(\"swSdk/executeRequest\");\nvar authErrorAction = createAction(\"auth/error\");\nvar authSuccessAction = createAction(\"auth/success\");\nvar authExpiringAction = createAction(\"auth/expiring\");\nvar socketClosedAction = createAction(\"socket/closed\");\nvar socketErrorAction = createAction(\"socket/error\");\nvar socketMessageAction = createAction(\"socket/message\");\nvar sessionConnectedAction = createAction(\"session.connected\");\nvar sessionDisconnectedAction = createAction(\"session.disconnected\");\nvar sessionReconnectingAction = createAction(\"session.reconnecting\");\nvar sessionAuthErrorAction = createAction(\"session.auth_error\");\nvar sessionExpiringAction = createAction(\"session.expiring\");\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};\nvar compoundEventAttachAction = createAction(\"compound_event:attach\");\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};\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 },\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 }\n});\nvar {\n actions: sessionActions,\n reducer: sessionReducer\n} = sessionSlice;\n\n// src/BaseSession.ts\nvar SW_SYMBOL = Symbol(\"BaseSession\");\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, \"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, \"_checkPingDelay\", 15 * 1e3);\n __publicField(this, \"_checkPingTimer\", null);\n __publicField(this, \"_status\", \"unknown\");\n var _a, _b;\n const { host, logLevel = \"info\" } = options;\n if (host) {\n this._host = checkWebSocketHost(host);\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 }\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 var _a, _b;\n return (_b = (_a = this._rpcConnectResult) == null ? void 0 : _a.authorization) == null ? void 0 : _b.signature;\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 set token(token) {\n this.options.token = token;\n }\n connect() {\n if (!(this == null ? void 0 : this.WebSocketConstructor)) {\n this.logger.error(\"Missing WebSocketConstructor\");\n return;\n }\n if (this._socket) {\n this.logger.warn(\"Session already connected.\");\n return;\n }\n this._socket = this._createSocket();\n const openHandler = (event) => {\n var _a;\n (_a = this._socket) == null ? void 0 : _a.removeEventListener(\"open\", openHandler);\n this._onSocketOpen(event);\n };\n this._socket.addEventListener(\"open\", openHandler);\n const closeHandler = (event) => {\n var _a;\n (_a = this._socket) == null ? void 0 : _a.removeEventListener(\"close\", closeHandler);\n this._onSocketClose(event);\n };\n this._socket.addEventListener(\"close\", closeHandler);\n const errorHandler = (event) => {\n var _a;\n (_a = this._socket) == null ? void 0 : _a.removeEventListener(\"error\", errorHandler);\n this._onSocketError(event);\n };\n this._socket.addEventListener(\"error\", errorHandler);\n this._socket.removeEventListener(\"message\", this._onSocketMessage);\n this._socket.addEventListener(\"message\", this._onSocketMessage);\n }\n _createSocket() {\n return new this.WebSocketConstructor(this._host);\n }\n async disconnect() {\n if (!this._socket || this.closing) {\n this.logger.warn(\"Session not connected or already in closing state.\");\n return;\n }\n clearTimeout(this._checkPingTimer);\n this._requests.clear();\n this._closeConnection(\"disconnected\");\n }\n execute(msg) {\n if (this._status === \"idle\" || !this.connected) {\n return Promise.reject(\"Can't call `execute` when Session is not authorized.\");\n }\n let promise;\n if (\"params\" in msg) {\n promise = new Promise((resolve, reject) => {\n this._requests.set(msg.id, { rpcRequest: msg, resolve, reject });\n });\n } else {\n promise = Promise.resolve();\n }\n this.logger.wsTraffic({ type: \"send\", payload: msg });\n this._socket.send(this.encode(msg));\n return timeoutPromise(promise, this._executeTimeoutMs, this._executeTimeoutError).catch((error) => {\n if (error === this._executeTimeoutError) {\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;\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.contexts) == null ? void 0 : _a.length) {\n params.contexts = this.options.contexts;\n }\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n }\n async _onSocketOpen(event) {\n this.logger.debug(\"_onSocketOpen\", event.type);\n try {\n await this.authenticate();\n this._status = \"connected\";\n this.dispatch(authSuccessAction());\n } catch (error) {\n this.logger.error(\"Auth Error\", error);\n this.dispatch(authErrorAction({ error }));\n }\n }\n _onSocketError(event) {\n this.logger.debug(\"_onSocketError\", event);\n this.dispatch(socketErrorAction());\n }\n _onSocketClose(event) {\n this.logger.debug(\"_onSocketClose\", event.type, event.code, event.reason);\n this._status = event.code >= 1006 && event.code <= 1014 ? \"reconnecting\" : \"disconnected\";\n this.dispatch(socketClosedAction());\n this._socket = null;\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 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 this._handleWebSocketMessage(payload);\n }\n }\n _handleWebSocketMessage(_payload) {\n }\n dispatch(_payload) {\n throw new Error(\"Method not implemented\");\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 _pingHandler(payload) {\n var _a;\n clearTimeout(this._checkPingTimer);\n this._checkPingTimer = setTimeout(() => {\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 _closeConnection(status) {\n this._status = status;\n this.dispatch(sessionActions.authStatus(\"unknown\"));\n this.dispatch(closeConnectionAction());\n if (this._socket) {\n this._socket.close();\n this._socket = null;\n }\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, _b, _c;\n const expiresAt = (_c = (_b = (_a = this == null ? void 0 : this._rpcConnectResult) == null ? void 0 : _a.authorization) == null ? void 0 : _b.expires_at) != null ? _c : 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.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 this._rpcConnectResult = await this.execute(RPCConnect(params));\n await this.persistRelayProtocol();\n this._checkTokenExpiration();\n }\n async retrieveRelayProtocol() {\n return \"\";\n }\n async persistRelayProtocol() {\n }\n async reauthenticate() {\n if (this.expired) {\n return this.connect();\n }\n const params = {\n project: this._rpcConnectResult.authorization.project,\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 _checkTokenExpiration() {\n if (!this.expiresAt) {\n return;\n }\n if (this.expiresIn <= this._refreshTokenNotificationDiff) {\n this.dispatch(authExpiringAction());\n if (this.options._onRefreshToken) {\n this.options._onRefreshToken();\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 closeConnectionAction: () => closeConnectionAction,\n compoundEventAttachAction: () => compoundEventAttachAction,\n configureStore: () => configureStore2,\n connect: () => connect,\n createAction: () => createAction,\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n destroyAction: () => destroyAction,\n executeAction: () => executeAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionAuthErrorAction: () => sessionAuthErrorAction,\n sessionConnectedAction: () => sessionConnectedAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionExpiringAction: () => sessionExpiringAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketClosedAction: () => socketClosedAction,\n socketErrorAction: () => socketErrorAction,\n socketMessageAction: () => socketMessageAction\n});\nimport createSagaMiddleware, {\n multicastChannel\n} from \"@redux-saga/core\";\n\n// src/redux/features/component/componentSlice.ts\nvar initialComponentState = {\n byId: {}\n};\nvar requestUpdater = ({\n state,\n payload,\n componentId,\n key,\n requestId\n}) => {\n if (componentId in state.byId) {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [componentId]: __spreadProps(__spreadValues({}, state.byId[componentId]), {\n [key]: __spreadProps(__spreadValues({}, state.byId[componentId][key]), {\n [requestId]: payload\n })\n })\n })\n });\n } else {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [componentId]: {\n id: componentId,\n [key]: {\n [requestId]: payload\n }\n }\n })\n });\n }\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 executeSuccess: (state, { payload }) => {\n const { componentId, requestId, response } = payload;\n return requestUpdater({\n componentId,\n requestId,\n state,\n key: \"responses\",\n payload: response\n });\n },\n executeFailure: (state, { payload }) => {\n const { componentId, requestId, error, action } = payload;\n return requestUpdater({\n componentId,\n requestId,\n state,\n key: \"errors\",\n payload: {\n action,\n jsonrpc: error\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/features/executeQueue/executeQueueSlice.ts\nvar initialExecuteQueueState = {\n queue: []\n};\nvar executeQueueSlice = createDestroyableSlice({\n name: \"executeQueue\",\n initialState: initialExecuteQueueState,\n reducers: {\n add: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n queue: state.queue.concat(payload)\n });\n },\n clean: () => {\n return initialExecuteQueueState;\n }\n }\n});\nvar {\n actions: executeQueueActions,\n reducer: executeQueueReducer\n} = executeQueueSlice;\n\n// src/redux/rootReducer.ts\nvar rootReducer = (0, toolkit_exports.combineReducers)({\n components: componentReducer,\n session: sessionReducer,\n executeQueue: executeQueueReducer\n});\n\n// src/redux/rootSaga.ts\nimport { fork as fork4, call as call3, take as take4, put as put4, delay as delay2, all } from \"@redux-saga/core/effects\";\n\n// src/redux/features/session/sessionSaga.ts\nimport { eventChannel } from \"@redux-saga/core\";\nimport {\n call as call2,\n put,\n take,\n fork,\n select,\n cancelled\n} 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});\nimport { call, spawn } from \"@redux-saga/core/effects\";\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/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/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/redux/features/session/sessionSaga.ts\nvar isWebrtcEvent = (e) => {\n return (e == null ? void 0 : e.event_type) === \"webrtc.message\";\n};\nvar isVideoEvent = (e) => {\n var _a;\n return !!((_a = e == null ? void 0 : e.event_type) == null ? void 0 : _a.startsWith(\"video.\"));\n};\nfunction* executeActionWatcher(session) {\n function* worker(action) {\n const authStatus = yield select(getAuthStatus);\n if (authStatus !== \"authorized\") {\n return;\n }\n const { componentId, requestId, method, params } = action.payload;\n try {\n const message = RPCExecute({\n id: requestId,\n method,\n params\n });\n const response = yield call2(session.execute, message);\n if (componentId && requestId) {\n yield put(componentActions.executeSuccess({\n componentId,\n requestId,\n response\n }));\n }\n } catch (error) {\n getLogger().warn(\"worker error\", componentId, JSON.stringify(error));\n if (componentId && requestId) {\n yield put(componentActions.executeFailure({\n componentId,\n requestId,\n action,\n error\n }));\n }\n } finally {\n const isCancelled = yield cancelled();\n if (isCancelled && componentId && requestId) {\n const error = {\n jsonrpc: \"2.0\",\n id: requestId,\n error: {\n code: -32600,\n message: \"Cancelled task\"\n }\n };\n getLogger().debug(\"executeActionWorker cancelled\", {\n requestId,\n componentId,\n error\n });\n yield put(componentActions.executeFailure({\n componentId,\n requestId,\n action,\n error\n }));\n }\n }\n }\n while (true) {\n const action = yield take(executeAction.type);\n yield fork(worker, action);\n }\n}\nfunction* sessionChannelWatcher({\n session,\n sessionChannel,\n pubSubChannel,\n swEventChannel\n}) {\n function* vertoWorker({ jsonrpc, nodeId }) {\n var _a, _b;\n const { id, method, params = {} } = jsonrpc;\n switch (method) {\n case \"verto.media\": {\n const component = {\n id: params.callID,\n state: \"early\",\n remoteSDP: params.sdp,\n nodeId\n };\n yield put(componentActions.upsert(component));\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoResult(id, method),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.answer\": {\n const component = {\n id: params.callID,\n state: \"active\",\n nodeId\n };\n if (params == null ? void 0 : params.sdp) {\n component.remoteSDP = params.sdp;\n }\n yield put(componentActions.upsert(component));\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoResult(id, method),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.bye\": {\n const component = {\n id: params.callID,\n state: \"hangup\",\n nodeId,\n byeCause: (_a = params == null ? void 0 : params.cause) != null ? _a : \"\",\n byeCauseCode: (_b = params == null ? void 0 : params.causeCode) != null ? _b : 0,\n redirectDestination: params == null ? void 0 : params.redirectDestination\n };\n yield put(componentActions.upsert(component));\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoResult(id, method),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.ping\": {\n yield put(executeAction({\n method: \"video.message\",\n params: {\n message: VertoPong(params),\n node_id: nodeId\n }\n }));\n break;\n }\n case \"verto.punt\":\n return session.disconnect();\n case \"verto.mediaParams\": {\n const { callID, mediaParams = {} } = params;\n if (!callID) {\n getLogger().debug(`Invalid mediaParams event`, params);\n break;\n }\n const component = { id: callID };\n if (mediaParams == null ? void 0 : mediaParams.video) {\n component.videoConstraints = mediaParams.video;\n }\n if (mediaParams == null ? void 0 : mediaParams.audio) {\n component.audioConstraints = mediaParams.audio;\n }\n yield put(componentActions.upsert(component));\n break;\n }\n case \"verto.info\":\n return getLogger().debug(\"Verto Info\", params);\n case \"verto.clientReady\":\n return getLogger().debug(\"Verto ClientReady\", params);\n case \"verto.announce\":\n return getLogger().debug(\"Verto Announce\", params);\n default:\n return getLogger().debug(`Unknown Verto method: ${method}`, params);\n }\n }\n function* videoAPIWorker(params) {\n switch (params.event_type) {\n case \"video.member.updated\": {\n return;\n }\n case \"video.room.subscribed\": {\n yield put(componentActions.upsert({\n id: params.params.call_id,\n roomId: params.params.room_session.room_id,\n roomSessionId: params.params.room_session.id,\n memberId: params.params.member_id,\n previewUrl: params.params.room_session.preview_url\n }));\n yield put(pubSubChannel, {\n type: \"video.room.joined\",\n payload: params.params\n });\n break;\n }\n case \"video.member.joined\": {\n const { member } = params.params;\n if (member == null ? void 0 : member.parent_id) {\n const parent = yield select(getComponent, member.parent_id);\n if (parent) {\n yield put(componentActions.upsert({\n id: member.id,\n roomId: params.params.room_id,\n roomSessionId: params.params.room_session_id,\n memberId: member.id\n }));\n }\n }\n break;\n }\n case \"video.member.talking\": {\n const { member } = params.params;\n if (\"talking\" in member) {\n const suffix = member.talking ? \"started\" : \"ended\";\n yield put(pubSubChannel, {\n type: `video.member.talking.${suffix}`,\n payload: params.params\n });\n const deprecatedSuffix = member.talking ? \"start\" : \"stop\";\n yield put(pubSubChannel, {\n type: `video.member.talking.${deprecatedSuffix}`,\n payload: params.params\n });\n }\n break;\n }\n }\n yield put(pubSubChannel, {\n type: params.event_type,\n payload: params.params\n });\n }\n function* swEventWorker(broadcastParams) {\n yield put(swEventChannel, toInternalAction(broadcastParams));\n if (isWebrtcEvent(broadcastParams)) {\n yield fork(vertoWorker, {\n jsonrpc: broadcastParams.params,\n nodeId: broadcastParams.node_id\n });\n return;\n }\n if (isVideoEvent(broadcastParams)) {\n yield fork(videoAPIWorker, broadcastParams);\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}\nfunction createSessionChannel(session) {\n return eventChannel((emit) => {\n session.dispatch = (payload) => {\n emit(payload);\n };\n const unsubscribe = () => {\n getLogger().debug(\"sessionChannel unsubscribe\");\n session.disconnect();\n };\n return unsubscribe;\n });\n}\n\n// src/redux/features/pubSub/pubSubSaga.ts\nimport { take as take2 } from \"@redux-saga/core/effects\";\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 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 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)) {\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/redux/features/pubSub/pubSubSaga.ts\nfunction* pubSubSaga({\n pubSubChannel,\n emitter\n}) {\n while (true) {\n const pubSubAction = yield take2(pubSubChannel, \"*\");\n const { type, payload } = pubSubAction;\n try {\n const namespace = findNamespaceInPayload(pubSubAction);\n if (isInternalGlobalEvent(type)) {\n emitter.emit(type, payload);\n }\n getLogger().trace(\"Emit:\", toInternalEventName({ namespace, event: type }));\n emitter.emit(toInternalEventName({ namespace, event: type }), payload);\n } catch (error) {\n getLogger().error(error);\n }\n }\n}\n\n// src/redux/features/executeQueue/executeQueueSaga.ts\nimport { put as put2, take as take3, fork as fork2, select as select2 } from \"@redux-saga/core/effects\";\n\n// src/redux/features/executeQueue/executeQueueSelectors.ts\nvar getExecuteQueue = ({ executeQueue }) => {\n return executeQueue;\n};\n\n// src/redux/features/executeQueue/executeQueueSaga.ts\nfunction* executeQueueWatcher() {\n function* worker(action) {\n const authStatus = yield select2(getAuthStatus);\n if (authStatus !== \"authorized\") {\n yield put2(executeQueueActions.add(action.payload));\n }\n }\n while (true) {\n const action = yield take3(executeAction.type);\n yield fork2(worker, action);\n }\n}\nfunction* flushExecuteQueueWorker() {\n const { queue } = yield select2(getExecuteQueue);\n for (const params of queue) {\n yield put2(executeAction(params));\n }\n yield put2(executeQueueActions.clean());\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/features/component/componentSaga.ts\nimport { delay, fork as fork3, put as put3, select as select3 } from \"@redux-saga/core/effects\";\nfunction* componentCleanupSagaWorker() {\n const toCleanup = yield select3(getComponentsToCleanup);\n if (toCleanup.length) {\n yield put3(componentActions.cleanup({\n ids: toCleanup\n }));\n }\n}\nfunction* componentCleanupSaga() {\n while (true) {\n yield delay(36e5);\n yield fork3(componentCleanupSagaWorker);\n }\n}\n\n// src/redux/rootSaga.ts\nfunction* initSessionSaga({\n SessionConstructor,\n userOptions,\n channels\n}) {\n var _a;\n const session = new SessionConstructor(userOptions);\n const sessionChannel = yield call3(createSessionChannel, session);\n const pubSubChannel = channels.pubSubChannel;\n const swEventChannel = channels.swEventChannel;\n let customTasks = [];\n if ((_a = userOptions.workers) == null ? void 0 : _a.length) {\n try {\n const effects = userOptions.workers.map((saga) => {\n return call3(createRestartableSaga(saga));\n });\n customTasks = yield all(effects);\n } catch (error) {\n getLogger().error(\"Error running custom workers\", error);\n }\n }\n yield fork4(sessionChannelWatcher, {\n session,\n sessionChannel,\n pubSubChannel,\n swEventChannel\n });\n yield fork4(sessionStatusWatcher, {\n session,\n sessionChannel,\n pubSubChannel,\n userOptions\n });\n const compCleanupTask = yield fork4(componentCleanupSaga);\n session.connect();\n yield take4(destroyAction.type);\n compCleanupTask == null ? void 0 : compCleanupTask.cancel();\n pubSubChannel.close();\n sessionChannel.close();\n swEventChannel.close();\n customTasks.forEach((task) => task.cancel());\n}\nfunction* socketClosedWorker({\n session,\n sessionChannel,\n pubSubChannel\n}) {\n getLogger().debug(\"socketClosedWorker\", session.status);\n if (session.status === \"reconnecting\") {\n yield put4(pubSubChannel, sessionReconnectingAction());\n yield delay2(Math.random() * 2e3);\n yield call3(session.connect);\n } else if (session.status === \"disconnected\") {\n yield put4(pubSubChannel, sessionDisconnectedAction());\n sessionChannel.close();\n } else {\n getLogger().warn(\"Unhandled Session Status\", session.status);\n if (process.env.NODE_ENV === \"development\") {\n throw new Error(`Unhandled Session Status: '${session.status}'`);\n }\n }\n}\nfunction* reauthenticateWorker({\n session,\n token,\n pubSubChannel\n}) {\n try {\n if (session.reauthenticate) {\n session.token = token;\n yield call3(session.reauthenticate);\n yield put4(pubSubChannel, sessionConnectedAction());\n }\n } catch (error) {\n getLogger().error(\"Reauthenticate Error\", error);\n yield put4(authErrorAction({ error }));\n }\n}\nfunction* sessionStatusWatcher(options) {\n while (true) {\n const action = yield take4([\n authSuccessAction.type,\n authErrorAction.type,\n authExpiringAction.type,\n socketErrorAction.type,\n socketClosedAction.type,\n reauthAction.type\n ]);\n getLogger().debug(\"sessionStatusWatcher\", action.type, action.payload);\n switch (action.type) {\n case authSuccessAction.type:\n yield fork4(startSaga, options);\n break;\n case authErrorAction.type: {\n yield fork4(sessionAuthErrorSaga, {\n action,\n userOptions: options.userOptions,\n pubSubChannel: options.pubSubChannel\n });\n break;\n }\n case authExpiringAction.type: {\n yield put4(options.pubSubChannel, sessionExpiringAction());\n break;\n }\n case socketErrorAction.type:\n break;\n case socketClosedAction.type:\n yield fork4(socketClosedWorker, options);\n break;\n case reauthAction.type: {\n yield fork4(reauthenticateWorker, {\n session: options.session,\n token: action.payload.token,\n pubSubChannel: options.pubSubChannel\n });\n break;\n }\n }\n }\n}\nfunction* startSaga(options) {\n const { session, pubSubChannel, userOptions } = options;\n const pubSubTask = yield fork4(pubSubSaga, {\n pubSubChannel,\n emitter: userOptions.emitter\n });\n const executeActionTask = yield fork4(executeActionWatcher, session);\n yield put4(sessionActions.connected(session.rpcConnectResult));\n yield put4(pubSubChannel, sessionConnectedAction());\n const flushExecuteQueueTask = yield fork4(flushExecuteQueueWorker);\n yield take4(closeConnectionAction.type);\n pubSubTask.cancel();\n executeActionTask.cancel();\n flushExecuteQueueTask.cancel();\n}\nfunction* sessionAuthErrorSaga(options) {\n const { pubSubChannel, userOptions, action } = options;\n const { error: authError } = action.payload;\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n const pubSubTask = yield fork4(pubSubSaga, {\n pubSubChannel,\n emitter: userOptions.emitter\n });\n yield put4(pubSubChannel, sessionAuthErrorAction(error));\n yield take4(sessionDisconnectedAction);\n pubSubTask.cancel();\n throw error;\n}\nvar rootSaga_default = (options) => {\n return function* root({\n userOptions,\n channels\n }) {\n if (userOptions.logger) {\n setLogger(userOptions.logger);\n }\n if (userOptions.debug) {\n setDebugOptions(userOptions.debug);\n }\n yield fork4(executeQueueWatcher);\n yield take4(initAction.type);\n try {\n yield call3(initSessionSaga, __spreadProps(__spreadValues({}, options), {\n userOptions,\n channels\n }));\n } catch (error) {\n getLogger().error(\"RootSaga Error:\", error);\n return;\n }\n };\n};\n\n// src/redux/connect.ts\nvar connect = (options) => {\n const {\n componentListeners = {},\n sessionListeners = {},\n store,\n Component,\n customSagas = []\n } = options;\n const componentKeys = Object.keys(componentListeners);\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 component = getComponent(state, instance.__uuid) || {};\n for (const reduxKey of componentKeys) {\n if (run === false) {\n return;\n }\n const cacheKey = `${instance.__uuid}.${reduxKey}`;\n const current = cacheMap.get(cacheKey);\n const updatedValue = component[reduxKey];\n if (updatedValue !== void 0 && current !== updatedValue) {\n cacheMap.set(cacheKey, updatedValue);\n const fnName = componentListeners[reduxKey];\n if (typeof fnName === \"string\") {\n instance[fnName](component);\n } else {\n fnName(component);\n }\n }\n }\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/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 pubSubChannel = multicastChannel();\n const swEventChannel = multicastChannel();\n const channels = {\n pubSubChannel,\n swEventChannel\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 runSaga = (saga, args) => {\n return sagaMiddleware.run(saga, __spreadProps(__spreadValues({}, args), {\n channels\n }));\n };\n if (runSagaMiddleware) {\n const saga = rootSaga_default({\n SessionConstructor\n });\n sagaMiddleware.run(saga, { userOptions, channels });\n }\n return __spreadProps(__spreadValues({}, store), {\n runSaga\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, \"_proxyFactoryCache\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"_eventsPrefix\", \"\");\n __publicField(this, \"_eventsRegisterQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_eventsEmitQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_eventsNamespace\");\n __publicField(this, \"_eventsTransformsCache\", /* @__PURE__ */ new Map());\n __publicField(this, \"_requests\", /* @__PURE__ */ new Map());\n __publicField(this, \"_customSagaTriggers\", /* @__PURE__ */ new Map());\n __publicField(this, \"_destroyer\");\n __publicField(this, \"_emitterTransforms\", /* @__PURE__ */ new Map());\n __publicField(this, \"_emitterListenersCache\", /* @__PURE__ */ new Map());\n __publicField(this, \"_trackedEvents\", []);\n __publicField(this, \"_runningWorkers\", []);\n __publicField(this, \"_workers\", /* @__PURE__ */ new Map());\n }\n get __uuid() {\n return this.uuid;\n }\n _handleCompoundEvents(event) {\n const internalEvent = this._getInternalEvent(event);\n let compoundEvents;\n for (const evt of this.getCompoundEvents().keys()) {\n if (this._getInternalEvent(evt) === internalEvent) {\n compoundEvents = this.getCompoundEvents().get(evt);\n break;\n }\n }\n if (!compoundEvents || compoundEvents.length === 0) {\n return;\n }\n this.store.dispatch(compoundEventAttachAction({\n compoundEvents,\n event: internalEvent,\n namespace: this._eventsNamespace\n }));\n compoundEvents.forEach((compoundEvent) => {\n if (typeof compoundEvent === \"string\") {\n this._trackEvent(compoundEvent);\n }\n });\n }\n _getNamespacedEvent(event) {\n let namespace = this._eventsNamespace;\n if (typeof event === \"string\" && isLocalEvent(event)) {\n namespace = this.__uuid;\n }\n return toInternalEventName({\n event,\n namespace\n });\n }\n _getPrefixedEvent(event) {\n if (this._eventsPrefix && typeof event === \"string\" && !event.includes(`${this._eventsPrefix}.`) && !isSessionEvent(event)) {\n return `${this._eventsPrefix}.${event}`;\n }\n return event;\n }\n _getInternalEvent(event) {\n return this._getNamespacedEvent(this._getPrefixedEvent(event));\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 emitter() {\n return this.options.emitter;\n }\n addEventToRegisterQueue(options) {\n const [event, fn] = options.params;\n this.logger.trace(\"Adding event to the register queue\", { event, fn });\n this._eventsRegisterQueue.add({\n type: options.type,\n params: options.params\n });\n return this.emitter;\n }\n _addEventToEmitQueue(event, args) {\n this.logger.trace(\"Adding to the emit queue\", event);\n this._eventsEmitQueue.add({ event, args });\n }\n shouldAddToQueue() {\n return this._eventsNamespace === void 0;\n }\n runAndCacheEventHandlerTransform({\n internalEvent,\n transform,\n payload\n }) {\n if (transform.mode === \"no-cache\") {\n const instance = transform.instanceFactory(payload);\n return instance;\n } else if (!this._eventsTransformsCache.has(internalEvent)) {\n const instance = transform.instanceFactory(payload);\n this._eventsTransformsCache.set(internalEvent, instance);\n return instance;\n }\n return this._eventsTransformsCache.get(internalEvent);\n }\n cleanupEventHandlerTransformCache({\n internalEvent,\n force\n }) {\n const instance = this._eventsTransformsCache.get(internalEvent);\n const eventCount = this.listenerCount(internalEvent);\n if (instance && (force || eventCount <= 1)) {\n if (instance.__uuid !== this.__uuid && typeof instance.destroy === \"function\") {\n instance.destroy();\n }\n return this._eventsTransformsCache.delete(internalEvent);\n }\n this.logger.trace(`[cleanupEventHandlerTransformCache] Key wasn't cached`, internalEvent);\n return false;\n }\n getEmitterListenersMapByInternalEventName(internalEvent) {\n var _a;\n return (_a = this._emitterListenersCache.get(internalEvent)) != null ? _a : /* @__PURE__ */ new Map();\n }\n getAndRemoveStableEventHandler(internalEvent, fn) {\n const cacheByEventName = this.getEmitterListenersMapByInternalEventName(internalEvent);\n if (fn && cacheByEventName.has(fn)) {\n const handler = cacheByEventName.get(fn);\n cacheByEventName.delete(fn);\n this._emitterListenersCache.set(internalEvent, cacheByEventName);\n return handler;\n }\n return fn;\n }\n _createStableEventHandler(internalEvent, fn) {\n const wrapperHandler = (payload) => {\n const transform = this._emitterTransforms.get(internalEvent);\n this.logger.trace(\"Got emitterTransform for\", internalEvent, transform);\n if (!transform) {\n return fn(payload);\n }\n const cachedInstance = this.runAndCacheEventHandlerTransform({\n internalEvent,\n transform,\n payload\n });\n let proxiedObj;\n if (this._proxyFactoryCache.has(payload)) {\n proxiedObj = this._proxyFactoryCache.get(payload);\n } else {\n const transformedPayload = this._parseNestedFields(payload, transform);\n proxiedObj = proxyFactory({\n instance: cachedInstance,\n payload,\n transformedPayload,\n transform\n });\n this._proxyFactoryCache.set(payload, proxiedObj);\n }\n return fn(proxiedObj);\n };\n return wrapperHandler;\n }\n _parseNestedFields(obj, transform, process2 = (p) => p, result = void 0) {\n if (!transform.nestedFieldsToProcess) {\n return transform.payloadTransform(obj);\n }\n if (obj.__sw_proxy) {\n return obj;\n }\n if (!result) {\n const r = transform.payloadTransform(obj);\n return this._parseNestedFields(r, transform, process2, r);\n }\n if (Array.isArray(obj)) {\n result = obj.map((item, index) => {\n return this._parseNestedFields(process2(item), transform, process2, obj[index]);\n });\n } else if (obj && typeof obj === \"object\") {\n Object.entries(obj).forEach(([key, value]) => {\n var _a;\n const nestedTransform = (_a = transform.nestedFieldsToProcess) == null ? void 0 : _a[key];\n const transformToUse = nestedTransform ? this._emitterTransforms.get(nestedTransform.eventTransformType) : void 0;\n if (value && typeof value === \"object\") {\n result[key] = this._parseNestedFields(value, transform, (p) => {\n if (nestedTransform && transformToUse && p && typeof p === \"object\") {\n return instanceProxyFactory({\n transform: transformToUse,\n payload: process2(nestedTransform.processInstancePayload(p))\n });\n }\n return p;\n }, result[key]);\n } else {\n result[key] = process2(value);\n }\n });\n }\n return result;\n }\n getOrCreateStableEventHandler(internalEvent, fn) {\n const cacheByEventName = this.getEmitterListenersMapByInternalEventName(internalEvent);\n let handler = cacheByEventName.get(fn);\n if (!handler) {\n handler = this._createStableEventHandler(internalEvent, fn);\n cacheByEventName.set(fn, handler);\n this._emitterListenersCache.set(internalEvent, cacheByEventName);\n }\n return handler;\n }\n _trackEvent(internalEvent) {\n this._trackedEvents = Array.from(new Set(this._trackedEvents.concat(internalEvent)));\n }\n _untrackEvent(internalEvent) {\n this._trackedEvents = this._trackedEvents.filter((evt) => evt !== internalEvent);\n }\n _addListener(event, fn, once) {\n this._handleCompoundEvents(event);\n const internalEvent = this._getInternalEvent(event);\n this._trackEvent(internalEvent);\n const type = once ? \"once\" : \"on\";\n if (this.shouldAddToQueue()) {\n this.addEventToRegisterQueue({\n type,\n params: [event, fn]\n });\n return this.emitter;\n }\n const wrappedHandler = this.getOrCreateStableEventHandler(internalEvent, fn);\n this.logger.trace(\"Registering event\", internalEvent);\n return this.emitter[type](internalEvent, wrappedHandler);\n }\n on(event, fn) {\n return this._addListener(event, fn);\n }\n once(event, fn) {\n return this._addListener(event, fn, true);\n }\n off(event, fn) {\n if (this.shouldAddToQueue()) {\n this.addEventToRegisterQueue({\n type: \"off\",\n params: [event, fn]\n });\n return this.emitter;\n }\n const internalEvent = this._getInternalEvent(event);\n const handler = this.getAndRemoveStableEventHandler(internalEvent, fn);\n this.cleanupEventHandlerTransformCache({\n internalEvent,\n force: !handler\n });\n this.logger.trace(\"Removing event listener\", internalEvent);\n this._untrackEvent(internalEvent);\n return this.emitter.off(internalEvent, handler);\n }\n removeAllListeners(event) {\n if (this.shouldAddToQueue()) {\n this.addEventToRegisterQueue({\n type: \"removeAllListeners\",\n params: [event]\n });\n return this.emitter;\n }\n if (event) {\n return this.off(event);\n }\n this.eventNames().forEach((eventName) => {\n this.off(eventName);\n });\n return this.emitter;\n }\n eventNames() {\n return this._trackedEvents;\n }\n getSubscriptions() {\n return validateEventsToSubscribe(this.eventNames());\n }\n emit(event, ...args) {\n if (this.shouldAddToQueue()) {\n this._addEventToEmitQueue(event, args);\n return false;\n }\n const internalEvent = this._getInternalEvent(event);\n this.logger.trace(\"Emit on event:\", internalEvent);\n return this.emitter.emit(internalEvent, ...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._requests.set(requestId, {\n resolve,\n reject,\n transformResolve,\n transformReject\n });\n this.store.dispatch(executeAction({\n requestId,\n componentId: this.__uuid,\n method,\n params: transformParams(params)\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 onError(component) {\n this._requests.forEach((value, key) => {\n if ((component == null ? void 0 : component.errors[key]) !== void 0) {\n value.reject(value.transformReject(component.errors[key]));\n this._requests.delete(key);\n }\n });\n }\n onSuccess(component) {\n this._requests.forEach((value, key) => {\n if ((component == null ? void 0 : component.responses[key]) !== void 0) {\n value.resolve(value.transformResolve(component.responses[key]));\n this._requests.delete(key);\n }\n });\n }\n getStateProperty(param) {\n return this[param];\n }\n flushEventsRegisterQueue() {\n this._eventsRegisterQueue.forEach((item) => {\n this[item.type](...item.params);\n this._eventsRegisterQueue.delete(item);\n });\n }\n flushEventsEmitQueue() {\n this._eventsEmitQueue.forEach((item) => {\n const { event, args } = item;\n this.emit(event, ...args);\n this._eventsEmitQueue.delete(item);\n });\n }\n flushEventsQueue() {\n this.flushEventsRegisterQueue();\n this.flushEventsEmitQueue();\n }\n _attachListeners(namespace) {\n if (typeof namespace === \"string\") {\n this._eventsNamespace = namespace;\n }\n this.flushEventsQueue();\n }\n getCompoundEvents() {\n return /* @__PURE__ */ new Map();\n }\n getEmitterTransforms() {\n return /* @__PURE__ */ new Map();\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 _setEmitterTransform({\n event,\n handler,\n local\n }) {\n const internalEvent = this._getInternalEvent(event);\n if (local ? !isLocalEvent(event) : isLocalEvent(event) || !this.eventNames().includes(internalEvent)) {\n return;\n }\n this._emitterTransforms.set(internalEvent, handler);\n }\n applyEmitterTransforms({ local = false } = { local: false }) {\n this.getEmitterTransforms().forEach((handlersObj, key) => {\n if (Array.isArray(key)) {\n key.forEach((k) => {\n this._setEmitterTransform({\n event: k,\n handler: handlersObj,\n local\n });\n });\n } else {\n this._setEmitterTransform({\n event: key,\n handler: handlersObj,\n local\n });\n }\n this._emitterTransforms.set(handlersObj.type, handlersObj);\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 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 }\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 this._attachListeners(\"\");\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 this.applyEmitterTransforms({ local: true });\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.warn(\"`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 this.applyEmitterTransforms();\n await this.execute(execParams);\n return resolve(void 0);\n } catch (error) {\n return reject(error);\n }\n });\n }\n};\n\n// src/utils/EventEmitter.ts\nimport EventEmitter2 from \"eventemitter3\";\nvar getEventEmitter = () => {\n return new EventEmitter2();\n};\n\n// src/types/videoMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS = {\n audio_muted: true,\n video_muted: true,\n deaf: true,\n on_hold: 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/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 audioMuteMember: () => audioMuteMember,\n audioUnmuteMember: () => audioUnmuteMember,\n createRoomSessionPlaybackObject: () => createRoomSessionPlaybackObject,\n createRoomSessionRecordingObject: () => createRoomSessionRecordingObject,\n deafMember: () => deafMember,\n getLayouts: () => getLayouts,\n getMembers: () => getMembers,\n getPlaybacks: () => getPlaybacks,\n getRecordings: () => getRecordings,\n hideVideoMuted: () => hideVideoMuted,\n play: () => play,\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 undeafMember: () => undeafMember,\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 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 = createRoomMethod(\"video.recording.list\", {\n transformResolve: (payload) => ({\n recordings: payload.recordings.map((row) => toExternalJSON(row))\n })\n});\nvar startRecording = {\n value: function() {\n return new Promise(async (resolve) => {\n const handler = (instance) => {\n resolve(instance);\n };\n this.on(toLocalEvent(\"video.recording.start\"), handler);\n try {\n const payload = await this.execute({\n method: \"video.recording.start\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n this.emit(toLocalEvent(\"video.recording.start\"), __spreadProps(__spreadValues({}, payload), {\n room_session_id: this.roomSessionId\n }));\n } catch (error) {\n this.off(toLocalEvent(\"video.recording.start\"), handler);\n throw error;\n }\n });\n }\n};\nvar getPlaybacks = createRoomMethod(\"video.playback.list\", {\n transformResolve: (payload) => ({\n playbacks: payload.playbacks.map((row) => toExternalJSON(row))\n })\n});\nvar play = {\n value: function(params) {\n return new Promise(async (resolve) => {\n const handler = (instance) => {\n resolve(instance);\n };\n this.on(toLocalEvent(\"video.playback.start\"), handler);\n try {\n const payload = await this.execute({\n method: \"video.playback.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n });\n this.emit(toLocalEvent(\"video.playback.start\"), __spreadProps(__spreadValues({}, payload), {\n room_session_id: this.roomSessionId\n }));\n } catch (error) {\n this.off(toLocalEvent(\"video.playback.start\"), handler);\n throw error;\n }\n });\n }\n};\nvar setMeta = createRoomMethod(\"video.set_meta\", {\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});\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 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 setMemberMeta = createRoomMemberMethod(\"video.member.set_meta\", {\n transformResolve: baseCodeTransform\n});\n\n// src/rooms/RoomSessionRecording.ts\nvar RoomSessionRecordingAPI = class extends BaseComponent {\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 componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return recording;\n};\n\n// src/rooms/RoomSessionPlayback.ts\nvar RoomSessionPlaybackAPI = class extends BaseComponent {\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 componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return playback;\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/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/pubSub/workers.ts\nvar pubSubWorker = function* pubSubWorker2({ channels: { pubSubChannel } }) {\n while (true) {\n const action = yield sagaEffects.take((action2) => {\n return action2.type.startsWith(`${PRODUCT_PREFIX_PUBSUB}.`);\n });\n getLogger().debug(\"pubSubWorker:\", action);\n switch (action.type) {\n case `${PRODUCT_PREFIX_PUBSUB}.channel.message`: {\n yield sagaEffects.put(pubSubChannel, {\n type: `${PRODUCT_PREFIX_PUBSUB}.message`,\n payload: action.payload\n });\n break;\n }\n default: {\n getLogger().warn(\"[pubSubWorker] Unrecognized Action\", action);\n break;\n }\n }\n }\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, \"_eventsPrefix\", PRODUCT_PREFIX_PUBSUB);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_PUBSUB}.subscribe`);\n this._attachListeners(\"\");\n this.runWorker(\"pubSub\", { worker: pubSubWorker });\n }\n getEmitterTransforms() {\n return /* @__PURE__ */ new Map([\n [\n [\"message\"],\n {\n type: \"pubSubMessage\",\n instanceFactory: () => {\n return new PubSubMessage({});\n },\n payloadTransform: (payload) => {\n const {\n channel,\n message: _a\n } = payload.params, _b = _a, { member } = _b, restMessage = __objRest(_b, [\"member\"]);\n return toExternalJSON(__spreadProps(__spreadValues({}, restMessage), {\n channel\n }));\n }\n }\n ]\n ]);\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 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.once(\"session.auth_error\", (error) => {\n reject(error);\n });\n this.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};\nvar createBasePubSubObject = (params) => {\n const pubSub = connect({\n store: params.store,\n Component: BasePubSubConsumer,\n componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return pubSub;\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/chat/ChatMessage.ts\nvar ChatMessage = class extends PubSubMessage {\n get member() {\n return this.payload.member;\n }\n};\n\n// src/chat/workers.ts\nvar chatWorker = function* chatWorker2({\n channels: { pubSubChannel }\n}) {\n while (true) {\n const action = yield sagaEffects.take((action2) => {\n return action2.type.startsWith(\"chat.\");\n });\n getLogger().debug(\"chatWorker:\", action);\n switch (action.type) {\n case \"chat.channel.message\": {\n if (PRODUCT_PREFIX_CHAT === PRODUCT_PREFIX_PUBSUB) {\n break;\n }\n yield sagaEffects.put(pubSubChannel, {\n type: \"chat.message\",\n payload: action.payload\n });\n break;\n }\n case \"chat.member.joined\":\n case \"chat.member.updated\":\n case \"chat.member.left\":\n yield sagaEffects.put(pubSubChannel, action);\n break;\n default: {\n getLogger().warn(\"[chatWorker] Unrecognized Action\", action);\n break;\n }\n }\n }\n};\n\n// src/chat/BaseChat.ts\nvar BaseChatConsumer = class extends BasePubSubConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"_eventsPrefix\", PRODUCT_PREFIX_CHAT);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_CHAT}.subscribe`);\n this.runWorker(\"chat\", { worker: chatWorker });\n }\n getEmitterTransforms() {\n return /* @__PURE__ */ new Map([\n [\n [\"message\"],\n {\n type: \"chatMessage\",\n instanceFactory: () => {\n return new ChatMessage({});\n },\n payloadTransform: (payload) => {\n const { channel, message } = payload.params;\n return toExternalJSON(__spreadProps(__spreadValues({}, message), {\n channel\n }));\n }\n }\n ],\n [\n [\"member.joined\", \"member.left\", \"member.updated\"],\n {\n type: \"chatMember\",\n instanceFactory: (payload) => {\n const { member } = payload.params;\n return new ChatMember(toExternalJSON(member));\n },\n payloadTransform: (payload) => {\n const { member } = payload.params;\n return toExternalJSON(member);\n }\n }\n ]\n ]);\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 componentListeners: {\n errors: \"onError\",\n responses: \"onSuccess\"\n }\n })(params);\n return chat;\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 fork5, put as put5 } from \"@redux-saga/core/effects\";\nfunction* memberPositionLayoutChangedWorker(options) {\n const {\n action,\n memberList,\n channels: { pubSubChannel }\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 put5(pubSubChannel, {\n type: \"video.member.updated\",\n payload\n });\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 put5(pubSubChannel, {\n type: \"video.member.updated\",\n payload: updatedMemberEventParams\n });\n }\n }\n}\nfunction* memberUpdatedWorker({\n action,\n channels,\n memberList\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 put5(channels.pubSubChannel, {\n type,\n payload: memberUpdatedPayload\n });\n }\n yield put5(channels.pubSubChannel, {\n type: action.type,\n payload: memberUpdatedPayload\n });\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}) {\n if (!initialState) {\n return;\n }\n const { swEventChannel } = channels;\n let memberList = initializeMemberList(initialState);\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 && findNamespaceInPayload(action2) === instance._eventsNamespace;\n });\n switch (action.type) {\n case \"video.member.updated\": {\n yield fork5(memberUpdatedWorker, {\n action,\n channels,\n memberList,\n instance\n });\n break;\n }\n case \"video.member.joined\": {\n const member = action.payload.member;\n memberList.set(member.id, 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 fork5(memberPositionLayoutChangedWorker, {\n action,\n channels,\n memberList,\n instance\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/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 EventEmitter2 as EventEmitter,\n GLOBAL_VIDEO_EVENTS,\n HttpError,\n INTERNAL_MEMBER_UPDATABLE_PROPS,\n INTERNAL_MEMBER_UPDATED_EVENTS,\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 VertoAnswer,\n VertoAttach,\n VertoBye,\n VertoInfo,\n VertoInvite,\n VertoModify,\n VertoPong,\n VertoResult,\n actions_exports as actions,\n componentActions,\n componentReducer,\n componentSelectors_exports as componentSelectors,\n configureStore2 as configureStore,\n connect,\n extendComponent,\n findNamespaceInPayload,\n getEventEmitter,\n getLogger,\n initialComponentState,\n isGlobalEvent,\n makeRPCRequest,\n makeRPCResponse,\n sagaEffects,\n sagaHelpers_exports as sagaHelpers,\n selectors,\n serializeableProxy,\n setLogger,\n timeoutPromise,\n toExternalJSON,\n toInternalEventName,\n toLocalEvent,\n toSnakeCaseKeys,\n toSyntheticEvent,\n v4 as uuid,\n validateEventsToSubscribe\n};\n//# sourceMappingURL=index.esm.js.map\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//# 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","const _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//# sourceMappingURL=sdpHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport { getUserMedia, getMediaConstraints } from './utils/helpers';\nimport { sdpStereoHack, sdpBitrateHack, sdpMediaOrderHack, } from './utils/sdpHelpers';\nimport { sdpToJsonHack, RTCPeerConnection, streamIsValid, stopTrack, } from './utils';\nexport default class RTCPeer {\n constructor(call, type) {\n this.call = call;\n this.type = type;\n this._negotiating = false;\n this.options = call.options;\n this.logger.debug('New Peer with type:', this.type, 'Options:', this.options);\n this._onIce = this._onIce.bind(this);\n }\n get logger() {\n return getLogger();\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 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 stopTrackSender(kind) {\n var _a, _b;\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 (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.localStream) === null || _b === void 0 ? void 0 : _b.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, _b;\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 (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.localStream) === null || _b === void 0 ? void 0 : _b.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 const config = this.instance.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.instance.setConfiguration(newConfig);\n // @ts-ignore\n this.instance.restartIce();\n }\n catch (error) {\n this.logger.error('RTCPeer restartIce error', error);\n }\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).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 offer = await this.instance.createOffer({\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 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 }\n catch (error) {\n this.logger.error(`Error creating ${this.type}:`, error);\n }\n }\n async onRemoteSdp(sdp) {\n try {\n const type = this.isOffer ? 'answer' : 'offer';\n await this._setRemoteDescription({ sdp, type });\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 }\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.options.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 const { localStream = null } = this.options;\n if (localStream && streamIsValid(localStream)) {\n const audioTracks = localStream.getAudioTracks();\n this.logger.debug('Local audio tracks: ', audioTracks);\n const videoTracks = localStream.getVideoTracks();\n this.logger.debug('Local video tracks: ', videoTracks);\n // FIXME: 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 // Use addTransceiver\n audioTracks.forEach((track) => {\n this.instance.addTransceiver(track, {\n direction: 'sendrecv',\n streams: [localStream],\n });\n });\n const transceiverParams = {\n direction: 'sendrecv',\n streams: [localStream],\n };\n if (this.isSimulcast) {\n const rids = ['0', '1', '2'];\n transceiverParams.sendEncodings = rids.map((rid) => ({\n active: true,\n rid: rid,\n scaleResolutionDownBy: Number(rid) * 6 || 1.0,\n }));\n }\n this.logger.debug('Applying video transceiverParams', transceiverParams);\n videoTracks.forEach((track) => {\n this.instance.addTransceiver(track, transceiverParams);\n });\n if (this.isSfu) {\n const { msStreamsNumber = 5 } = this.options;\n this.logger.debug('Add ', msStreamsNumber, 'recvonly MS Streams');\n transceiverParams.direction = 'recvonly';\n for (let i = 0; i < Number(msStreamsNumber); i++) {\n this.instance.addTransceiver('video', transceiverParams);\n }\n }\n }\n else if (typeof this.instance.addTrack === 'function') {\n // Use addTrack\n audioTracks.forEach((track) => {\n this.instance.addTrack(track, localStream);\n });\n videoTracks.forEach((track) => {\n this.instance.addTrack(track, localStream);\n });\n }\n else {\n // Fallback to legacy addStream ..\n // @ts-ignore\n this.instance.addStream(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 else {\n this.startNegotiation();\n }\n });\n }\n _checkMediaToNegotiate(kind) {\n // addTransceiver of 'kind' if not present\n const sender = this._getSenderByKind(kind);\n if (!sender && this.instance.addTransceiver) {\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 this._iceTimeout = null;\n if (!this.instance.localDescription) {\n return;\n }\n const { sdp, type } = 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 this.logger.debug('LOCAL SDP \\n', `Type: ${type}`, '\\n\\n', sdp);\n this.instance.removeEventListener('icecandidate', this._onIce);\n try {\n await this.call.onLocalSDPReady(this.instance.localDescription);\n }\n catch (error) {\n this._rejectStartMethod(error);\n }\n }\n _onIce(event) {\n if (!this._iceTimeout) {\n this._iceTimeout = setTimeout(() => this._sdpReady(), this.options.iceGatheringTimeout);\n }\n if (event.candidate) {\n this.logger.debug('IceCandidate:', event.candidate);\n // @ts-expect-error\n this.call.emit('icecandidate', event);\n }\n else {\n this._sdpReady();\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('LOCAL SDP \\n', `Type: ${localDescription.type}`, '\\n\\n', localDescription.sdp);\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 break;\n case 'have-local-offer': {\n if (this.instance.iceGatheringState === 'complete') {\n this._sdpReady();\n }\n break;\n }\n case 'closed':\n // @ts-ignore\n delete this.instance;\n break;\n default:\n this._negotiating = true;\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.options.remoteStream = event.streams[0];\n });\n // @ts-ignore\n this.instance.addEventListener('addstream', (event) => {\n if (event.stream) {\n this.options.remoteStream = event.stream;\n }\n });\n }\n}\n//# sourceMappingURL=RTCPeer.js.map","import { VertoBye, VertoInfo, VertoInvite, BaseComponent, selectors, VertoModify, componentSelectors, } from '@signalwire/core';\nimport RTCPeer from './RTCPeer';\nimport { stopStream, stopTrack, getUserMedia } from './utils';\nconst DEFAULT_CALL_OPTIONS = {\n destinationNumber: 'room',\n remoteCallerName: 'Outbound Call',\n remoteCallerNumber: '',\n callerName: '',\n callerNumber: '',\n audio: true,\n video: { aspectRatio: 16 / 9 },\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};\nexport class BaseConnection extends BaseComponent {\n constructor(options) {\n super(options);\n /** @internal */\n this.gotEarly = false;\n /** @internal */\n this.doReinvite = false;\n /** @internal */\n this._eventsPrefix = 'video';\n this.state = 'new';\n this.prevState = 'new';\n this.options = Object.assign(Object.assign({}, DEFAULT_CALL_OPTIONS), options);\n this.setState('new');\n this.logger.debug('New Call with Options:', this.options);\n this.applyEmitterTransforms({ local: true });\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 localStream() {\n return this.options.localStream;\n }\n get remoteStream() {\n return this.options.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.id)) ||\n {});\n }\n get nodeId() {\n var _a, _b;\n // This is only set during `hangup` when\n // `redirectDestination` is present\n if (this._nodeId) {\n return this._nodeId;\n }\n // @ts-expect-error\n return (_b = (_a = this.component) === null || _a === void 0 ? void 0 : _a.nodeId) !== null && _b !== void 0 ? _b : '';\n }\n set nodeId(id) {\n this._nodeId = id;\n }\n /** @internal */\n get messagePayload() {\n const { destinationNumber, attach, callerName, callerNumber, remoteCallerName, remoteCallerNumber, userVariables, screenShare, additionalDevice, pingSupported = true, } = this.options;\n return {\n sessid: this.options.sessionid,\n dialogParams: {\n id: this.__uuid,\n destinationNumber,\n attach,\n callerName,\n callerNumber,\n remoteCallerName,\n remoteCallerNumber,\n userVariables,\n screenShare,\n additionalDevice,\n pingSupported,\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 // TODO: use peer to check audio tracks\n return this.remoteStream\n ? this.remoteStream.getAudioTracks().length > 0\n : false;\n }\n /** @internal */\n get withVideo() {\n // TODO: use peer to check video tracks\n return this.remoteStream\n ? this.remoteStream.getVideoTracks().length > 0\n : false;\n }\n get localVideoTrack() {\n return this.peer.localVideoTrack;\n }\n get localAudioTrack() {\n return this.peer.localAudioTrack;\n }\n /**\n * @internal\n * Verto messages have to be wrapped into an execute\n * request and sent using the 'video.message' method.\n */\n vertoExecute(vertoMessage) {\n const params = {\n message: vertoMessage,\n node_id: this.nodeId,\n };\n if (vertoMessage.method === 'verto.invite') {\n if (this.options.screenShare) {\n /** Only being used for debugging purposes */\n params.subscribe = ['video.room.screenshare'];\n }\n else if (this.options.additionalDevice) {\n /** Only being used for debugging purposes */\n params.subscribe = ['video.room.additionaldevice'];\n }\n else {\n params.subscribe = this.getSubscriptions();\n }\n }\n else {\n // nodeId is required for all the requests (except for verto.invite)\n if (!this.nodeId) {\n this.logger.warn(`Skip Request. Missing nodeId for '${vertoMessage.method}'.`);\n return;\n }\n }\n return this.execute({\n method: 'video.message',\n params,\n });\n }\n /** @internal */\n onStateChange(component) {\n this.logger.debug('onStateChange', component);\n switch (component.state) {\n case 'hangup':\n this._hangup(component);\n break;\n default:\n this.setState(component.state);\n break;\n }\n }\n /** @internal */\n onRemoteSDP(component) {\n this.logger.debug('onRemoteSDP', component);\n if (component.remoteSDP) {\n this.peer.onRemoteSdp(component.remoteSDP);\n }\n }\n /** @internal */\n onRoomSubscribed(component) {\n this.logger.debug('onRoomSubscribed', component);\n /**\n * For screenShare/additionalDevice we're using\n * the `memberId` to namespace the object.\n **/\n if (this.options.additionalDevice || this.options.screenShare) {\n this._attachListeners(this.memberId);\n }\n else {\n this._attachListeners(this.roomSessionId);\n }\n // FIXME: Move to a better place when rework _attachListeners too.\n this.applyEmitterTransforms();\n }\n /** @internal */\n onVideoConstraints(component) {\n this.logger.debug('onVideoConstraints', component);\n if (component === null || component === void 0 ? void 0 : component.videoConstraints) {\n this.peer.applyMediaConstraints('video', component.videoConstraints);\n }\n }\n /** @internal */\n onAudioConstraints(component) {\n this.logger.debug('onAudioConstraints', component);\n if (component === null || component === void 0 ? void 0 : component.audioConstraints) {\n this.peer.applyMediaConstraints('audio', component.audioConstraints);\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;\n try {\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;\n }\n let newStream;\n try {\n newStream = await getUserMedia(constraints);\n }\n catch (error) {\n /**\n * In Firefox you cannot open more than one\n * microphone at a time, per process. When this\n * happens we'll try to do the following:\n * 1. Stop the current audio track\n * 2. Try to get another audio track with the new\n * constraints\n * 3. If we get an error: restore the media tracks\n * using the previous constraints.\n * @see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1238038\n */\n if (error instanceof DOMException &&\n error.message === 'Concurrent mic process limit.') {\n let oldConstraints = {};\n (_a = this.options.localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => {\n var _a;\n /**\n * We'll keep a reference of the original\n * constraints so if something fails we should\n * 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 to retrieve new ones');\n stopTrack(track);\n (_a = this.options.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n try {\n return resolve(this.updateConstraints(constraints, {\n attempt: attempt + 1,\n }));\n }\n catch (error) {\n this.logger.error('Restoring previous constraints');\n return resolve(this.updateConstraints(oldConstraints, {\n attempt: attempt + 1,\n }));\n }\n }\n this.logger.error('updateConstraints', error);\n return reject(error);\n }\n this.logger.debug('updateConstraints got stream', newStream);\n if (!this.options.localStream) {\n this.options.localStream = new MediaStream();\n }\n const { instance } = this.peer;\n const tracks = newStream.getTracks();\n this.logger.debug(`updateConstraints got ${tracks.length} tracks`);\n for (let i = 0; i < tracks.length; i++) {\n const newTrack = tracks[i];\n this.logger.debug('updateConstraints 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('updateConstraints got transceiver', transceiver.currentDirection, transceiver.mid);\n await transceiver.sender.replaceTrack(newTrack);\n this.logger.debug('updateConstraints replaceTrack');\n transceiver.direction = 'sendrecv';\n this.logger.debug('updateConstraints set to sendrecv');\n this.options.localStream.getTracks().forEach((track) => {\n var _a;\n if (track.kind === newTrack.kind && track.id !== newTrack.id) {\n this.logger.debug('updateConstraints stop old track and apply new one - ');\n stopTrack(track);\n (_a = this.options.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n this.options.localStream.addTrack(newTrack);\n }\n else {\n this.logger.debug('updateConstraints no transceiver found. addTrack and start dancing!');\n this.peer.type = 'offer';\n this.doReinvite = true;\n this.options.localStream.addTrack(newTrack);\n instance.addTrack(newTrack, this.options.localStream);\n }\n this.logger.debug('updateConstraints simply update mic/cam');\n if (newTrack.kind === 'audio') {\n this.options.micId = newTrack.getSettings().deviceId;\n }\n else if (newTrack.kind === 'video') {\n this.options.camId = newTrack.getSettings().deviceId;\n }\n }\n this.logger.debug('updateConstraints done');\n resolve();\n }\n catch (error) {\n this.logger.error('updateConstraints', error);\n reject(error);\n }\n });\n }\n /** @internal */\n invite() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'outbound';\n this.peer = new RTCPeer(this, '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 this.peer = new RTCPeer(this, 'answer');\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(localDescription) {\n var _a;\n const { type, sdp } = localDescription;\n const mungedSDP = this._mungeSDP(sdp);\n this.logger.debug('MUNGED SDP \\n', `Type: ${type}`, '\\n\\n', mungedSDP);\n switch (type) {\n case 'offer':\n // If we have a remoteDescription already, send reinvite\n if ((_a = this.peer.instance) === null || _a === void 0 ? void 0 : _a.remoteDescription) {\n return this.executeUpdateMedia(mungedSDP);\n }\n else {\n return this.executeInvite(mungedSDP);\n }\n case 'answer':\n this.logger.warn('Unhandled verto.answer');\n // this.executeAnswer()\n break;\n default:\n return this.logger.error(`Unknown SDP type: '${type}' on call ${this.id}`);\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 redirect to a different node so need to send\n * again the offer with a different nodeId.\n *\n * @internal\n */\n async executeInvite(sdp) {\n const validStates = ['new', 'requesting'];\n if (!validStates.includes(this.state)) {\n /**\n * Something bad happened. Either App logic invoking\n * methods in a wrong order or events are not correct.\n */\n throw new Error(`Invalid state: '${this.state}' for connection id: ${this.id}`);\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 msg = VertoInvite(Object.assign(Object.assign(Object.assign({}, this.messagePayload), ssOpts), { sdp }));\n const response = await this.vertoExecute(msg);\n this.logger.debug('Invite response', response);\n }\n catch (error) {\n this.setState('hangup');\n throw error.jsonrpc;\n }\n }\n /** @internal */\n async executeUpdateMedia(sdp) {\n try {\n const msg = VertoModify(Object.assign(Object.assign({}, this.messagePayload), { sdp, action: 'updateMedia' }));\n const response = await this.vertoExecute(msg);\n if (!response.sdp) {\n this.logger.error('UpdateMedia invalid SDP answer', response);\n }\n this.logger.debug('UpdateMedia response', response);\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.jsonrpc;\n }\n }\n async hangup() {\n try {\n const bye = VertoBye(this.messagePayload);\n await this.vertoExecute(bye);\n }\n catch (error) {\n this.logger.error('Hangup error:', error);\n }\n finally {\n this._hangup();\n }\n }\n /** @internal */\n dtmf(dtmf) {\n const msg = VertoInfo(Object.assign(Object.assign({}, this.messagePayload), { dtmf }));\n this.vertoExecute(msg);\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.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`);\n // @ts-expect-error\n this.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.options = Object.assign(Object.assign({}, this.options), options);\n }\n /** @internal */\n _hangup(params = {}) {\n const { byeCause = 'NORMAL_CLEARING', byeCauseCode = '16', redirectDestination, } = params;\n this.cause = byeCause;\n this.causeCode = byeCauseCode;\n if (redirectDestination && this.peer.localSdp) {\n this.logger.debug('Redirect Destination to:', redirectDestination);\n this.nodeId = redirectDestination;\n return this.executeInvite(this.peer.localSdp);\n }\n return this.setState('hangup');\n }\n /**\n * Allow to define logic to munge the SDP\n *\n * @internal\n * */\n _mungeSDP(sdp) {\n return sdp;\n }\n /** @internal */\n _finalize() {\n if (this.peer && this.peer.instance) {\n this.peer.instance.close();\n // @ts-ignore\n delete this.peer;\n }\n const { remoteStream, localStream } = this.options;\n stopStream(remoteStream);\n stopStream(localStream);\n this.destroy();\n }\n}\n//# sourceMappingURL=BaseConnection.js.map","import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\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}\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.style.width = '100%'\n localVideo.style.height = '100%'\n\n myLayer.appendChild(localVideo)\n\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n const exists = mcuLayers?.querySelector(`#${myLayer.id}`)\n if (mcuLayers && !exists) {\n mcuLayers.appendChild(myLayer)\n localOverlay.domElement = myLayer\n }\n\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 = localStream.getVideoTracks().length > 0\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\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n addSDKPrefix,\n}\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} 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} 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 return addSDKPrefix(room.memberId)\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 }\n\n const layoutChangedHandler = makeLayoutChangedHandler({\n rootElement,\n localOverlay,\n })\n\n room.on('layout.changed', (params) => {\n getLogger().debug('Received layout.changed')\n if (room.peer.hasVideoSender && room.localStream) {\n layoutChangedHandler({\n // @ts-expect-error\n layout: params.layout,\n localStream: room.localStream,\n myMemberId: room.memberId,\n })\n }\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.once('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\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 // Remove listener when done with video\n room.off('track', trackHandler)\n break\n }\n }\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 = new Audio()\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 // Remove listener when done with audio\n room.off('track', trackHandler)\n break\n }\n }\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 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 const handleVideoTrack = async (track: MediaStreamTrack) => {\n setVideoMediaTrack({ element, track })\n\n element.style.width = '100%'\n\n if (!applyLocalVideoOverlay) {\n rootElement.appendChild(element)\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.style.paddingBottom = '56.25%'\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.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.display = 'flex'\n rootElement.style.alignItems = 'center'\n rootElement.style.justifyContent = 'center'\n rootElement.appendChild(relativeWrapper)\n\n if (element.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element })\n }\n layersWrapper.style.display = 'block'\n }\n\n handleVideoTrack(track).catch((error) => {\n getLogger().error('Handle video track error', error)\n })\n\n // TODO: take destroy\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","export const ROOM_COMPONENT_LISTENERS = {\n state: 'onStateChange',\n remoteSDP: 'onRemoteSDP',\n roomId: 'onRoomSubscribed',\n videoConstraints: 'onVideoConstraints',\n audioConstraints: 'onAudioConstraints',\n errors: 'onError',\n responses: 'onSuccess',\n}\n\nexport 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} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<BaseConnectionStateEventTypes> {\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} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionStateEventTypes,\n} from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<BaseConnectionStateEventTypes> {\n join(): Promise<void>\n leave(): Promise<void>\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<BaseConnectionStateEventTypes> {\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 PubSubChannel,\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 = 'video.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 = (subscriptions: MemberListUpdatedTargetActions['type'][]) => {\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(INTERNAL_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 // @ts-expect-error\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 pubSubChannel,\n}: {\n pubSubChannel: PubSubChannel\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 // TODO: add typings\n yield sagaEffects.put(pubSubChannel, {\n type: SYNTHETIC_MEMBER_LIST_UPDATED_EVENT as any,\n payload: memberListPayload as any,\n })\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n pubSubChannel,\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: { pubSubChannel },\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 pubSubChannel,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n","import {\n SagaIterator,\n SDKWorker,\n MemberPosition,\n sagaEffects,\n} from '@signalwire/core'\n\nexport const memberPositionWorker: SDKWorker<any> =\n function* memberPositionWorker(options): SagaIterator {\n if (!options.initialState) {\n throw new Error('[memberPositionWorker] Missing initialState')\n }\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, options)\n }\n","import {\n connect,\n Rooms,\n EventTransform,\n extendComponent,\n BaseComponentContract,\n BaseComponentOptions,\n BaseConnectionContract,\n toLocalEvent,\n toExternalJSON,\n VideoRoomEventParams,\n MemberPosition,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport {\n getDisplayMedia,\n BaseConnection,\n BaseConnectionOptions,\n BaseConnectionStateEventTypes,\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 RoomSessionJoinAudienceParams,\n} from './utils/interfaces'\nimport {\n ROOM_COMPONENT_LISTENERS,\n SCREENSHARE_AUDIO_CONSTRAINTS,\n} from './utils/constants'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare,\n} from './RoomSessionScreenShare'\nimport {\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDevice,\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(): Promise<T>\n /** @internal */\n joinAudience(options?: RoomSessionJoinAudienceParams): Promise<T>\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\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n /** @internal */\n protected getEmitterTransforms() {\n return new Map<string | string[], EventTransform>([\n [\n ['video.room.joined'],\n {\n type: 'roomSession',\n instanceFactory: () => {\n return {}\n },\n payloadTransform: (payload: VideoRoomSubscribedEventParams) => {\n return payload\n },\n nestedFieldsToProcess: {\n recordings: {\n eventTransformType: 'roomSessionRecording',\n processInstancePayload: (payload) => ({ recording: payload }),\n },\n playbacks: {\n eventTransformType: 'roomSessionPlayback',\n processInstancePayload: (payload) => ({ member: payload }),\n },\n },\n },\n ],\n [\n [\n toLocalEvent('video.recording.start'),\n 'video.recording.started',\n 'video.recording.updated',\n 'video.recording.ended',\n ],\n {\n type: 'roomSessionRecording',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionRecordingObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.recording,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n [\n [\n toLocalEvent('video.playback.start'),\n 'video.playback.started',\n 'video.playback.updated',\n 'video.playback.ended',\n ],\n {\n type: 'roomSessionPlayback',\n instanceFactory: (_payload: any) => {\n return Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n // @ts-expect-error\n emitter: this.emitter,\n })\n },\n payloadTransform: (payload: any) => {\n return toExternalJSON({\n ...payload.playback,\n room_session_id: this.roomSessionId,\n })\n },\n },\n ],\n ])\n }\n\n /** @internal */\n protected override getCompoundEvents() {\n return new Map<any, any>([\n ...MemberPosition.MEMBER_POSITION_COMPOUND_EVENTS,\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 /**\n * This method will be called right after\n * `room.subscribed` happened\n * @internal\n */\n protected attachOnSubscribedWorkers(payload: VideoRoomEventParams) {\n this.runWorker('memberPositionWorker', {\n worker: workers.memberPositionWorker,\n initialState: payload,\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 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<RoomSessionObjectEvents> = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.__uuid,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n BaseConnectionStateEventTypes,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\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.on('destroy', () => {\n this._screenShareList.delete(screenShare)\n })\n\n try {\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n await screenShare.join()\n }\n return screenShare\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n throw error\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 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<RoomSessionObjectEvents> = {\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.__uuid,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n BaseConnectionStateEventTypes,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n componentListeners: ROOM_COMPONENT_LISTENERS,\n })(options)\n\n roomDevice.on('destroy', () => {\n this._deviceList.delete(roomDevice)\n })\n\n try {\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n await roomDevice.join()\n }\n return roomDevice\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n throw error\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 return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n\n /** @internal */\n async hangup() {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup()\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\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 setMeta: Rooms.setMeta,\n setMemberMeta: Rooms.setMemberMeta,\n})\n\ntype RoomSessionObjectEventsHandlerMapping = RoomSessionObjectEvents &\n BaseConnectionStateEventTypes\n\n/** @internal */\nexport const createBaseRoomSessionObject = <RoomSessionType>(\n params: BaseComponentOptions<RoomSessionObjectEventsHandlerMapping>\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 componentListeners: ROOM_COMPONENT_LISTENERS,\n })(params)\n\n return room\n}\n","import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n} from '@signalwire/core'\nimport type { VideoManager } from './VideoManager'\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const { channels } = options\n const { swEventChannel, pubSubChannel } = channels\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.put(pubSubChannel, action)\n }\n}\n","import {\n BaseComponentOptions,\n BaseConsumer,\n VideoManagerRoomEventNames,\n InternalVideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n EventTransform,\n toExternalJSON,\n VideoManagerRoomEntity,\n VideoManagerRoomsSubscribedEventParams,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\ntype EmitterTransformsEvents = InternalVideoManagerRoomEventNames\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 protected _eventsPrefix = 'video-manager' as const\n\n constructor(options: BaseComponentOptions<VideoManagerEvents>) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n getEmitterTransforms() {\n return new Map<\n EmitterTransformsEvents | EmitterTransformsEvents[],\n EventTransform\n >([\n [\n ['video-manager.rooms.subscribed'],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n payloadTransform: ({\n rooms,\n }: VideoManagerRoomsSubscribedEventParams) => ({\n rooms: rooms.map((row) => toExternalJSON(row)),\n }),\n },\n ],\n [\n [\n 'video-manager.room.started',\n 'video-manager.room.added',\n 'video-manager.room.updated',\n 'video-manager.room.ended',\n 'video-manager.room.deleted',\n ],\n {\n type: 'roomSession',\n // For now we expose the transformed payload and not a RoomSession\n instanceFactory: (payload) => toExternalJSON(payload),\n payloadTransform: (payload) => toExternalJSON(payload),\n },\n ],\n ])\n }\n}\n\nexport const createVideoManagerObject = (\n params: BaseComponentOptions<VideoManagerEvents>\n) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\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 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}\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 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 // @ts-expect-error\n emitter: this.emitter,\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 // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\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 // Emitter is now typed but we share it across objects\n // so types won't match\n // @ts-expect-error\n emitter: this.options.emitter,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n // @ts-expect-error\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 { BaseJWTSession, getLogger, SessionOptions } from '@signalwire/core'\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public agent = process.env.SDK_PKG_AGENT!\n\n constructor(public options: SessionOptions) {\n let decodedJwt\n try {\n decodedJwt = jwtDecode<{ ch?: string }>(options.token, { header: true })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n }\n\n get allowHijack() {\n // @ts-expect-error\n return this.options._hijack\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowHijack) {\n return ''\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info('Hijacking: search protocol for', roomName)\n return window.sessionStorage.getItem(roomName) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowHijack) {\n return\n }\n\n const roomName = this.getRoomNameFromJWT()\n if (roomName) {\n this.logger.info(\n 'Hijacking: persist protocol',\n roomName,\n this.relayProtocol\n )\n window.sessionStorage.setItem(roomName, this.relayProtocol)\n }\n }\n\n private getRoomNameFromJWT() {\n try {\n const jwtPayload = jwtDecode<{ r: string }>(this.options.token)\n return jwtPayload?.r\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[getRoomNameFromJWT] error decoding the JWT')\n }\n return ''\n }\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 componentListeners: {\n errors: 'onError',\n responses: 'onSuccess',\n },\n })(baseUserOptions)\n\n return client\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\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'updateToken',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\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 return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\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 'subscribe',\n 'publish',\n 'updateToken',\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 return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\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 { 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 // @ts-expect-error\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 Authorization,\n} from '@signalwire/core'\nimport { createClient } from './createClient'\nimport { BaseRoomSession } from './BaseRoomSession'\nimport {\n getJoinAudienceMediaParams,\n isValidJoinAudienceMediaParams,\n} from './utils/roomSession'\nimport type { MakeRoomOptions } from './Client'\nimport type { RoomSessionJoinAudienceParams } from './utils/interfaces'\n\nconst VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n}\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 'setMeta',\n 'setMemberMeta',\n]\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()\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio = true,\n video = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n ...userOptions\n } = roomOptions\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 stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n // @ts-expect-error\n room.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\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 joinAudience = (params?: RoomSessionJoinAudienceParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n const session = await client.connect()\n\n // @ts-expect-error\n const authState: Authorization = session._sessionAuthState\n const mediaOptions = getJoinAudienceMediaParams({\n authState,\n ...params,\n })\n\n if (!isValidJoinAudienceMediaParams(mediaOptions)) {\n await session.disconnect()\n return reject(\n new Error(\n '[joinAudience] Either (or both) `audio` and `video` must be `true` when calling this method.'\n )\n )\n }\n\n // @ts-expect-error\n room.updateMediaOptions(mediaOptions)\n\n room.once('room.subscribed', (payload) => {\n // @ts-expect-error\n room.attachOnSubscribedWorkers(payload)\n resolve(room)\n })\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession JoinAudience', 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 joinAudience,\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 { Authorization, MediaDirectionAllowed } from '@signalwire/core'\nimport type { RoomSessionJoinAudienceParams } from './interfaces'\n\n// `joinAudience` utils\nconst getJoinAudienceMediaParams = ({\n authState,\n receiveAudio = true,\n receiveVideo = true,\n}: RoomSessionJoinAudienceParams & {\n authState: Authorization\n}) => {\n const getMediaValue = ({\n remote,\n local,\n kind,\n }: {\n remote: MediaDirectionAllowed\n local: boolean\n kind: 'audio' | 'video'\n }) => {\n const remoteAllowed = remote !== 'none'\n if (!remoteAllowed && local) {\n getLogger().warn(\n `[joinAudience] ${kind} is currently not allowed on this room.`\n )\n }\n\n return !!(remoteAllowed && local)\n }\n\n return {\n audio: false,\n video: false,\n negotiateAudio: getMediaValue({\n remote: authState.audio_allowed,\n local: receiveAudio,\n kind: 'audio',\n }),\n negotiateVideo: getMediaValue({\n remote: authState.video_allowed,\n local: receiveVideo,\n kind: 'video',\n }),\n }\n}\n\nconst isValidJoinAudienceMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport { getJoinAudienceMediaParams, isValidJoinAudienceMediaParams }\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 { 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","realMethod","undefined","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","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","msCrypto","Error","REGEX","validate","uuid","byteToHex","push","toString","substr","stringify","arr","offset","toLowerCase","v35","version","hashfunc","generateUUID","value","namespace","buf","str","unescape","bytes","charCodeAt","stringToBytes","v","parseInt","parse","set","err","DNS","URL","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","a","b","s","t","num","cnt","md5ff","c","d","md5gg","md5hh","md5ii","v4","options","rnds","random","f","z","ROTL","n","_defineProperty","key","Object","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread2","target","source","forEach","getOwnPropertyDescriptors","defineProperties","formatProdErrorMessage","code","msg","input","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","K","H","Array","isArray","N","Math","ceil","M","_i","j","pow","floor","_i2","W","_t","_t2","T","$$observable","Symbol","observable","randomString","substring","split","join","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","isPlainObject","proto","getPrototypeOf","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","subscribe","listener","isSubscribed","index","splice","dispatch","action","type","listeners","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","next","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","state","hasChanged","nextState","_key","previousStateForKey","nextStateForKey","bindActionCreator","actionCreator","compose","_len","funcs","arg","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","iterator","it","throw","pattern","pat","symbol","every","channel","ch","take","close","Boolean","constructor","delayP","ms","val","timeoutId","Promise","resolve","setTimeout","clearTimeout","kTrue","konst","identity","assignWithSymbols","remove","item","once","fn","called","kThrow","kReturn","done","makeIterator","thro","meta","return","isSagaIterator","logError","error","sagaStack","createEmptyArray","wrapSagaDispatch","shouldTerminate","res","shouldCancel","shouldComplete","createAllStyleChildCallbacks","shape","parentCallback","completed","totalCount","completedCount","results","childCallbacks","chCbAtKey","isErr","cancel","getMetaInfo","getLocation","instrumented","zeroBuffer","isEmpty","put","TAKE","CALL","FORK","SELECT","makeEffect","payload","combinator","detach","eff","detached","patternOrChannel","multicastPattern","channel$1","getFnCallDescriptor","fnDescriptor","args","context","fork","_len3","_key3","select","selector","_len5","_key5","delay","queue","semaphore","task","suspend","release","asap","flush","immediately","shift","patterns","some","matcher","predicate","_predicate","String","wildcard","matcherCreator","string$1","array$1","stringableFunc","symbol$1","END","isEnd","buffer$1","limit","overflowAction","pushIndex","popIndex","items","doubledLimit","ringBuffer","initialSize","closed","takers","cb","taker","multicastChannel","currentTakers","nextTakers","ensureCanMutateNextTakers","stdChannel","chan","resolvePromise","cancelPromise","_effectRunnerMap","current","nextSagaId","cancelSingleTask","taskToCancel","isRunning","effectRunnerMap","env","_ref3","_ref3$channel","maybe","takeCb","result","effects","_ref11","digestEffect","effectId","_ref12","response","childCbs","_ref4","_ref5","proc","_ref6","cpsCb","concat","_ref7","_ref8","parent","taskIterator","resolved","createTaskIterator","getIteratorMetaInfo","child","addTask","isAborted","abort","taskOrTasks","_ref9","joinSingleTask","taskToJoin","joiner","joiners","_ref10","_ref13","_ref14","buffer","match","data","_ref15","isCancelled","prop","_ref16","props","_ref17","formatLocation","fileName","lineNumber","sagaLocationAsString","sagaMeta","cancelledTasksAsString","cancelledTasks","crashedEffect","addSagaFrame","frame","clear","firstSaga","otherSagas","crashedEffectLocation","iterator$1","parentContext","parentEffectId","isRoot","cont","finalRunEffect","finalizeRunEffect","effect","currCb","effectRunner","executingContext","mainTask","status","_task","taskResult","taskError","deferredEnd","cancelledDueToErrorTasks","create","onAbort","tasks","getTasks","cancelAll","forkQueue","end","onError","reject","id","setContext","toPromise","def","newTask","label","effectSettled","sagaMonitor","effectRejected","effectResolved","setCrashedEffect","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","INTERNAL_GLOBAL_VIDEO_EVENTS","datetime","Date","toISOString","replace","originalFactory","logLevel","rawMethod","messages","userLogger","defaultLoggerLevel","debugOptions","getLoggerInstance","wsTraffic","logWsTraffic","shouldStringify","JSON","info","Proxy","receiver","Reflect","parseResponse","nodeId","node_id","nestedResult","jsonrpc","DEFAULT_OPTIONS","propsToUpdateValue","toExternalJSON","__sw_symbol","__sw_proxy","entries","fromSnakeToCamelCase","includes","endsWith","isTimestampProperty","timestamp","date","isNaN","getTime","toDateObject","part","fc","trim","remainingChars","UPPERCASE_REGEX","toInternalEventName","letter","fromCamelToSnakeCase","getNamespacedEvent","startsWith","extendComponent","klass","methods","proxyFactory","instance","transform","transformedPayload","proxiedObj","_eventsNamespace","getInstanceEventNamespace","eventChannel","getInstanceEventChannel","objTarget","shouldContinue","k","getAllMethods","serializeableProxy","property","proxyToString","_instanceByTransformType","Map","PROTOCOL_PATTERN","timeoutPromise","time","exception","timer","race","_resolve","finally","isSessionEvent","WITH_CUSTOM_EVENT_NAMES","CLIENT_SIDE_EVENT_NAMES","validateEventsToSubscribe","valid","internalEvent","eventParts","cleanupEventNamespace","isSyntheticEvent","isLocalEvent","find","withCustomName","Set","toLocalEvent","makeRPCRequest","params","_a","makeRPCResponse","DEFAULT_CONNECT_VERSION","major","minor","revision","RPCConnect","tmpMap","destinationNumber","remoteCallerName","remoteCallerNumber","callerName","callerNumber","filterVertoParams","dialogParams","buildVertoRPCMessage","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoPong","VertoResult","actions_exports","authErrorAction","authExpiringAction","authSuccessAction","closeConnectionAction","compoundEventAttachAction","createAction","destroyAction","executeAction","getCustomSagaActionType","initAction","makeCustomSagaAction","reauthAction","sessionAuthErrorAction","sessionConnectedAction","sessionDisconnectedAction","sessionExpiringAction","sessionReconnectingAction","socketClosedAction","socketErrorAction","socketMessageAction","toolkit_exports","prepareAction","prepared","configureStore","redux_star","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","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","sessionSlice","protocol","iceServers","authStatus","authState","authError","authCount","connected","_b","authorization","ice_servers","sessionActions","sessionReducer","SW_SYMBOL","redux_exports","configureStore2","connect","createCatchableSaga","createRestartableSaga","requestUpdater","componentId","requestId","byId","componentSlice","upsert","executeSuccess","executeFailure","cleanup","ids","componentActions","componentReducer","initialExecuteQueueState","executeQueueSlice","add","clean","executeQueueActions","executeQueueReducer","rootReducer","components","session","executeQueue","_len4","_key4","spawn","defaultCatchHandler","errorHandler","sessionSelectors_exports","getAuthError","getAuthState","getAuthStatus","getIceServers","getSession","componentSelectors_exports","getComponent","getComponentsById","getComponentsToCleanup","toCleanup","responses","errors","executeActionWatcher","worker","message","RPCExecute","call2","execute","warn","sessionChannelWatcher","sessionChannel","pubSubChannel","swEventChannel","vertoWorker","component","callID","remoteSDP","sdp","byeCause","cause","byeCauseCode","causeCode","redirectDestination","disconnect","mediaParams","video","videoConstraints","audio","audioConstraints","videoAPIWorker","event_type","call_id","roomId","room_session","room_id","roomSessionId","memberId","member_id","previewUrl","preview_url","member","parent_id","room_session_id","suffix","talking","deprecatedSuffix","swEventWorker","broadcastParams","toInternalAction","isWebrtcEvent","isVideoEvent","sessionChannelWorkerCatchable","createSessionChannel","findNamespaceInPayload","isVideoMemberEvent","isVideoLayoutEvent","isVideoRecordingEvent","isVideoPlaybackEvent","isVideoRoomEvent","isChatEvent","isVoiceCallEvent","tag","pubSubSaga","pubSubAction","take2","getExecuteQueue","executeQueueWatcher","select2","put2","take3","fork2","flushExecuteQueueWorker","AuthError","super","setPrototypeOf","componentCleanupSagaWorker","select3","put3","componentCleanupSaga","fork3","initSessionSaga","SessionConstructor","userOptions","channels","call3","customTasks","workers","all","fork4","sessionStatusWatcher","compCleanupTask","take4","socketClosedWorker","put4","delay2","reauthenticateWorker","token","reauthenticate","startSaga","sessionAuthErrorSaga","pubSubTask","executeActionTask","rpcConnectResult","flushExecuteQueueTask","componentListeners","sessionListeners","Component","customSagas","componentKeys","sessionKeys","cacheMap","storeUnsubscribe","__uuid","reduxKey","cacheKey","updatedValue","fnName","taskList","destroyer","runSagaMiddleware","createSagaMiddleware","getDefaultMiddleware","setDebugOptions","rootSaga_default","SW_SYMBOL2","BaseComponent","WeakMap","_handleCompoundEvents","_getInternalEvent","compoundEvents","getCompoundEvents","compoundEvent","_trackEvent","_getNamespacedEvent","_getPrefixedEvent","_eventsPrefix","_destroyer","addEventToRegisterQueue","_eventsRegisterQueue","_addEventToEmitQueue","_eventsEmitQueue","shouldAddToQueue","runAndCacheEventHandlerTransform","mode","instanceFactory","_eventsTransformsCache","cleanupEventHandlerTransformCache","force","eventCount","destroy","delete","getEmitterListenersMapByInternalEventName","_emitterListenersCache","getAndRemoveStableEventHandler","cacheByEventName","handler","_createStableEventHandler","_emitterTransforms","cachedInstance","_proxyFactoryCache","_parseNestedFields","process2","nestedFieldsToProcess","payloadTransform","r","nestedTransform","transformToUse","eventTransformType","_getOrCreateInstance","instanceProxyFactory","processInstancePayload","getOrCreateStableEventHandler","_trackedEvents","_untrackEvent","_addListener","wrappedHandler","eventName","getSubscriptions","detachWorkers","transformParams","transformResolve","transformReject","_requests","triggerCustomSaga","dispatchId","_customSagaTriggers","settleCustomSagaTrigger","kind","selectorFn","onSuccess","getStateProperty","param","flushEventsRegisterQueue","flushEventsEmitQueue","flushEventsQueue","_attachListeners","getEmitterTransforms","_sessionAuthStatus","_sessionAuthState","_waitUntilSessionAuthorized","authStatus2","_setEmitterTransform","local","applyEmitterTransforms","handlersObj","runWorker","_workers","_setWorker","_attachWorker","_runningWorkers","BaseClient","BaseConsumer","shouldExecuteSubscribe","execParams","_latestExecuteParams","subscriptions","subscribeMethod","subscribeParams","event_channel","async","INTERNAL_MEMBER_UPDATABLE_PROPS","audio_muted","video_muted","deaf","on_hold","visible","input_volume","output_volume","input_sensitivity","MEMBER_UPDATABLE_PROPS","rooms_exports","RoomSessionPlaybackAPI","RoomSessionRecordingAPI","audioMuteMember","audioUnmuteMember","createRoomSessionPlaybackObject","createRoomSessionRecordingObject","deafMember","getLayouts","getMembers","getPlaybacks","getRecordings","hideVideoMuted","play","removeAllMembers","removeMember","setDeaf","setHideVideoMuted","setInputSensitivityMember","setInputVolumeMember","setLayout","setMemberMeta","setMemberPosition","setMeta","setOutputVolumeMember","setPositions","showVideoMuted","startRecording","undeafMember","videoMuteMember","videoUnmuteMember","baseCodeTransform","createRoomMethod","createRoomMemberMethod","rest","layouts","members","recordings","row","playbacks","pause","recording_id","resume","stop","playback_id","setVolume","volume","seek","timecode","position","abs","forward","rewind","chat_exports","BaseChatAPI","BaseChatConsumer","ChatMember","ChatMessage","createBaseChatObject","getMemberState","getMembers2","getMessages","publish","setMemberState","baseCodeTransform2","createChatMethod","createChatMemberMethod","cursor","transformParamChannels","list","toInternalChatChannels","pubSub_exports","BasePubSubConsumer","PubSubMessage","createBasePubSubObject","content","publishedAt","pubSubWorker","sagaEffects.take","action2","sagaEffects.put","toInternalPubSubChannels","restMessage","_getChannelsParam","_channels","_setSubscribeParams","_getSubscribeParams","_getUnsubscribeParams","channelsParam","_checkMissingSubscriptions","updateToken","chatWorker","memberPosition_exports","memberPositionLayoutChangedWorker","memberList","processedMembers","layout","layers","layer","memberEventParams","current_position","mutateMemberCurrentPosition","currentPosition","put5","updatedMemberEventParams","memberUpdatedWorker","updated","memberUpdatedPayload","MEMBER_POSITION_COMPOUND_EVENTS","memberPositionWorker","initializeMemberList","fork5","selectors","supportsMediaDevices","mediaDevices","getMediaDevicesApi","getSupportedConstraints","streamIsValid","stream","MediaStream","supportsMediaOutput","HTMLMediaElement","setMediaElementSinkId","el","deviceId","setSinkId","stopStream","getTracks","stopTrack","track","readyState","dispatchEvent","Event","PERMISSIONS_MAPPING","camera","microphone","speaker","_getMediaDeviceKindByName","enumerateDevices","enumerateDevicesByKind","filterByKind","devices","catch","_error","checkPermissions","permissions","query","_legacyCheckPermissions","checkCameraPermissions","checkMicrophonePermissions","checkSpeakerPermissions","getUserMedia","constraints","promises","_useTimeoutForGUM","constraint","getDisplayMedia","getDevicesWithPermissions","fullList","getDevices","_filterDevices","found","groupId","targets","checkDefault","excludeDefault","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","addEventListener","oldDevices","newDevices","changes","removals","updates","additions","newDevice","oldDevice","removed","added","_getDeviceListDiff","hasAddedDevices","hasRemovedDevices","hasUpdatedDevices","isMediaStream","_getUserMedia","getMediaConstraints","micId","micLabel","newMicId","exact","camId","camLabel","newCamId","_isAudioLine","line","_isVideoLine","sdpStereoHack","sdpLines","opusIndex","findIndex","opusPayload","RegExp","_getCodecPayloadType","fmtpLineIndex","RTCPeer","_negotiating","_onIce","isOffer","isAnswer","isSimulcast","simulcast","isSfu","sfu","localVideoTrack","videoSender","_getSenderByKind","localAudioTrack","audioSender","hasAudioSender","hasVideoSender","hasAudioReceiver","_getReceiverByKind","hasVideoReceiver","config","rtcPeerConfig","bundlePolicy","sdpSemantics","localSdp","localDescription","stopTrackSender","sender","localStream","removeTrack","restoreTrackSender","newTrack","replaceTrack","addTrack","getDeviceId","getSettings","getTrackSettings","getDeviceLabel","restartIceWithRelayOnly","getConfiguration","iceTransportPolicy","newConfig","setConfiguration","restartIce","applyMediaConstraints","newConstraints","getConstraints","screenShare","applyConstraints","getSenders","getReceivers","startNegotiation","additionalDevice","getTransceivers","tr","direction","removeEventListener","offer","createOffer","voiceActivityDetection","_setLocalDescription","_setRemoteDescription","remoteSdp","answer","createAnswer","_sdpReady","onRemoteSdp","_resolveStartMethod","hangup","_rejectStartMethod","_setupRTCPeerConnection","RTCPeerConnection","start","_retrieveLocalStream","setState","audioTracks","getAudioTracks","videoTracks","getVideoTracks","addTransceiver","streams","transceiverParams","sendEncodings","rid","active","scaleResolutionDownBy","Number","msStreamsNumber","addStream","negotiateAudio","_checkMediaToNegotiate","negotiateVideo","transceiver","_iceTimeout","onLocalSDPReady","iceGatheringTimeout","candidate","useStereo","googleMaxBitrate","googleMinBitrate","googleStartBitrate","max","min","lines","sdpBitrateHack","setLocalDescription","remoteDescription","localOffer","endOfLine","offerLines","answerLines","answerAudioIndex","answerVideoIndex","audioLines","videoLines","sdpMediaOrderHack","sessionDescr","setRemoteDescription","signalingState","iceGatheringState","iceConnectionState","remoteStream","DEFAULT_CALL_OPTIONS","aspectRatio","attach","userVariables","requestTimeout","autoApplyMediaParams","BaseConnection","gotEarly","doReinvite","prevState","trying","componentSelectors","_nodeId","messagePayload","pingSupported","sessid","sessionid","cameraId","peer","cameraLabel","microphoneId","microphoneLabel","withAudio","withVideo","vertoExecute","vertoMessage","onStateChange","_hangup","onRemoteSDP","onRoomSubscribed","onVideoConstraints","onAudioConstraints","updateCamera","updateConstraints","updateMicrophone","manageSendersWithConstraints","stopOutboundAudio","stopOutboundVideo","attempt","newStream","DOMException","oldConstraints","tracks","mid","currentDirection","invite","mungedSDP","_mungeSDP","executeUpdateMedia","executeInvite","ssOpts","positions","bye","dtmf","doReinviteWithRelayOnly","restoreOutboundAudio","restoreOutboundVideo","_finalize","updateMediaOptions","buildVideo","createElement","muted","autoplay","playsInline","_getLocationStyles","width","height","top","left","audioSetSpeakerAction","makeVideoElementSaga","rootElement","applyLocalVideoOverlay","room","layerMap","videoEl","localOverlay","domElement","element","hide","style","opacity","show","layoutChangedHandler","myMemberId","myLayer","overflow","_buildLayer","localVideo","srcObject","appendChild","mcuLayers","querySelector","exists","hasVideo","makeLayoutChangedHandler","videoTask","m","trackHandler","videoElementSetupWorker","firstChild","removeChild","cleanupElement","audioElementActionsWatcher","setSpeakerActionType","sagaEffects.call","audioElementSetupWorker","speakerId","playsinline","setAudioMediaTrack","sagaEffects.fork","setVideoMediaTrack","mcuWrapper","right","bottom","paddingWrapper","paddingBottom","layersWrapper","classList","display","relativeWrapper","margin","alignItems","justifyContent","HAVE_NOTHING","waitForVideoReady","handleVideoTrack","ROOM_COMPONENT_LISTENERS","SCREENSHARE_AUDIO_CONSTRAINTS","echoCancellation","noiseSuppression","autoGainControl","googAutoGainControl","RoomSessionScreenShareAPI","leave","audioMute","Rooms","audioUnmute","videoMute","videoUnmute","setMicrophoneVolume","setInputVolume","setInputSensitivity","RoomSessionDeviceAPI","EXTERNAL_MEMBER_LIST_UPDATED_EVENT","INTERNAL_MEMBER_LIST_UPDATED_EVENT","SYNTHETIC_MEMBER_LIST_UPDATED_EVENT","toSyntheticEvent","MEMBER_LIST_EVENTS","membersListUpdatedWatcher","memberListPayload","actionMembers","getMembersFromAction","values","getUpdatedMembers","memberListUpdatedWorker","shouldHandleMemberList","getMemberListEventsToSubscribe","eventBridgeHandler","initMemberListSubscriptions","MemberPosition","RoomSessionAPI","_screenShareList","_deviceList","screenShareList","deviceList","recording","_payload","playback","attachPreConnectWorkers","workers.memberListUpdatedWorker","attachOnSubscribedWorkers","workers.memberPositionWorker","createScreenShareObject","opts","startScreenShare","autoJoin","displayStream","recoverCall","memberCallId","addCamera","addDevice","addMicrophone","roomDevice","updateSpeaker","device","getLayoutList","getMemberList","undeaf","setOutputVolume","setSpeakerVolume","videoManagerWorker","VideoManagerAPI","rooms","ClientAPI","_videoManager","_chat","_pubSub","makeRoomObject","makeRoomOptions","stopCameraWhileMuted","stopMicrophoneWhileMuted","Audio","audioEl","audioTask","makeAudioElementSaga","chat","ChatNamespace","pubSub","PubSubNamespace","videoManager","manager","createVideoManagerObject","atob","o","fromCharCode","decodeURIComponent","header","JWTSession","for","host","_host","checkWebSocketHost","_onSocketOpen","_onSocketError","_onSocketClose","_onSocketMessage","_rpcConnectResult","relayProtocol","signature","connecting","_socket","closing","_status","WebSocketConstructor","_createSocket","openHandler","closeHandler","_checkPingTimer","_closeConnection","rpcRequest","send","encode","_executeTimeoutMs","_executeTimeoutError","authenticate","agent","connectVersion","authentication","project","_relayProtocolIsValid","contexts","reason","decode","isJSONRPCRequest","isJSONRPCResponse","request","parseRPCResponse","_pingHandler","_handleWebSocketMessage","safeParseJson","_checkPingDelay","now","_checkTokenExpiration","expiresAt","_c","expires_at","parsed","expiresIn","expired","_expiredDiffSeconds","jwt_token","prevProtocol","retrieveRelayProtocol","persistRelayProtocol","_checkTokenExpirationTimer","_refreshTokenNotificationDiff","_onRefreshToken","_checkTokenExpirationDelay","WebSocket","decodedJwt","jwtDecode","allowHijack","_hijack","roomName","getRoomNameFromJWT","sessionStorage","getItem","setItem","createClient","baseUserOptions","EventEmitter2","INTERCEPTED_METHODS","Chat","chatOptions","client","createInterceptor","PubSub","pubSubOptions","VIDEO_CONSTRAINTS","ideal","createRoomObject","roomOptions","rootElementId","getElementById","body","roomObject","UNSAFE_PROP_ACCESS","interceptors","joinAudience","mediaOptions","receiveAudio","receiveVideo","getMediaValue","remote","remoteAllowed","audio_allowed","video_allowed","getJoinAudienceMediaParams","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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"}
|