@signalwire/js 3.28.0 → 3.28.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/BaseSession.d.ts +1 -1
- package/dist/core/src/RPCMessages/VertoMessages.d.ts +7 -0
- package/dist/core/src/RPCMessages/VertoMessages.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +2 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/redux/features/component/componentSlice.d.ts +96 -0
- package/dist/core/src/redux/features/component/componentSlice.d.ts.map +1 -1
- package/dist/core/src/redux/rootReducer.d.ts +16 -0
- package/dist/core/src/redux/rootReducer.d.ts.map +1 -1
- package/dist/core/src/types/common.d.ts +16 -10
- package/dist/core/src/types/common.d.ts.map +1 -1
- package/dist/core/src/types/fabric.d.ts +0 -27
- package/dist/core/src/types/fabric.d.ts.map +1 -1
- package/dist/core/src/types/index.d.ts +67 -1
- package/dist/core/src/types/index.d.ts.map +1 -1
- package/dist/core/src/types/videoPlayback.d.ts +1 -7
- package/dist/core/src/types/videoPlayback.d.ts.map +1 -1
- package/dist/core/src/types/videoRecording.d.ts +1 -7
- package/dist/core/src/types/videoRecording.d.ts.map +1 -1
- package/dist/core/src/types/voice.d.ts +13 -2
- package/dist/core/src/types/voice.d.ts.map +1 -1
- package/dist/core/src/types/voiceCall.d.ts +96 -964
- package/dist/core/src/types/voiceCall.d.ts.map +1 -1
- package/dist/core/src/types/voiceCollect.d.ts +166 -0
- package/dist/core/src/types/voiceCollect.d.ts.map +1 -0
- package/dist/core/src/types/voiceConnect.d.ts +77 -0
- package/dist/core/src/types/voiceConnect.d.ts.map +1 -0
- package/dist/core/src/types/voiceDetect.d.ts +127 -0
- package/dist/core/src/types/voiceDetect.d.ts.map +1 -0
- package/dist/core/src/types/voicePlayback.d.ts +141 -0
- package/dist/core/src/types/voicePlayback.d.ts.map +1 -0
- package/dist/core/src/types/voicePrompt.d.ts +105 -0
- package/dist/core/src/types/voicePrompt.d.ts.map +1 -0
- package/dist/core/src/types/voiceRecording.d.ts +107 -0
- package/dist/core/src/types/voiceRecording.d.ts.map +1 -0
- package/dist/core/src/types/voiceSendDigits.d.ts +21 -0
- package/dist/core/src/types/voiceSendDigits.d.ts.map +1 -0
- package/dist/core/src/types/voiceTap.d.ts +116 -0
- package/dist/core/src/types/voiceTap.d.ts.map +1 -0
- package/dist/core/src/utils/constants.d.ts.map +1 -1
- package/dist/core/src/utils/eventUtils.d.ts +0 -2
- package/dist/core/src/utils/eventUtils.d.ts.map +1 -1
- package/dist/core/src/utils/interfaces.d.ts +19 -2
- package/dist/core/src/utils/interfaces.d.ts.map +1 -1
- package/dist/index.esm.js +636 -223
- package/dist/index.esm.js.map +4 -4
- package/dist/index.js +655 -233
- package/dist/index.js.map +4 -4
- package/dist/index.umd.js +26 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/fabric/Conversation.d.ts +2 -2
- package/dist/js/src/fabric/Conversation.d.ts.map +1 -1
- package/dist/js/src/fabric/FabricRoomSession.d.ts +5 -4
- package/dist/js/src/fabric/FabricRoomSession.d.ts.map +1 -1
- package/dist/js/src/fabric/SignalWire.d.ts.map +1 -1
- package/dist/js/src/fabric/WSClient.d.ts +2 -2
- package/dist/js/src/fabric/WSClient.d.ts.map +1 -1
- package/dist/js/src/fabric/createWSClient.d.ts +1 -1
- package/dist/js/src/fabric/createWSClient.d.ts.map +1 -1
- package/dist/js/src/fabric/interfaces/capabilities.d.ts +28 -0
- package/dist/js/src/fabric/interfaces/capabilities.d.ts.map +1 -0
- package/dist/js/src/fabric/interfaces/conversation.d.ts +4 -4
- package/dist/js/src/fabric/interfaces/conversation.d.ts.map +1 -1
- package/dist/js/src/fabric/interfaces/index.d.ts +1 -0
- package/dist/js/src/fabric/interfaces/index.d.ts.map +1 -1
- package/dist/js/src/fabric/interfaces/wsClient.d.ts +2 -2
- package/dist/js/src/fabric/interfaces/wsClient.d.ts.map +1 -1
- package/dist/js/src/fabric/utils/capabilitiesHelpers.d.ts +28 -0
- package/dist/js/src/fabric/utils/capabilitiesHelpers.d.ts.map +1 -0
- package/dist/js/src/fabric/workers/callJoinWorker.d.ts.map +1 -1
- package/dist/js/src/fabric/workers/wsClientWorker.d.ts.map +1 -1
- package/dist/js/src/index.d.ts +2 -2
- package/dist/js/src/index.d.ts.map +1 -1
- package/dist/js/src/utils/interfaces/fabric.d.ts +6 -3
- package/dist/js/src/utils/interfaces/fabric.d.ts.map +1 -1
- package/dist/js/src/utils/paginatedResult.d.ts +4 -4
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/dist/webrtc/src/BaseConnection.d.ts +78 -19
- package/dist/webrtc/src/BaseConnection.d.ts.map +1 -1
- package/dist/webrtc/src/RTCPeer.d.ts +11 -0
- package/dist/webrtc/src/RTCPeer.d.ts.map +1 -1
- package/dist/webrtc/src/utils/helpers.d.ts.map +1 -1
- package/dist/webrtc/src/utils/interfaces.d.ts +6 -0
- package/dist/webrtc/src/utils/interfaces.d.ts.map +1 -1
- package/dist/webrtc/src/utils/sdpHelpers.d.ts +27 -2
- package/dist/webrtc/src/utils/sdpHelpers.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/fabric/Conversation.ts +9 -7
- package/src/fabric/FabricRoomSession.ts +32 -32
- package/src/fabric/SignalWire.test.ts +2 -0
- package/src/fabric/SignalWire.ts +2 -0
- package/src/fabric/WSClient.ts +6 -10
- package/src/fabric/interfaces/capabilities.ts +30 -0
- package/src/fabric/interfaces/conversation.ts +5 -4
- package/src/fabric/interfaces/index.ts +2 -1
- package/src/fabric/interfaces/wsClient.ts +2 -2
- package/src/fabric/utils/capabilitiesHelpers.test.ts +201 -0
- package/src/fabric/utils/capabilitiesHelpers.ts +190 -0
- package/src/fabric/workers/callJoinWorker.ts +7 -6
- package/src/fabric/workers/wsClientWorker.ts +35 -12
- package/src/index.ts +1 -1
- package/src/utils/interfaces/fabric.ts +10 -3
- package/dist/core/src/utils/eventUtils.test.d.ts +0 -2
- package/dist/core/src/utils/eventUtils.test.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","../../core/node_modules/uuid/dist/esm-browser/rng.js","../../core/node_modules/uuid/dist/esm-browser/regex.js","../../core/node_modules/uuid/dist/esm-browser/stringify.js","../../core/node_modules/uuid/dist/esm-browser/v35.js","../../core/node_modules/uuid/dist/esm-browser/parse.js","../../core/node_modules/uuid/dist/esm-browser/validate.js","../../core/node_modules/uuid/dist/esm-browser/md5.js","../../core/node_modules/uuid/dist/esm-browser/v3.js","../../core/node_modules/uuid/dist/esm-browser/native.js","../../core/node_modules/uuid/dist/esm-browser/v4.js","../../core/node_modules/uuid/dist/esm-browser/sha1.js","../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../node_modules/redux/es/redux.js","../../core/node_modules/uuid/dist/esm-browser/v5.js","../../../node_modules/@redux-saga/symbols/dist/redux-saga-symbols.esm.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@redux-saga/is/dist/redux-saga-is.esm.js","../../../node_modules/@redux-saga/core/dist/io-c3792963.js","../../../node_modules/@redux-saga/core/dist/redux-saga-core.esm.js","../../../node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../node_modules/eventemitter3/index.js","../../core/dist/index.esm.js","../../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","../../../node_modules/sdp/sdp.js","../../webrtc/dist/mjs/webrtc/src/utils/sdpHelpers.js","../../webrtc/dist/mjs/webrtc/src/utils/helpers.js","../../webrtc/dist/mjs/webrtc/src/RTCPeer.js","../../webrtc/dist/mjs/webrtc/src/utils/watchRTCPeerMediaPackets.js","../../../node_modules/tslib/tslib.es6.mjs","../../webrtc/dist/mjs/webrtc/src/workers/vertoEventWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/roomSubscribedWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/promoteDemoteWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/sessionAuthWorker.js","../../webrtc/dist/mjs/webrtc/src/utils/constants.js","../../webrtc/dist/mjs/webrtc/src/BaseConnection.js","../src/utils/audioElement.ts","../src/features/actions.ts","../src/features/mediaElements/mediaElementsSagas.ts","../src/cantina/workers/videoManagerRoomsWorker.ts","../src/cantina/workers/videoManagerRoomWorker.ts","../src/cantina/workers/videoManagerWorker.ts","../src/cantina/VideoManager.ts","../src/utils/constants.ts","../src/utils/roomSession.ts","../src/RoomSessionScreenShare.ts","../src/video/workers/memberListUpdatedWorker.ts","../src/video/workers/childMemberJoinedWorker.ts","../src/video/workers/videoStreamWorker.ts","../src/video/workers/videoRecordWorker.ts","../src/video/workers/videoPlaybackWorker.ts","../src/video/workers/videoWorker.ts","../src/BaseRoomSession.ts","../src/RoomSessionDevice.ts","../src/video/VideoRoomSession.ts","../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../src/utils/storage.ts","../src/fabric/utils/constants.ts","../src/fabric/workers/wsClientWorker.ts","../src/fabric/workers/conversationWorker.ts","../src/fabric/FabricRoomSessionMember.ts","../src/fabric/workers/callLeftWorker.ts","../src/fabric/workers/fabricMemberWorker.ts","../src/fabric/utils/helpers.ts","../src/fabric/workers/callJoinWorker.ts","../src/fabric/workers/callSegmentWorker.ts","../src/fabric/workers/fabricWorker.ts","../src/fabric/FabricRoomSession.ts","../src/VideoOverlays.ts","../src/utils/videoElement.ts","../src/buildVideoElement.ts","../src/Client.ts","../src/utils/CloseEvent.ts","../src/JWTSession.ts","../src/createClient.ts","../src/chat/Client.ts","../src/pubSub/Client.ts","../src/pubSub/index.ts","../src/fabric/createHttpClient.ts","../src/utils/paginatedResult.ts","../src/utils/makeQueryParamsUrl.ts","../src/fabric/HTTPClient.ts","../src/fabric/utils/typeGuard.ts","../src/fabric/ConversationAPI.ts","../src/fabric/Conversation.ts","../src/fabric/IncomingCallManager.ts","../src/fabric/SATSession.ts","../src/fabric/WSClient.ts","../src/fabric/createWSClient.ts","../src/fabric/SignalWire.ts","../src/createRoomObject.ts","../src/video/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()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import { unsafeStringify } from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n var _namespace;\n\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (let i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n const output = [];\n const length32 = input.length * 32;\n const hexTab = '0123456789abcdef';\n\n for (let i = 0; i < length32; i += 8) {\n const x = input[i >> 5] >>> i % 32 & 0xff;\n const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a;\n const oldb = b;\n const oldc = c;\n const oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n const length8 = input.length * 8;\n const output = new Uint32Array(getOutputLength(length8));\n\n for (let i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n const lsw = (x & 0xffff) + (y & 0xffff);\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nconst v3 = v35('v3', 0x30, md5);\nexport default v3;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (let i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n const l = bytes.length / 4 + 2;\n const N = Math.ceil(l / 16);\n const M = new Array(N);\n\n for (let i = 0; i < N; ++i) {\n const arr = new Uint32Array(16);\n\n for (let j = 0; j < 16; ++j) {\n arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];\n }\n\n M[i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (let i = 0; i < N; ++i) {\n const W = new Uint32Array(80);\n\n for (let t = 0; t < 16; ++t) {\n W[t] = M[i][t];\n }\n\n for (let t = 16; t < 80; ++t) {\n W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n }\n\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n let e = H[4];\n\n for (let t = 0; t < 80; ++t) {\n const s = Math.floor(t / 20);\n const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n INIT: \"@@redux/INIT\" + randomString(),\n REPLACE: \"@@redux/REPLACE\" + randomString(),\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n var proto = obj;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n var type = typeof val;\n\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n var constructorName = ctorName(val);\n\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n } // other\n\n\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n var typeOfVal = typeof val;\n\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n\n return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\n\n function getState() {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\n\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n var isSubscribed = true;\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n isSubscribed = false;\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n currentListeners = null;\n };\n }\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\n\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\n\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n }\n\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n\n dispatch({\n type: ActionTypes.REPLACE\n });\n }\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\n\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n } // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n\n\n dispatch({\n type: ActionTypes.INIT\n });\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n\n\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n }\n\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n }\n });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n // keys multiple times.\n\n var unexpectedKeyCache;\n\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError;\n\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination(state, action) {\n if (state === void 0) {\n state = {};\n }\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n\n if (typeof nextStateForKey === 'undefined') {\n var actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n }\n\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n }\n\n var boundActionCreators = {};\n\n for (var key in actionCreators) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n var store = createStore.apply(void 0, arguments);\n\n var _dispatch = function dispatch() {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(void 0, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\n return _objectSpread(_objectSpread({}, store), {}, {\n dispatch: _dispatch\n });\n };\n };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nconst v5 = v35('v5', 0x50, sha1);\nexport default v5;","var createSymbol = function createSymbol(name) {\n return \"@@redux-saga/\" + name;\n};\n\nvar CANCEL =\n/*#__PURE__*/\ncreateSymbol('CANCEL_PROMISE');\nvar CHANNEL_END_TYPE =\n/*#__PURE__*/\ncreateSymbol('CHANNEL_END');\nvar IO =\n/*#__PURE__*/\ncreateSymbol('IO');\nvar MATCH =\n/*#__PURE__*/\ncreateSymbol('MATCH');\nvar MULTICAST =\n/*#__PURE__*/\ncreateSymbol('MULTICAST');\nvar SAGA_ACTION =\n/*#__PURE__*/\ncreateSymbol('SAGA_ACTION');\nvar SELF_CANCELLATION =\n/*#__PURE__*/\ncreateSymbol('SELF_CANCELLATION');\nvar TASK =\n/*#__PURE__*/\ncreateSymbol('TASK');\nvar TASK_CANCEL =\n/*#__PURE__*/\ncreateSymbol('TASK_CANCEL');\nvar TERMINATE =\n/*#__PURE__*/\ncreateSymbol('TERMINATE');\nvar SAGA_LOCATION =\n/*#__PURE__*/\ncreateSymbol('LOCATION');\n\nexport { CANCEL, CHANNEL_END_TYPE, IO, MATCH, MULTICAST, SAGA_ACTION, SAGA_LOCATION, SELF_CANCELLATION, TASK, TASK_CANCEL, TERMINATE };\n","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import { TASK, SAGA_ACTION, MULTICAST, IO } from '@redux-saga/symbols';\n\nvar undef = function undef(v) {\n return v === null || v === undefined;\n};\nvar notUndef = function notUndef(v) {\n return v !== null && v !== undefined;\n};\nvar func = function func(f) {\n return typeof f === 'function';\n};\nvar number = function number(n) {\n return typeof n === 'number';\n};\nvar string = function string(s) {\n return typeof s === 'string';\n};\nvar array = Array.isArray;\nvar object = function object(obj) {\n return obj && !array(obj) && typeof obj === 'object';\n};\nvar promise = function promise(p) {\n return p && func(p.then);\n};\nvar iterator = function iterator(it) {\n return it && func(it.next) && func(it.throw);\n};\nvar iterable = function iterable(it) {\n return it && func(Symbol) ? func(it[Symbol.iterator]) : array(it);\n};\nvar task = function task(t) {\n return t && t[TASK];\n};\nvar sagaAction = function sagaAction(a) {\n return Boolean(a && a[SAGA_ACTION]);\n};\nvar observable = function observable(ob) {\n return ob && func(ob.subscribe);\n};\nvar buffer = function buffer(buf) {\n return buf && func(buf.isEmpty) && func(buf.take) && func(buf.put);\n};\nvar pattern = function pattern(pat) {\n return pat && (string(pat) || symbol(pat) || func(pat) || array(pat) && pat.every(pattern));\n};\nvar channel = function channel(ch) {\n return ch && func(ch.take) && func(ch.close);\n};\nvar stringableFunc = function stringableFunc(f) {\n return func(f) && f.hasOwnProperty('toString');\n};\nvar symbol = function symbol(sym) {\n return Boolean(sym) && typeof Symbol === 'function' && sym.constructor === Symbol && sym !== Symbol.prototype;\n};\nvar multicast = function multicast(ch) {\n return channel(ch) && ch[MULTICAST];\n};\nvar effect = function effect(eff) {\n return eff && eff[IO];\n};\n\nexport { array, buffer, channel, effect, func, iterable, iterator, multicast, notUndef, number, object, observable, pattern, promise, sagaAction, string, stringableFunc, symbol, task, undef };\n","import { TASK_CANCEL, TERMINATE, SAGA_LOCATION, SAGA_ACTION, IO, SELF_CANCELLATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport { array, notUndef, pattern, multicast, channel, undef, effect, task, func, buffer, string, object } from '@redux-saga/is';\nimport delayP from '@redux-saga/delay-p';\n\nvar konst = function konst(v) {\n return function () {\n return v;\n };\n};\nvar kTrue =\n/*#__PURE__*/\nkonst(true);\n\nvar noop = function noop() {};\n\nif (process.env.NODE_ENV !== 'production' && typeof Proxy !== 'undefined') {\n noop =\n /*#__PURE__*/\n new Proxy(noop, {\n set: function set() {\n throw internalErr('There was an attempt to assign a property to internal `noop` function.');\n }\n });\n}\nvar identity = function identity(v) {\n return v;\n};\nvar hasSymbol = typeof Symbol === 'function';\nvar asyncIteratorSymbol = hasSymbol && Symbol.asyncIterator ? Symbol.asyncIterator : '@@asyncIterator';\nfunction check(value, predicate, error) {\n if (!predicate(value)) {\n throw new Error(error);\n }\n}\nvar assignWithSymbols = function assignWithSymbols(target, source) {\n _extends(target, source);\n\n if (Object.getOwnPropertySymbols) {\n Object.getOwnPropertySymbols(source).forEach(function (s) {\n target[s] = source[s];\n });\n }\n};\nvar flatMap = function flatMap(mapper, arr) {\n var _ref;\n\n return (_ref = []).concat.apply(_ref, arr.map(mapper));\n};\nfunction remove(array, item) {\n var index = array.indexOf(item);\n\n if (index >= 0) {\n array.splice(index, 1);\n }\n}\nfunction once(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n\n called = true;\n fn();\n };\n}\n\nvar kThrow = function kThrow(err) {\n throw err;\n};\n\nvar kReturn = function kReturn(value) {\n return {\n value: value,\n done: true\n };\n};\n\nfunction makeIterator(next, thro, name) {\n if (thro === void 0) {\n thro = kThrow;\n }\n\n if (name === void 0) {\n name = 'iterator';\n }\n\n var iterator = {\n meta: {\n name: name\n },\n next: next,\n throw: thro,\n return: kReturn,\n isSagaIterator: true\n };\n\n if (typeof Symbol !== 'undefined') {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n}\nfunction logError(error, _ref2) {\n var sagaStack = _ref2.sagaStack;\n\n /*eslint-disable no-console*/\n console.error(error);\n console.error(sagaStack);\n}\nvar internalErr = function internalErr(err) {\n return new Error(\"\\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\\n Error: \" + err + \"\\n\");\n};\nvar createSetContextWarning = function createSetContextWarning(ctx, props) {\n return (ctx ? ctx + '.' : '') + \"setContext(props): argument \" + props + \" is not a plain object\";\n};\nvar FROZEN_ACTION_ERROR = \"You can't put (a.k.a. dispatch from saga) frozen actions.\\nWe have to define a special non-enumerable property on those actions for scheduling purposes.\\nOtherwise you wouldn't be able to communicate properly between sagas & other subscribers (action ordering would become far less predictable).\\nIf you are using redux and you care about this behaviour (frozen actions),\\nthen you might want to switch to freezing actions in a middleware rather than in action creator.\\nExample implementation:\\n\\nconst freezeActions = store => next => action => next(Object.freeze(action))\\n\"; // creates empty, but not-holey array\n\nvar createEmptyArray = function createEmptyArray(n) {\n return Array.apply(null, new Array(n));\n};\nvar wrapSagaDispatch = function wrapSagaDispatch(dispatch) {\n return function (action) {\n if (process.env.NODE_ENV !== 'production') {\n check(action, function (ac) {\n return !Object.isFrozen(ac);\n }, FROZEN_ACTION_ERROR);\n }\n\n return dispatch(Object.defineProperty(action, SAGA_ACTION, {\n value: true\n }));\n };\n};\nvar shouldTerminate = function shouldTerminate(res) {\n return res === TERMINATE;\n};\nvar shouldCancel = function shouldCancel(res) {\n return res === TASK_CANCEL;\n};\nvar shouldComplete = function shouldComplete(res) {\n return shouldTerminate(res) || shouldCancel(res);\n};\nfunction createAllStyleChildCallbacks(shape, parentCallback) {\n var keys = Object.keys(shape);\n var totalCount = keys.length;\n\n if (process.env.NODE_ENV !== 'production') {\n check(totalCount, function (c) {\n return c > 0;\n }, 'createAllStyleChildCallbacks: get an empty array or object');\n }\n\n var completedCount = 0;\n var completed;\n var results = array(shape) ? createEmptyArray(totalCount) : {};\n var childCallbacks = {};\n\n function checkEnd() {\n if (completedCount === totalCount) {\n completed = true;\n parentCallback(results);\n }\n }\n\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n parentCallback.cancel();\n parentCallback(res, isErr);\n } else {\n results[key] = res;\n completedCount++;\n checkEnd();\n }\n };\n\n chCbAtKey.cancel = noop;\n childCallbacks[key] = chCbAtKey;\n });\n\n parentCallback.cancel = function () {\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCallbacks[key].cancel();\n });\n }\n };\n\n return childCallbacks;\n}\nfunction getMetaInfo(fn) {\n return {\n name: fn.name || 'anonymous',\n location: getLocation(fn)\n };\n}\nfunction getLocation(instrumented) {\n return instrumented[SAGA_LOCATION];\n}\n\nvar BUFFER_OVERFLOW = \"Channel's Buffer overflow!\";\nvar ON_OVERFLOW_THROW = 1;\nvar ON_OVERFLOW_DROP = 2;\nvar ON_OVERFLOW_SLIDE = 3;\nvar ON_OVERFLOW_EXPAND = 4;\nvar zeroBuffer = {\n isEmpty: kTrue,\n put: noop,\n take: noop\n};\n\nfunction ringBuffer(limit, overflowAction) {\n if (limit === void 0) {\n limit = 10;\n }\n\n var arr = new Array(limit);\n var length = 0;\n var pushIndex = 0;\n var popIndex = 0;\n\n var push = function push(it) {\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n length++;\n };\n\n var take = function take() {\n if (length != 0) {\n var it = arr[popIndex];\n arr[popIndex] = null;\n length--;\n popIndex = (popIndex + 1) % limit;\n return it;\n }\n };\n\n var flush = function flush() {\n var items = [];\n\n while (length) {\n items.push(take());\n }\n\n return items;\n };\n\n return {\n isEmpty: function isEmpty() {\n return length == 0;\n },\n put: function put(it) {\n if (length < limit) {\n push(it);\n } else {\n var doubledLimit;\n\n switch (overflowAction) {\n case ON_OVERFLOW_THROW:\n throw new Error(BUFFER_OVERFLOW);\n\n case ON_OVERFLOW_SLIDE:\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n popIndex = pushIndex;\n break;\n\n case ON_OVERFLOW_EXPAND:\n doubledLimit = 2 * limit;\n arr = flush();\n length = arr.length;\n pushIndex = arr.length;\n popIndex = 0;\n arr.length = doubledLimit;\n limit = doubledLimit;\n push(it);\n break;\n\n default: // DROP\n\n }\n }\n },\n take: take,\n flush: flush\n };\n}\n\nvar none = function none() {\n return zeroBuffer;\n};\nvar fixed = function fixed(limit) {\n return ringBuffer(limit, ON_OVERFLOW_THROW);\n};\nvar dropping = function dropping(limit) {\n return ringBuffer(limit, ON_OVERFLOW_DROP);\n};\nvar sliding = function sliding(limit) {\n return ringBuffer(limit, ON_OVERFLOW_SLIDE);\n};\nvar expanding = function expanding(initialSize) {\n return ringBuffer(initialSize, ON_OVERFLOW_EXPAND);\n};\n\nvar buffers = /*#__PURE__*/Object.freeze({\n __proto__: null,\n none: none,\n fixed: fixed,\n dropping: dropping,\n sliding: sliding,\n expanding: expanding\n});\n\nvar TAKE = 'TAKE';\nvar PUT = 'PUT';\nvar ALL = 'ALL';\nvar RACE = 'RACE';\nvar CALL = 'CALL';\nvar CPS = 'CPS';\nvar FORK = 'FORK';\nvar JOIN = 'JOIN';\nvar CANCEL = 'CANCEL';\nvar SELECT = 'SELECT';\nvar ACTION_CHANNEL = 'ACTION_CHANNEL';\nvar CANCELLED = 'CANCELLED';\nvar FLUSH = 'FLUSH';\nvar GET_CONTEXT = 'GET_CONTEXT';\nvar SET_CONTEXT = 'SET_CONTEXT';\n\nvar effectTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n TAKE: TAKE,\n PUT: PUT,\n ALL: ALL,\n RACE: RACE,\n CALL: CALL,\n CPS: CPS,\n FORK: FORK,\n JOIN: JOIN,\n CANCEL: CANCEL,\n SELECT: SELECT,\n ACTION_CHANNEL: ACTION_CHANNEL,\n CANCELLED: CANCELLED,\n FLUSH: FLUSH,\n GET_CONTEXT: GET_CONTEXT,\n SET_CONTEXT: SET_CONTEXT\n});\n\nvar TEST_HINT = '\\n(HINT: if you are getting these errors in tests, consider using createMockTask from @redux-saga/testing-utils)';\n\nvar makeEffect = function makeEffect(type, payload) {\n var _ref;\n\n return _ref = {}, _ref[IO] = true, _ref.combinator = false, _ref.type = type, _ref.payload = payload, _ref;\n};\n\nvar isForkEffect = function isForkEffect(eff) {\n return effect(eff) && eff.type === FORK;\n};\n\nvar detach = function detach(eff) {\n if (process.env.NODE_ENV !== 'production') {\n check(eff, isForkEffect, 'detach(eff): argument must be a fork effect');\n }\n\n return makeEffect(FORK, _extends({}, eff.payload, {\n detached: true\n }));\n};\nfunction take(patternOrChannel, multicastPattern) {\n if (patternOrChannel === void 0) {\n patternOrChannel = '*';\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'take(patternOrChannel): patternOrChannel is undefined');\n }\n\n if (pattern(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(pattern) takes one argument but two were provided. Consider passing an array for listening to several action types\");\n }\n\n return makeEffect(TAKE, {\n pattern: patternOrChannel\n });\n }\n\n if (multicast(patternOrChannel) && notUndef(multicastPattern) && pattern(multicastPattern)) {\n return makeEffect(TAKE, {\n channel: patternOrChannel,\n pattern: multicastPattern\n });\n }\n\n if (channel(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(channel) takes one argument but two were provided. Second argument is ignored.\");\n }\n\n return makeEffect(TAKE, {\n channel: patternOrChannel\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\"take(patternOrChannel): argument \" + patternOrChannel + \" is not valid channel or a valid pattern\");\n }\n}\nvar takeMaybe = function takeMaybe() {\n var eff = take.apply(void 0, arguments);\n eff.payload.maybe = true;\n return eff;\n};\nfunction put(channel$1, action) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n check(channel$1, notUndef, 'put(channel, action): argument channel is undefined');\n check(channel$1, channel, \"put(channel, action): argument \" + channel$1 + \" is not a valid channel\");\n check(action, notUndef, 'put(channel, action): argument action is undefined');\n } else {\n check(channel$1, notUndef, 'put(action): argument action is undefined');\n }\n }\n\n if (undef(action)) {\n action = channel$1; // `undefined` instead of `null` to make default parameter work\n\n channel$1 = undefined;\n }\n\n return makeEffect(PUT, {\n channel: channel$1,\n action: action\n });\n}\nvar putResolve = function putResolve() {\n var eff = put.apply(void 0, arguments);\n eff.payload.resolve = true;\n return eff;\n};\nfunction all(effects) {\n var eff = makeEffect(ALL, effects);\n eff.combinator = true;\n return eff;\n}\nfunction race(effects) {\n var eff = makeEffect(RACE, effects);\n eff.combinator = true;\n return eff;\n} // this match getFnCallDescriptor logic\n\nvar validateFnDescriptor = function validateFnDescriptor(effectName, fnDescriptor) {\n check(fnDescriptor, notUndef, effectName + \": argument fn is undefined or null\");\n\n if (func(fnDescriptor)) {\n return;\n }\n\n var context = null;\n var fn;\n\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n check(fn, notUndef, effectName + \": argument of type [context, fn] has undefined or null `fn`\");\n } else if (object(fnDescriptor)) {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n check(fn, notUndef, effectName + \": argument of type {context, fn} has undefined or null `fn`\");\n } else {\n check(fnDescriptor, func, effectName + \": argument fn is not function\");\n return;\n }\n\n if (context && string(fn)) {\n check(context[fn], func, effectName + \": context arguments has no such method - \\\"\" + fn + \"\\\"\");\n return;\n }\n\n check(fn, func, effectName + \": unpacked fn argument (from [context, fn] or {context, fn}) is not a function\");\n};\n\nfunction getFnCallDescriptor(fnDescriptor, args) {\n var context = null;\n var fn;\n\n if (func(fnDescriptor)) {\n fn = fnDescriptor;\n } else {\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n } else {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n }\n\n if (context && string(fn) && func(context[fn])) {\n fn = context[fn];\n }\n }\n\n return {\n context: context,\n fn: fn,\n args: args\n };\n}\n\nvar isNotDelayEffect = function isNotDelayEffect(fn) {\n return fn !== delay;\n};\n\nfunction call(fnDescriptor) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var arg0 = typeof args[0] === 'number' ? args[0] : 'ms';\n check(fnDescriptor, isNotDelayEffect, \"instead of writing `yield call(delay, \" + arg0 + \")` where delay is an effect from `redux-saga/effects` you should write `yield delay(\" + arg0 + \")`\");\n validateFnDescriptor('call', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction apply(context, fn, args) {\n if (args === void 0) {\n args = [];\n }\n\n var fnDescriptor = [context, fn];\n\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('apply', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor([context, fn], args));\n}\nfunction cps(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('cps', fnDescriptor);\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return makeEffect(CPS, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction fork(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('fork', fnDescriptor);\n check(fnDescriptor, function (arg) {\n return !effect(arg);\n }, 'fork: argument must not be an effect');\n }\n\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return makeEffect(FORK, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction spawn(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('spawn', fnDescriptor);\n }\n\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n\n return detach(fork.apply(void 0, [fnDescriptor].concat(args)));\n}\nfunction join(taskOrTasks) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('join(...tasks) is not supported any more. Please use join([...tasks]) to join multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"join([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else {\n check(taskOrTasks, task, \"join(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(JOIN, taskOrTasks);\n}\nfunction cancel(taskOrTasks) {\n if (taskOrTasks === void 0) {\n taskOrTasks = SELF_CANCELLATION;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('cancel(...tasks) is not supported any more. Please use cancel([...tasks]) to cancel multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"cancel([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else if (taskOrTasks !== SELF_CANCELLATION && notUndef(taskOrTasks)) {\n check(taskOrTasks, task, \"cancel(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(CANCEL, taskOrTasks);\n}\nfunction select(selector) {\n if (selector === void 0) {\n selector = identity;\n }\n\n for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n args[_key5 - 1] = arguments[_key5];\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'select(selector, [...]): argument selector is undefined');\n check(selector, func, \"select(selector, [...]): argument \" + selector + \" is not a function\");\n }\n\n return makeEffect(SELECT, {\n selector: selector,\n args: args\n });\n}\n/**\n channel(pattern, [buffer]) => creates a proxy channel for store actions\n**/\n\nfunction actionChannel(pattern$1, buffer$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(pattern$1, pattern, 'actionChannel(pattern,...): argument pattern is not valid');\n\n if (arguments.length > 1) {\n check(buffer$1, notUndef, 'actionChannel(pattern, buffer): argument buffer is undefined');\n check(buffer$1, buffer, \"actionChannel(pattern, buffer): argument \" + buffer$1 + \" is not a valid buffer\");\n }\n }\n\n return makeEffect(ACTION_CHANNEL, {\n pattern: pattern$1,\n buffer: buffer$1\n });\n}\nfunction cancelled() {\n return makeEffect(CANCELLED, {});\n}\nfunction flush(channel$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(channel$1, channel, \"flush(channel): argument \" + channel$1 + \" is not valid channel\");\n }\n\n return makeEffect(FLUSH, channel$1);\n}\nfunction getContext(prop) {\n if (process.env.NODE_ENV !== 'production') {\n check(prop, string, \"getContext(prop): argument \" + prop + \" is not a string\");\n }\n\n return makeEffect(GET_CONTEXT, prop);\n}\nfunction setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning(null, props));\n }\n\n return makeEffect(SET_CONTEXT, props);\n}\nvar delay =\n/*#__PURE__*/\ncall.bind(null, delayP);\n\nexport { apply as $, ALL as A, logError as B, CALL as C, wrapSagaDispatch as D, identity as E, FORK as F, GET_CONTEXT as G, buffers as H, detach as I, JOIN as J, take as K, fork as L, cancel as M, call as N, delay as O, PUT as P, actionChannel as Q, RACE as R, SELECT as S, TAKE as T, sliding as U, race as V, effectTypes as W, takeMaybe as X, put as Y, putResolve as Z, all as _, CPS as a, cps as a0, spawn as a1, join as a2, select as a3, cancelled as a4, flush as a5, getContext as a6, setContext as a7, CANCEL as b, check as c, ACTION_CHANNEL as d, expanding as e, CANCELLED as f, FLUSH as g, SET_CONTEXT as h, internalErr as i, getMetaInfo as j, kTrue as k, createAllStyleChildCallbacks as l, createEmptyArray as m, none as n, once as o, assignWithSymbols as p, makeIterator as q, remove as r, shouldComplete as s, noop as t, flatMap as u, getLocation as v, createSetContextWarning as w, asyncIteratorSymbol as x, shouldCancel as y, shouldTerminate as z };\n","import { CHANNEL_END_TYPE, MULTICAST, MATCH, SAGA_ACTION, CANCEL, SELF_CANCELLATION, TERMINATE, TASK, TASK_CANCEL, IO } from '@redux-saga/symbols';\nexport { CANCEL, SAGA_LOCATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport { string as string$1, array as array$1, stringableFunc, func, symbol as symbol$1, buffer, notUndef, promise, iterator, undef, object, channel as channel$1 } from '@redux-saga/is';\nimport { k as kTrue, e as expanding, c as check, o as once, r as remove, n as none, i as internalErr, T as TAKE, P as PUT, A as ALL, R as RACE, C as CALL, a as CPS, F as FORK, J as JOIN, b as CANCEL$1, S as SELECT, d as ACTION_CHANNEL, f as CANCELLED$1, g as FLUSH, G as GET_CONTEXT, h as SET_CONTEXT, j as getMetaInfo, l as createAllStyleChildCallbacks, m as createEmptyArray, p as assignWithSymbols, q as makeIterator, s as shouldComplete, t as noop, u as flatMap, v as getLocation, w as createSetContextWarning, x as asyncIteratorSymbol, y as shouldCancel, z as shouldTerminate, B as logError, D as wrapSagaDispatch, E as identity } from './io-c3792963.js';\nexport { H as buffers, I as detach } from './io-c3792963.js';\nimport { compose } from 'redux';\nimport deferred from '@redux-saga/deferred';\nimport '@redux-saga/delay-p';\n\nvar queue = [];\n/**\n Variable to hold a counting semaphore\n - Incrementing adds a lock and puts the scheduler in a `suspended` state (if it's not\n already suspended)\n - Decrementing releases a lock. Zero locks puts the scheduler in a `released` state. This\n triggers flushing the queued tasks.\n**/\n\nvar semaphore = 0;\n/**\n Executes a task 'atomically'. Tasks scheduled during this execution will be queued\n and flushed after this task has finished (assuming the scheduler endup in a released\n state).\n**/\n\nfunction exec(task) {\n try {\n suspend();\n task();\n } finally {\n release();\n }\n}\n/**\n Executes or queues a task depending on the state of the scheduler (`suspended` or `released`)\n**/\n\n\nfunction asap(task) {\n queue.push(task);\n\n if (!semaphore) {\n suspend();\n flush();\n }\n}\n/**\n * Puts the scheduler in a `suspended` state and executes a task immediately.\n */\n\nfunction immediately(task) {\n try {\n suspend();\n return task();\n } finally {\n flush();\n }\n}\n/**\n Puts the scheduler in a `suspended` state. Scheduled tasks will be queued until the\n scheduler is released.\n**/\n\nfunction suspend() {\n semaphore++;\n}\n/**\n Puts the scheduler in a `released` state.\n**/\n\n\nfunction release() {\n semaphore--;\n}\n/**\n Releases the current lock. Executes all queued tasks if the scheduler is in the released state.\n**/\n\n\nfunction flush() {\n release();\n var task;\n\n while (!semaphore && (task = queue.shift()) !== undefined) {\n exec(task);\n }\n}\n\nvar array = function array(patterns) {\n return function (input) {\n return patterns.some(function (p) {\n return matcher(p)(input);\n });\n };\n};\nvar predicate = function predicate(_predicate) {\n return function (input) {\n return _predicate(input);\n };\n};\nvar string = function string(pattern) {\n return function (input) {\n return input.type === String(pattern);\n };\n};\nvar symbol = function symbol(pattern) {\n return function (input) {\n return input.type === pattern;\n };\n};\nvar wildcard = function wildcard() {\n return kTrue;\n};\nfunction matcher(pattern) {\n // prettier-ignore\n var matcherCreator = pattern === '*' ? wildcard : string$1(pattern) ? string : array$1(pattern) ? array : stringableFunc(pattern) ? string : func(pattern) ? predicate : symbol$1(pattern) ? symbol : null;\n\n if (matcherCreator === null) {\n throw new Error(\"invalid pattern: \" + pattern);\n }\n\n return matcherCreator(pattern);\n}\n\nvar END = {\n type: CHANNEL_END_TYPE\n};\nvar isEnd = function isEnd(a) {\n return a && a.type === CHANNEL_END_TYPE;\n};\nvar CLOSED_CHANNEL_WITH_TAKERS = 'Cannot have a closed channel with pending takers';\nvar INVALID_BUFFER = 'invalid buffer passed to channel factory function';\nvar UNDEFINED_INPUT_ERROR = \"Saga or channel was provided with an undefined action\\nHints:\\n - check that your Action Creator returns a non-undefined value\\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners\";\nfunction channel(buffer$1) {\n if (buffer$1 === void 0) {\n buffer$1 = expanding();\n }\n\n var closed = false;\n var takers = [];\n\n if (process.env.NODE_ENV !== 'production') {\n check(buffer$1, buffer, INVALID_BUFFER);\n }\n\n function checkForbiddenStates() {\n if (closed && takers.length) {\n throw internalErr(CLOSED_CHANNEL_WITH_TAKERS);\n }\n\n if (takers.length && !buffer$1.isEmpty()) {\n throw internalErr('Cannot have pending takers with non empty buffer');\n }\n }\n\n function put(input) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(input, notUndef, UNDEFINED_INPUT_ERROR);\n }\n\n if (closed) {\n return;\n }\n\n if (takers.length === 0) {\n return buffer$1.put(input);\n }\n\n var cb = takers.shift();\n cb(input);\n }\n\n function take(cb) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(cb, func, \"channel.take's callback must be a function\");\n }\n\n if (closed && buffer$1.isEmpty()) {\n cb(END);\n } else if (!buffer$1.isEmpty()) {\n cb(buffer$1.take());\n } else {\n takers.push(cb);\n\n cb.cancel = function () {\n remove(takers, cb);\n };\n }\n }\n\n function flush(cb) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(cb, func, \"channel.flush' callback must be a function\");\n }\n\n if (closed && buffer$1.isEmpty()) {\n cb(END);\n return;\n }\n\n cb(buffer$1.flush());\n }\n\n function close() {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n if (closed) {\n return;\n }\n\n closed = true;\n var arr = takers;\n takers = [];\n\n for (var i = 0, len = arr.length; i < len; i++) {\n var taker = arr[i];\n taker(END);\n }\n }\n\n return {\n take: take,\n put: put,\n flush: flush,\n close: close\n };\n}\nfunction eventChannel(subscribe, buffer) {\n if (buffer === void 0) {\n buffer = none();\n }\n\n var closed = false;\n var unsubscribe;\n var chan = channel(buffer);\n\n var close = function close() {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (func(unsubscribe)) {\n unsubscribe();\n }\n\n chan.close();\n };\n\n unsubscribe = subscribe(function (input) {\n if (isEnd(input)) {\n close();\n return;\n }\n\n chan.put(input);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n check(unsubscribe, func, 'in eventChannel: subscribe should return a function to unsubscribe');\n }\n\n unsubscribe = once(unsubscribe);\n\n if (closed) {\n unsubscribe();\n }\n\n return {\n take: chan.take,\n flush: chan.flush,\n close: close\n };\n}\nfunction multicastChannel() {\n var _ref;\n\n var closed = false;\n var currentTakers = [];\n var nextTakers = currentTakers;\n\n function checkForbiddenStates() {\n if (closed && nextTakers.length) {\n throw internalErr(CLOSED_CHANNEL_WITH_TAKERS);\n }\n }\n\n var ensureCanMutateNextTakers = function ensureCanMutateNextTakers() {\n if (nextTakers !== currentTakers) {\n return;\n }\n\n nextTakers = currentTakers.slice();\n };\n\n var close = function close() {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n closed = true;\n var takers = currentTakers = nextTakers;\n nextTakers = [];\n takers.forEach(function (taker) {\n taker(END);\n });\n };\n\n return _ref = {}, _ref[MULTICAST] = true, _ref.put = function put(input) {\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n check(input, notUndef, UNDEFINED_INPUT_ERROR);\n }\n\n if (closed) {\n return;\n }\n\n if (isEnd(input)) {\n close();\n return;\n }\n\n var takers = currentTakers = nextTakers;\n\n for (var i = 0, len = takers.length; i < len; i++) {\n var taker = takers[i];\n\n if (taker[MATCH](input)) {\n taker.cancel();\n taker(input);\n }\n }\n }, _ref.take = function take(cb, matcher) {\n if (matcher === void 0) {\n matcher = wildcard;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n checkForbiddenStates();\n }\n\n if (closed) {\n cb(END);\n return;\n }\n\n cb[MATCH] = matcher;\n ensureCanMutateNextTakers();\n nextTakers.push(cb);\n cb.cancel = once(function () {\n ensureCanMutateNextTakers();\n remove(nextTakers, cb);\n });\n }, _ref.close = close, _ref;\n}\nfunction stdChannel() {\n var chan = multicastChannel();\n var put = chan.put;\n\n chan.put = function (input) {\n if (input[SAGA_ACTION]) {\n put(input);\n return;\n }\n\n asap(function () {\n put(input);\n });\n };\n\n return chan;\n}\n\nvar RUNNING = 0;\nvar CANCELLED = 1;\nvar ABORTED = 2;\nvar DONE = 3;\n\nfunction resolvePromise(promise, cb) {\n var cancelPromise = promise[CANCEL];\n\n if (func(cancelPromise)) {\n cb.cancel = cancelPromise;\n }\n\n promise.then(cb, function (error) {\n cb(error, true);\n });\n}\n\nvar current = 0;\nvar nextSagaId = (function () {\n return ++current;\n});\n\nvar _effectRunnerMap;\n\nfunction getIteratorMetaInfo(iterator, fn) {\n if (iterator.isSagaIterator) {\n return {\n name: iterator.meta.name\n };\n }\n\n return getMetaInfo(fn);\n}\n\nfunction createTaskIterator(_ref) {\n var context = _ref.context,\n fn = _ref.fn,\n args = _ref.args;\n\n // catch synchronous failures; see #152 and #441\n try {\n var result = fn.apply(context, args); // i.e. a generator function returns an iterator\n\n if (iterator(result)) {\n return result;\n }\n\n var resolved = false;\n\n var next = function next(arg) {\n if (!resolved) {\n resolved = true; // Only promises returned from fork will be interpreted. See #1573\n\n return {\n value: result,\n done: !promise(result)\n };\n } else {\n return {\n value: arg,\n done: true\n };\n }\n };\n\n return makeIterator(next);\n } catch (err) {\n // do not bubble up synchronous failures for detached forks\n // instead create a failed task. See #152 and #441\n return makeIterator(function () {\n throw err;\n });\n }\n}\n\nfunction runPutEffect(env, _ref2, cb) {\n var channel = _ref2.channel,\n action = _ref2.action,\n resolve = _ref2.resolve;\n\n /**\n Schedule the put in case another saga is holding a lock.\n The put will be executed atomically. ie nested puts will execute after\n this put has terminated.\n **/\n asap(function () {\n var result;\n\n try {\n result = (channel ? channel.put : env.dispatch)(action);\n } catch (error) {\n cb(error, true);\n return;\n }\n\n if (resolve && promise(result)) {\n resolvePromise(result, cb);\n } else {\n cb(result);\n }\n }); // Put effects are non cancellables\n}\n\nfunction runTakeEffect(env, _ref3, cb) {\n var _ref3$channel = _ref3.channel,\n channel = _ref3$channel === void 0 ? env.channel : _ref3$channel,\n pattern = _ref3.pattern,\n maybe = _ref3.maybe;\n\n var takeCb = function takeCb(input) {\n if (input instanceof Error) {\n cb(input, true);\n return;\n }\n\n if (isEnd(input) && !maybe) {\n cb(TERMINATE);\n return;\n }\n\n cb(input);\n };\n\n try {\n channel.take(takeCb, notUndef(pattern) ? matcher(pattern) : null);\n } catch (err) {\n cb(err, true);\n return;\n }\n\n cb.cancel = takeCb.cancel;\n}\n\nfunction runCallEffect(env, _ref4, cb, _ref5) {\n var context = _ref4.context,\n fn = _ref4.fn,\n args = _ref4.args;\n var task = _ref5.task;\n\n // catch synchronous failures; see #152\n try {\n var result = fn.apply(context, args);\n\n if (promise(result)) {\n resolvePromise(result, cb);\n return;\n }\n\n if (iterator(result)) {\n // resolve iterator\n proc(env, result, task.context, current, getMetaInfo(fn),\n /* isRoot */\n false, cb);\n return;\n }\n\n cb(result);\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runCPSEffect(env, _ref6, cb) {\n var context = _ref6.context,\n fn = _ref6.fn,\n args = _ref6.args;\n\n // CPS (ie node style functions) can define their own cancellation logic\n // by setting cancel field on the cb\n // catch synchronous failures; see #152\n try {\n var cpsCb = function cpsCb(err, res) {\n if (undef(err)) {\n cb(res);\n } else {\n cb(err, true);\n }\n };\n\n fn.apply(context, args.concat(cpsCb));\n\n if (cpsCb.cancel) {\n cb.cancel = cpsCb.cancel;\n }\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runForkEffect(env, _ref7, cb, _ref8) {\n var context = _ref7.context,\n fn = _ref7.fn,\n args = _ref7.args,\n detached = _ref7.detached;\n var parent = _ref8.task;\n var taskIterator = createTaskIterator({\n context: context,\n fn: fn,\n args: args\n });\n var meta = getIteratorMetaInfo(taskIterator, fn);\n immediately(function () {\n var child = proc(env, taskIterator, parent.context, current, meta, detached, undefined);\n\n if (detached) {\n cb(child);\n } else {\n if (child.isRunning()) {\n parent.queue.addTask(child);\n cb(child);\n } else if (child.isAborted()) {\n parent.queue.abort(child.error());\n } else {\n cb(child);\n }\n }\n }); // Fork effects are non cancellables\n}\n\nfunction runJoinEffect(env, taskOrTasks, cb, _ref9) {\n var task = _ref9.task;\n\n var joinSingleTask = function joinSingleTask(taskToJoin, cb) {\n if (taskToJoin.isRunning()) {\n var joiner = {\n task: task,\n cb: cb\n };\n\n cb.cancel = function () {\n if (taskToJoin.isRunning()) remove(taskToJoin.joiners, joiner);\n };\n\n taskToJoin.joiners.push(joiner);\n } else {\n if (taskToJoin.isAborted()) {\n cb(taskToJoin.error(), true);\n } else {\n cb(taskToJoin.result());\n }\n }\n };\n\n if (array$1(taskOrTasks)) {\n if (taskOrTasks.length === 0) {\n cb([]);\n return;\n }\n\n var childCallbacks = createAllStyleChildCallbacks(taskOrTasks, cb);\n taskOrTasks.forEach(function (t, i) {\n joinSingleTask(t, childCallbacks[i]);\n });\n } else {\n joinSingleTask(taskOrTasks, cb);\n }\n}\n\nfunction cancelSingleTask(taskToCancel) {\n if (taskToCancel.isRunning()) {\n taskToCancel.cancel();\n }\n}\n\nfunction runCancelEffect(env, taskOrTasks, cb, _ref10) {\n var task = _ref10.task;\n\n if (taskOrTasks === SELF_CANCELLATION) {\n cancelSingleTask(task);\n } else if (array$1(taskOrTasks)) {\n taskOrTasks.forEach(cancelSingleTask);\n } else {\n cancelSingleTask(taskOrTasks);\n }\n\n cb(); // cancel effects are non cancellables\n}\n\nfunction runAllEffect(env, effects, cb, _ref11) {\n var digestEffect = _ref11.digestEffect;\n var effectId = current;\n var keys = Object.keys(effects);\n\n if (keys.length === 0) {\n cb(array$1(effects) ? [] : {});\n return;\n }\n\n var childCallbacks = createAllStyleChildCallbacks(effects, cb);\n keys.forEach(function (key) {\n digestEffect(effects[key], effectId, childCallbacks[key], key);\n });\n}\n\nfunction runRaceEffect(env, effects, cb, _ref12) {\n var digestEffect = _ref12.digestEffect;\n var effectId = current;\n var keys = Object.keys(effects);\n var response = array$1(effects) ? createEmptyArray(keys.length) : {};\n var childCbs = {};\n var completed = false;\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n // Race Auto cancellation\n cb.cancel();\n cb(res, isErr);\n } else {\n cb.cancel();\n completed = true;\n response[key] = res;\n cb(response);\n }\n };\n\n chCbAtKey.cancel = noop;\n childCbs[key] = chCbAtKey;\n });\n\n cb.cancel = function () {\n // prevents unnecessary cancellation\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCbs[key].cancel();\n });\n }\n };\n\n keys.forEach(function (key) {\n if (completed) {\n return;\n }\n\n digestEffect(effects[key], effectId, childCbs[key], key);\n });\n}\n\nfunction runSelectEffect(env, _ref13, cb) {\n var selector = _ref13.selector,\n args = _ref13.args;\n\n try {\n var state = selector.apply(void 0, [env.getState()].concat(args));\n cb(state);\n } catch (error) {\n cb(error, true);\n }\n}\n\nfunction runChannelEffect(env, _ref14, cb) {\n var pattern = _ref14.pattern,\n buffer = _ref14.buffer;\n var chan = channel(buffer);\n var match = matcher(pattern);\n\n var taker = function taker(action) {\n if (!isEnd(action)) {\n env.channel.take(taker, match);\n }\n\n chan.put(action);\n };\n\n var close = chan.close;\n\n chan.close = function () {\n taker.cancel();\n close();\n };\n\n env.channel.take(taker, match);\n cb(chan);\n}\n\nfunction runCancelledEffect(env, data, cb, _ref15) {\n var task = _ref15.task;\n cb(task.isCancelled());\n}\n\nfunction runFlushEffect(env, channel, cb) {\n channel.flush(cb);\n}\n\nfunction runGetContextEffect(env, prop, cb, _ref16) {\n var task = _ref16.task;\n cb(task.context[prop]);\n}\n\nfunction runSetContextEffect(env, props, cb, _ref17) {\n var task = _ref17.task;\n assignWithSymbols(task.context, props);\n cb();\n}\n\nvar effectRunnerMap = (_effectRunnerMap = {}, _effectRunnerMap[TAKE] = runTakeEffect, _effectRunnerMap[PUT] = runPutEffect, _effectRunnerMap[ALL] = runAllEffect, _effectRunnerMap[RACE] = runRaceEffect, _effectRunnerMap[CALL] = runCallEffect, _effectRunnerMap[CPS] = runCPSEffect, _effectRunnerMap[FORK] = runForkEffect, _effectRunnerMap[JOIN] = runJoinEffect, _effectRunnerMap[CANCEL$1] = runCancelEffect, _effectRunnerMap[SELECT] = runSelectEffect, _effectRunnerMap[ACTION_CHANNEL] = runChannelEffect, _effectRunnerMap[CANCELLED$1] = runCancelledEffect, _effectRunnerMap[FLUSH] = runFlushEffect, _effectRunnerMap[GET_CONTEXT] = runGetContextEffect, _effectRunnerMap[SET_CONTEXT] = runSetContextEffect, _effectRunnerMap);\n\n/**\n Used to track a parent task and its forks\n In the fork model, forked tasks are attached by default to their parent\n We model this using the concept of Parent task && main Task\n main task is the main flow of the current Generator, the parent tasks is the\n aggregation of the main tasks + all its forked tasks.\n Thus the whole model represents an execution tree with multiple branches (vs the\n linear execution tree in sequential (non parallel) programming)\n\n A parent tasks has the following semantics\n - It completes if all its forks either complete or all cancelled\n - If it's cancelled, all forks are cancelled as well\n - It aborts if any uncaught error bubbles up from forks\n - If it completes, the return value is the one returned by the main task\n **/\n\nfunction forkQueue(mainTask, onAbort, cont) {\n var tasks = [];\n var result;\n var completed = false;\n addTask(mainTask);\n\n var getTasks = function getTasks() {\n return tasks;\n };\n\n function abort(err) {\n onAbort();\n cancelAll();\n cont(err, true);\n }\n\n function addTask(task) {\n tasks.push(task);\n\n task.cont = function (res, isErr) {\n if (completed) {\n return;\n }\n\n remove(tasks, task);\n task.cont = noop;\n\n if (isErr) {\n abort(res);\n } else {\n if (task === mainTask) {\n result = res;\n }\n\n if (!tasks.length) {\n completed = true;\n cont(result);\n }\n }\n };\n }\n\n function cancelAll() {\n if (completed) {\n return;\n }\n\n completed = true;\n tasks.forEach(function (t) {\n t.cont = noop;\n t.cancel();\n });\n tasks = [];\n }\n\n return {\n addTask: addTask,\n cancelAll: cancelAll,\n abort: abort,\n getTasks: getTasks\n };\n}\n\n// there can be only a single saga error created at any given moment\n\nfunction formatLocation(fileName, lineNumber) {\n return fileName + \"?\" + lineNumber;\n}\n\nfunction effectLocationAsString(effect) {\n var location = getLocation(effect);\n\n if (location) {\n var code = location.code,\n fileName = location.fileName,\n lineNumber = location.lineNumber;\n var source = code + \" \" + formatLocation(fileName, lineNumber);\n return source;\n }\n\n return '';\n}\n\nfunction sagaLocationAsString(sagaMeta) {\n var name = sagaMeta.name,\n location = sagaMeta.location;\n\n if (location) {\n return name + \" \" + formatLocation(location.fileName, location.lineNumber);\n }\n\n return name;\n}\n\nfunction cancelledTasksAsString(sagaStack) {\n var cancelledTasks = flatMap(function (i) {\n return i.cancelledTasks;\n }, sagaStack);\n\n if (!cancelledTasks.length) {\n return '';\n }\n\n return ['Tasks cancelled due to error:'].concat(cancelledTasks).join('\\n');\n}\n\nvar crashedEffect = null;\nvar sagaStack = [];\nvar addSagaFrame = function addSagaFrame(frame) {\n frame.crashedEffect = crashedEffect;\n sagaStack.push(frame);\n};\nvar clear = function clear() {\n crashedEffect = null;\n sagaStack.length = 0;\n}; // this sets crashed effect for the soon-to-be-reported saga frame\n// this slightly streatches the singleton nature of this module into wrong direction\n// as it's even less obvious what's the data flow here, but it is what it is for now\n\nvar setCrashedEffect = function setCrashedEffect(effect) {\n crashedEffect = effect;\n};\n/**\n @returns {string}\n\n @example\n The above error occurred in task errorInPutSaga {pathToFile}\n when executing effect put({type: 'REDUCER_ACTION_ERROR_IN_PUT'}) {pathToFile}\n created by fetchSaga {pathToFile}\n created by rootSaga {pathToFile}\n*/\n\nvar toString = function toString() {\n var firstSaga = sagaStack[0],\n otherSagas = sagaStack.slice(1);\n var crashedEffectLocation = firstSaga.crashedEffect ? effectLocationAsString(firstSaga.crashedEffect) : null;\n var errorMessage = \"The above error occurred in task \" + sagaLocationAsString(firstSaga.meta) + (crashedEffectLocation ? \" \\n when executing effect \" + crashedEffectLocation : '');\n return [errorMessage].concat(otherSagas.map(function (s) {\n return \" created by \" + sagaLocationAsString(s.meta);\n }), [cancelledTasksAsString(sagaStack)]).join('\\n');\n};\n\nfunction newTask(env, mainTask, parentContext, parentEffectId, meta, isRoot, cont) {\n var _task;\n\n if (cont === void 0) {\n cont = noop;\n }\n\n var status = RUNNING;\n var taskResult;\n var taskError;\n var deferredEnd = null;\n var cancelledDueToErrorTasks = [];\n var context = Object.create(parentContext);\n var queue = forkQueue(mainTask, function onAbort() {\n cancelledDueToErrorTasks.push.apply(cancelledDueToErrorTasks, queue.getTasks().map(function (t) {\n return t.meta.name;\n }));\n }, end);\n /**\n This may be called by a parent generator to trigger/propagate cancellation\n cancel all pending tasks (including the main task), then end the current task.\n Cancellation propagates down to the whole execution tree held by this Parent task\n It's also propagated to all joiners of this task and their execution tree/joiners\n Cancellation is noop for terminated/Cancelled tasks tasks\n **/\n\n function cancel() {\n if (status === RUNNING) {\n // Setting status to CANCELLED does not necessarily mean that the task/iterators are stopped\n // effects in the iterator's finally block will still be executed\n status = CANCELLED;\n queue.cancelAll(); // Ending with a TASK_CANCEL will propagate the Cancellation to all joiners\n\n end(TASK_CANCEL, false);\n }\n }\n\n function end(result, isErr) {\n if (!isErr) {\n // The status here may be RUNNING or CANCELLED\n // If the status is CANCELLED, then we do not need to change it here\n if (result === TASK_CANCEL) {\n status = CANCELLED;\n } else if (status !== CANCELLED) {\n status = DONE;\n }\n\n taskResult = result;\n deferredEnd && deferredEnd.resolve(result);\n } else {\n status = ABORTED;\n addSagaFrame({\n meta: meta,\n cancelledTasks: cancelledDueToErrorTasks\n });\n\n if (task.isRoot) {\n var sagaStack = toString(); // we've dumped the saga stack to string and are passing it to user's code\n // we know that it won't be needed anymore and we need to clear it\n\n clear();\n env.onError(result, {\n sagaStack: sagaStack\n });\n }\n\n taskError = result;\n deferredEnd && deferredEnd.reject(result);\n }\n\n task.cont(result, isErr);\n task.joiners.forEach(function (joiner) {\n joiner.cb(result, isErr);\n });\n task.joiners = null;\n }\n\n function setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning('task', props));\n }\n\n assignWithSymbols(context, props);\n }\n\n function toPromise() {\n if (deferredEnd) {\n return deferredEnd.promise;\n }\n\n deferredEnd = deferred();\n\n if (status === ABORTED) {\n deferredEnd.reject(taskError);\n } else if (status !== RUNNING) {\n deferredEnd.resolve(taskResult);\n }\n\n return deferredEnd.promise;\n }\n\n var task = (_task = {}, _task[TASK] = true, _task.id = parentEffectId, _task.meta = meta, _task.isRoot = isRoot, _task.context = context, _task.joiners = [], _task.queue = queue, _task.cancel = cancel, _task.cont = cont, _task.end = end, _task.setContext = setContext, _task.toPromise = toPromise, _task.isRunning = function isRunning() {\n return status === RUNNING;\n }, _task.isCancelled = function isCancelled() {\n return status === CANCELLED || status === RUNNING && mainTask.status === CANCELLED;\n }, _task.isAborted = function isAborted() {\n return status === ABORTED;\n }, _task.result = function result() {\n return taskResult;\n }, _task.error = function error() {\n return taskError;\n }, _task);\n return task;\n}\n\nfunction proc(env, iterator$1, parentContext, parentEffectId, meta, isRoot, cont) {\n if (process.env.NODE_ENV !== 'production' && iterator$1[asyncIteratorSymbol]) {\n throw new Error(\"redux-saga doesn't support async generators, please use only regular ones\");\n }\n\n var finalRunEffect = env.finalizeRunEffect(runEffect);\n /**\n Tracks the current effect cancellation\n Each time the generator progresses. calling runEffect will set a new value\n on it. It allows propagating cancellation to child effects\n **/\n\n next.cancel = noop;\n /** Creates a main task to track the main flow */\n\n var mainTask = {\n meta: meta,\n cancel: cancelMain,\n status: RUNNING\n };\n /**\n Creates a new task descriptor for this generator.\n A task is the aggregation of it's mainTask and all it's forked tasks.\n **/\n\n var task = newTask(env, mainTask, parentContext, parentEffectId, meta, isRoot, cont);\n var executingContext = {\n task: task,\n digestEffect: digestEffect\n };\n /**\n cancellation of the main task. We'll simply resume the Generator with a TASK_CANCEL\n **/\n\n function cancelMain() {\n if (mainTask.status === RUNNING) {\n mainTask.status = CANCELLED;\n next(TASK_CANCEL);\n }\n }\n /**\n attaches cancellation logic to this task's continuation\n this will permit cancellation to propagate down the call chain\n **/\n\n\n if (cont) {\n cont.cancel = task.cancel;\n } // kicks up the generator\n\n\n next(); // then return the task descriptor to the caller\n\n return task;\n /**\n * This is the generator driver\n * It's a recursive async/continuation function which calls itself\n * until the generator terminates or throws\n * @param {internal commands(TASK_CANCEL | TERMINATE) | any} arg - value, generator will be resumed with.\n * @param {boolean} isErr - the flag shows if effect finished with an error\n *\n * receives either (command | effect result, false) or (any thrown thing, true)\n */\n\n function next(arg, isErr) {\n try {\n var result;\n\n if (isErr) {\n result = iterator$1.throw(arg); // user handled the error, we can clear bookkept values\n\n clear();\n } else if (shouldCancel(arg)) {\n /**\n getting TASK_CANCEL automatically cancels the main task\n We can get this value here\n - By cancelling the parent task manually\n - By joining a Cancelled task\n **/\n mainTask.status = CANCELLED;\n /**\n Cancels the current effect; this will propagate the cancellation down to any called tasks\n **/\n\n next.cancel();\n /**\n If this Generator has a `return` method then invokes it\n This will jump to the finally block\n **/\n\n result = func(iterator$1.return) ? iterator$1.return(TASK_CANCEL) : {\n done: true,\n value: TASK_CANCEL\n };\n } else if (shouldTerminate(arg)) {\n // We get TERMINATE flag, i.e. by taking from a channel that ended using `take` (and not `takem` used to trap End of channels)\n result = func(iterator$1.return) ? iterator$1.return() : {\n done: true\n };\n } else {\n result = iterator$1.next(arg);\n }\n\n if (!result.done) {\n digestEffect(result.value, parentEffectId, next);\n } else {\n /**\n This Generator has ended, terminate the main task and notify the fork queue\n **/\n if (mainTask.status !== CANCELLED) {\n mainTask.status = DONE;\n }\n\n mainTask.cont(result.value);\n }\n } catch (error) {\n if (mainTask.status === CANCELLED) {\n throw error;\n }\n\n mainTask.status = ABORTED;\n mainTask.cont(error, true);\n }\n }\n\n function runEffect(effect, effectId, currCb) {\n /**\n each effect runner must attach its own logic of cancellation to the provided callback\n it allows this generator to propagate cancellation downward.\n ATTENTION! effect runners must setup the cancel logic by setting cb.cancel = [cancelMethod]\n And the setup must occur before calling the callback\n This is a sort of inversion of control: called async functions are responsible\n of completing the flow by calling the provided continuation; while caller functions\n are responsible for aborting the current flow by calling the attached cancel function\n Library users can attach their own cancellation logic to promises by defining a\n promise[CANCEL] method in their returned promises\n ATTENTION! calling cancel must have no effect on an already completed or cancelled effect\n **/\n if (promise(effect)) {\n resolvePromise(effect, currCb);\n } else if (iterator(effect)) {\n // resolve iterator\n proc(env, effect, task.context, effectId, meta,\n /* isRoot */\n false, currCb);\n } else if (effect && effect[IO]) {\n var effectRunner = effectRunnerMap[effect.type];\n effectRunner(env, effect.payload, currCb, executingContext);\n } else {\n // anything else returned as is\n currCb(effect);\n }\n }\n\n function digestEffect(effect, parentEffectId, cb, label) {\n if (label === void 0) {\n label = '';\n }\n\n var effectId = nextSagaId();\n env.sagaMonitor && env.sagaMonitor.effectTriggered({\n effectId: effectId,\n parentEffectId: parentEffectId,\n label: label,\n effect: effect\n });\n /**\n completion callback and cancel callback are mutually exclusive\n We can't cancel an already completed effect\n And We can't complete an already cancelled effectId\n **/\n\n var effectSettled; // Completion callback passed to the appropriate effect runner\n\n function currCb(res, isErr) {\n if (effectSettled) {\n return;\n }\n\n effectSettled = true;\n cb.cancel = noop; // defensive measure\n\n if (env.sagaMonitor) {\n if (isErr) {\n env.sagaMonitor.effectRejected(effectId, res);\n } else {\n env.sagaMonitor.effectResolved(effectId, res);\n }\n }\n\n if (isErr) {\n setCrashedEffect(effect);\n }\n\n cb(res, isErr);\n } // tracks down the current cancel\n\n\n currCb.cancel = noop; // setup cancellation logic on the parent cb\n\n cb.cancel = function () {\n // prevents cancelling an already completed effect\n if (effectSettled) {\n return;\n }\n\n effectSettled = true;\n currCb.cancel(); // propagates cancel downward\n\n currCb.cancel = noop; // defensive measure\n\n env.sagaMonitor && env.sagaMonitor.effectCancelled(effectId);\n };\n\n finalRunEffect(effect, effectId, currCb);\n }\n}\n\nvar RUN_SAGA_SIGNATURE = 'runSaga(options, saga, ...args)';\nvar NON_GENERATOR_ERR = RUN_SAGA_SIGNATURE + \": saga argument must be a Generator function!\";\nfunction runSaga(_ref, saga) {\n var _ref$channel = _ref.channel,\n channel = _ref$channel === void 0 ? stdChannel() : _ref$channel,\n dispatch = _ref.dispatch,\n getState = _ref.getState,\n _ref$context = _ref.context,\n context = _ref$context === void 0 ? {} : _ref$context,\n sagaMonitor = _ref.sagaMonitor,\n effectMiddlewares = _ref.effectMiddlewares,\n _ref$onError = _ref.onError,\n onError = _ref$onError === void 0 ? logError : _ref$onError;\n\n if (process.env.NODE_ENV !== 'production') {\n check(saga, func, NON_GENERATOR_ERR);\n }\n\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n var iterator$1 = saga.apply(void 0, args);\n\n if (process.env.NODE_ENV !== 'production') {\n check(iterator$1, iterator, NON_GENERATOR_ERR);\n }\n\n var effectId = nextSagaId();\n\n if (sagaMonitor) {\n // monitors are expected to have a certain interface, let's fill-in any missing ones\n sagaMonitor.rootSagaStarted = sagaMonitor.rootSagaStarted || noop;\n sagaMonitor.effectTriggered = sagaMonitor.effectTriggered || noop;\n sagaMonitor.effectResolved = sagaMonitor.effectResolved || noop;\n sagaMonitor.effectRejected = sagaMonitor.effectRejected || noop;\n sagaMonitor.effectCancelled = sagaMonitor.effectCancelled || noop;\n sagaMonitor.actionDispatched = sagaMonitor.actionDispatched || noop;\n sagaMonitor.rootSagaStarted({\n effectId: effectId,\n saga: saga,\n args: args\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (notUndef(dispatch)) {\n check(dispatch, func, 'dispatch must be a function');\n }\n\n if (notUndef(getState)) {\n check(getState, func, 'getState must be a function');\n }\n\n if (notUndef(effectMiddlewares)) {\n var MIDDLEWARE_TYPE_ERROR = 'effectMiddlewares must be an array of functions';\n check(effectMiddlewares, array$1, MIDDLEWARE_TYPE_ERROR);\n effectMiddlewares.forEach(function (effectMiddleware) {\n return check(effectMiddleware, func, MIDDLEWARE_TYPE_ERROR);\n });\n }\n\n check(onError, func, 'onError passed to the redux-saga is not a function!');\n }\n\n var finalizeRunEffect;\n\n if (effectMiddlewares) {\n var middleware = compose.apply(void 0, effectMiddlewares);\n\n finalizeRunEffect = function finalizeRunEffect(runEffect) {\n return function (effect, effectId, currCb) {\n var plainRunEffect = function plainRunEffect(eff) {\n return runEffect(eff, effectId, currCb);\n };\n\n return middleware(plainRunEffect)(effect);\n };\n };\n } else {\n finalizeRunEffect = identity;\n }\n\n var env = {\n channel: channel,\n dispatch: wrapSagaDispatch(dispatch),\n getState: getState,\n sagaMonitor: sagaMonitor,\n onError: onError,\n finalizeRunEffect: finalizeRunEffect\n };\n return immediately(function () {\n var task = proc(env, iterator$1, context, effectId, getMetaInfo(saga),\n /* isRoot */\n true, undefined);\n\n if (sagaMonitor) {\n sagaMonitor.effectResolved(effectId, task);\n }\n\n return task;\n });\n}\n\nfunction sagaMiddlewareFactory(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$context = _ref.context,\n context = _ref$context === void 0 ? {} : _ref$context,\n _ref$channel = _ref.channel,\n channel = _ref$channel === void 0 ? stdChannel() : _ref$channel,\n sagaMonitor = _ref.sagaMonitor,\n options = _objectWithoutPropertiesLoose(_ref, [\"context\", \"channel\", \"sagaMonitor\"]);\n\n var boundRunSaga;\n\n if (process.env.NODE_ENV !== 'production') {\n check(channel, channel$1, 'options.channel passed to the Saga middleware is not a channel');\n }\n\n function sagaMiddleware(_ref2) {\n var getState = _ref2.getState,\n dispatch = _ref2.dispatch;\n boundRunSaga = runSaga.bind(null, _extends({}, options, {\n context: context,\n channel: channel,\n dispatch: dispatch,\n getState: getState,\n sagaMonitor: sagaMonitor\n }));\n return function (next) {\n return function (action) {\n if (sagaMonitor && sagaMonitor.actionDispatched) {\n sagaMonitor.actionDispatched(action);\n }\n\n var result = next(action); // hit reducers\n\n channel.put(action);\n return result;\n };\n };\n }\n\n sagaMiddleware.run = function () {\n if (process.env.NODE_ENV !== 'production' && !boundRunSaga) {\n throw new Error('Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware');\n }\n\n return boundRunSaga.apply(void 0, arguments);\n };\n\n sagaMiddleware.setContext = function (props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning('sagaMiddleware', props));\n }\n\n assignWithSymbols(context, props);\n };\n\n return sagaMiddleware;\n}\n\nexport default sagaMiddlewareFactory;\nexport { END, channel, eventChannel, isEnd, multicastChannel, runSaga, stdChannel };\n","function deferred() {\n var def = {};\n def.promise = new Promise(function (resolve, reject) {\n def.resolve = resolve;\n def.reject = reject;\n });\n return def;\n}\nfunction arrayOfDeferred(length) {\n var arr = [];\n\n for (var i = 0; i < length; i++) {\n arr.push(deferred());\n }\n\n return arr;\n}\n\nexport default deferred;\nexport { arrayOfDeferred };\n","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nvar __export = (target, all2) => {\n for (var name in all2)\n __defProp(target, name, { get: all2[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, \"default\"), secondTarget && __copyProps(secondTarget, mod, \"default\"));\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/utils/constants.ts\nvar DEFAULT_HOST = \"wss://relay.signalwire.com\";\nvar EVENT_NAMESPACE_DIVIDER = \":\";\nvar LOCAL_EVENT_PREFIX = \"__local__\";\nvar SYNTHETIC_EVENT_PREFIX = \"__synthetic__\";\nvar PRODUCT_PREFIX_VIDEO = \"video\";\nvar PRODUCT_PREFIX_CHAT = \"chat\";\nvar PRODUCT_PREFIX_PUBSUB = \"chat\";\nvar GLOBAL_VIDEO_EVENTS = [\"room.started\", \"room.ended\"];\nvar INTERNAL_GLOBAL_VIDEO_EVENTS = GLOBAL_VIDEO_EVENTS.map((event) => `${PRODUCT_PREFIX_VIDEO}.${event}`);\n\n// src/utils/logger.ts\nimport log from \"loglevel\";\nvar datetime = () => new Date().toISOString();\nvar defaultLogger = log.getLogger(\"signalwire\");\nvar originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return function(...args) {\n args.unshift(datetime(), \"-\");\n rawMethod.apply(void 0, args);\n };\n};\nvar defaultLoggerLevel = process.env.NODE_ENV === \"development\" ? defaultLogger.levels.DEBUG : defaultLogger.getLevel();\ndefaultLogger.setLevel(defaultLoggerLevel);\nvar userLogger;\nvar setLogger = (logger) => {\n userLogger = logger;\n};\nvar debugOptions = {};\nvar setDebugOptions = (options) => {\n if (options == null) {\n debugOptions = {};\n return;\n }\n Object.assign(debugOptions, options);\n};\nvar getLoggerInstance = () => {\n return userLogger != null ? userLogger : defaultLogger;\n};\nvar shouldStringify = (payload) => {\n if (\"method\" in payload && payload.method === \"signalwire.ping\") {\n return false;\n }\n return true;\n};\nvar wsTraffic = ({ type, payload }) => {\n const logger = getLoggerInstance();\n const { logWsTraffic } = debugOptions || {};\n if (!logWsTraffic) {\n return void 0;\n }\n const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;\n return logger.info(`${type.toUpperCase()}: \n`, msg, \"\\n\");\n};\nvar getLogger = () => {\n const logger = getLoggerInstance();\n return new Proxy(logger, {\n get(target, prop, receiver) {\n if (prop === \"wsTraffic\") {\n return wsTraffic;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n};\n\n// src/utils/common.ts\nvar UPPERCASE_REGEX = /[A-Z]/g;\nvar fromCamelToSnakeCase = (event) => {\n return event.replace(UPPERCASE_REGEX, (letter) => {\n return `_${letter.toLowerCase()}`;\n });\n};\nvar WEBRTC_EVENT_TYPES = [\n \"webrtc.message\"\n];\nvar isWebrtcEventType = (eventType) => {\n return WEBRTC_EVENT_TYPES.includes(eventType);\n};\n\n// src/utils/index.ts\nimport { v4 } from \"uuid\";\n\n// src/utils/parseRPCResponse.ts\nvar parseRPCResponse = ({\n response,\n request\n}) => {\n const { result = {}, error } = response;\n if (error) {\n return {\n error\n };\n }\n switch (request.method) {\n case \"signalwire.connect\":\n return { result };\n default:\n return parseResponse(response);\n }\n};\nvar whitelistCodeRegex = /^2[0-9][0-9]$/;\nvar parseResponse = (response, nodeId) => {\n const { result = {}, error } = response;\n if (error) {\n return { error };\n }\n const { code, node_id, result: nestedResult = null } = result;\n if (code && !whitelistCodeRegex.test(code)) {\n return { error: result };\n }\n if (nestedResult === null) {\n if (nodeId) {\n result.node_id = nodeId;\n }\n return { result };\n }\n if (nestedResult) {\n if (nestedResult.jsonrpc) {\n return parseResponse(nestedResult, node_id);\n }\n return { result: nestedResult };\n }\n return { result };\n};\n\n// src/utils/toExternalJSON.ts\nvar toDateObject = (timestamp) => {\n if (typeof timestamp === \"undefined\") {\n return timestamp;\n }\n const date = new Date(timestamp * 1e3);\n if (isNaN(date.getTime())) {\n return timestamp;\n }\n return date;\n};\nvar DEFAULT_OPTIONS = {\n propsToUpdateValue: [\n \"updated\",\n \"layers\",\n \"members\",\n \"recordings\",\n \"playbacks\"\n ]\n};\nvar isTimestampProperty = (prop) => {\n return prop.endsWith(\"At\");\n};\nvar toExternalJSON = (input, options = DEFAULT_OPTIONS) => {\n if ((input == null ? void 0 : input.__sw_symbol) || (input == null ? void 0 : input.__sw_proxy)) {\n return input;\n }\n return Object.entries(input).reduce((reducer, [key, value]) => {\n const prop = fromSnakeToCamelCase(key);\n const propType = typeof value;\n if (propType === \"object\" && value) {\n if (Array.isArray(value)) {\n if (options.propsToUpdateValue.includes(key)) {\n reducer[prop] = value.map((v) => {\n if (typeof v === \"string\") {\n return fromSnakeToCamelCase(v);\n }\n return toExternalJSON(v);\n });\n } else {\n reducer[prop] = value;\n }\n } else {\n reducer[prop] = toExternalJSON(value);\n }\n } else {\n if (isTimestampProperty(prop)) {\n reducer[prop] = toDateObject(value);\n } else {\n reducer[prop] = value;\n }\n }\n return reducer;\n }, {});\n};\nvar fromSnakeToCamelCase = (input) => {\n if (!input.includes(\"_\")) {\n return input;\n }\n return input.split(\"_\").reduce((reducer, part, index) => {\n const fc = part.trim().charAt(0);\n const remainingChars = part.substr(1).toLowerCase();\n return `${reducer}${index === 0 ? fc.toLowerCase() : fc.toUpperCase()}${remainingChars}`;\n }, \"\");\n};\n\n// src/utils/toInternalEventName.ts\nvar toInternalEventName = ({\n event,\n namespace\n}) => {\n if (typeof event === \"string\") {\n event = getNamespacedEvent({\n event,\n namespace\n });\n event = fromCamelToSnakeCase(event);\n }\n return event;\n};\nvar getNamespacedEvent = ({\n namespace,\n event\n}) => {\n if (!namespace || event.startsWith(namespace)) {\n return event;\n }\n return `${namespace}${EVENT_NAMESPACE_DIVIDER}${event}`;\n};\n\n// src/utils/toInternalAction.ts\nvar toInternalAction = (event) => {\n const { event_type, params, node_id } = event;\n if (event_type === \"queuing.relay.tasks\") {\n return {\n type: event_type,\n payload: event\n };\n }\n if (isWebrtcEventType(event_type) && (params == null ? void 0 : params.jsonrpc)) {\n const vertoRPC = params;\n if (vertoRPC.params) {\n vertoRPC.params.nodeId = node_id;\n }\n return {\n type: event_type,\n payload: vertoRPC\n };\n }\n return {\n type: event_type,\n payload: params\n };\n};\n\n// src/utils/toSnakeCaseKeys.ts\nvar toSnakeCaseKeys = (obj, transform = (value) => value, result = {}) => {\n if (Array.isArray(obj)) {\n result = obj.map((item, index) => {\n if (typeof item === \"object\") {\n return toSnakeCaseKeys(item, transform, result[index]);\n }\n return item;\n });\n } else {\n Object.keys(obj).forEach((key) => {\n const newKey = fromCamelToSnakeCase(key);\n if (obj[key] && typeof obj[key] === \"object\") {\n result[newKey] = toSnakeCaseKeys(obj[key], transform, result[newKey]);\n } else {\n result[newKey] = transform(obj[key]);\n }\n });\n }\n return result;\n};\n\n// src/utils/extendComponent.ts\nvar extendComponent = (klass, methods) => {\n Object.keys(methods).forEach((methodName) => {\n if (klass.prototype.hasOwnProperty(methodName)) {\n throw new Error(`[extendComponent] Duplicated method name: ${methodName}`);\n }\n });\n Object.defineProperties(klass.prototype, methods);\n return klass;\n};\n\n// src/utils/debounce.ts\nfunction debounce(fn, wait2 = 0, callFirst) {\n let timeout = null;\n let debouncedFn = null;\n const clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n debouncedFn = null;\n timeout = null;\n }\n };\n const flush = function() {\n const call4 = debouncedFn;\n clear();\n if (call4) {\n call4();\n }\n };\n const debounceWrapper = function() {\n if (!wait2) {\n return fn.apply(this, arguments);\n }\n const context = this;\n const args = arguments;\n const callNow = callFirst && !timeout;\n clear();\n debouncedFn = function() {\n fn.apply(context, args);\n };\n timeout = setTimeout(function() {\n timeout = null;\n if (!callNow) {\n const call4 = debouncedFn;\n debouncedFn = null;\n return call4 == null ? void 0 : call4();\n }\n }, wait2);\n if (callNow && debouncedFn) {\n return debouncedFn();\n }\n };\n debounceWrapper.cancel = clear;\n debounceWrapper.flush = flush;\n return debounceWrapper;\n}\n\n// src/utils/SWCloseEvent.ts\nvar SWCloseEvent = class {\n constructor(type, options = {}) {\n this.type = type;\n __publicField(this, \"code\");\n __publicField(this, \"reason\");\n __publicField(this, \"wasClean\");\n this.code = options.code === void 0 ? 0 : options.code;\n this.reason = options.reason === void 0 ? \"\" : options.reason;\n this.wasClean = options.wasClean === void 0 ? false : options.wasClean;\n }\n};\n\n// src/utils/eventUtils.ts\nvar stripNamespacePrefix = (event, namespace) => {\n if (namespace && typeof namespace === \"string\") {\n const regex = new RegExp(`^${namespace}.`);\n return event.replace(regex, \"\");\n }\n const items = event.split(\".\");\n if (items.length > 1) {\n items.shift();\n return items.join(\".\");\n }\n return event;\n};\nvar capabilityStringToObjectMap = {\n device: { device: true },\n \"digit.send\": { sendDigit: true },\n end: { end: true },\n \"layout.set\": { setLayout: true },\n screenshare: { screenshare: true },\n \"vmuted.hide.on\": { vmutedHide: { on: true } },\n \"vmuted.hide.off\": { vmutedHide: { off: true } },\n \"lock.on\": { lock: { on: true } },\n \"lock.off\": { lock: { off: true } },\n \"member.position.set\": { member: { position: true } },\n \"member.meta\": { member: { meta: true } },\n \"member.remove\": { member: { remove: true } },\n \"member.microphone.volume.set\": {\n member: { microphoneVolume: true }\n },\n \"member.microphone.sensitivity.set\": {\n member: { microphoneSensitivity: true }\n },\n \"member.speaker.volume.set\": {\n member: { speakerVolume: true }\n },\n \"member.deaf.on\": { member: { deaf: { on: true } } },\n \"member.deaf.off\": { member: { deaf: { off: true } } },\n \"member.mute.audio.on\": {\n member: { muteAudio: { on: true } }\n },\n \"member.mute.audio.off\": {\n member: { muteAudio: { off: true } }\n },\n \"member.mute.video.on\": {\n member: { muteVideo: { on: true } }\n },\n \"member.mute.video.off\": {\n member: { muteVideo: { off: true } }\n },\n \"member.raisehand.on\": {\n member: { raisehand: { on: true } }\n },\n \"member.raisehand.off\": {\n member: { raisehand: { off: true } }\n },\n \"self.position.set\": { self: { position: true } },\n \"self.meta\": { self: { meta: true } },\n \"self.remove\": { self: { remove: true } },\n \"self.microphone\": {\n self: { microphoneVolume: true, microphoneSensitivity: true }\n },\n \"self.microphone.volume.set\": {\n self: { microphoneVolume: true }\n },\n \"self.microphone.sensitivity.set\": {\n self: { microphoneSensitivity: true }\n },\n \"self.speaker.volume.set\": {\n self: { speakerVolume: true }\n },\n \"self.deaf.on\": { self: { deaf: { on: true } } },\n \"self.deaf.off\": { self: { deaf: { off: true } } },\n \"self.mute.audio.on\": {\n self: { muteAudio: { on: true } }\n },\n \"self.mute.audio.off\": {\n self: { muteAudio: { off: true } }\n },\n \"self.mute.video.on\": {\n self: { muteVideo: { on: true } }\n },\n \"self.mute.video.off\": {\n self: { muteVideo: { off: true } }\n },\n \"self.raisehand.on\": {\n self: { raisehand: { on: true } }\n },\n \"self.raisehand.off\": {\n self: { raisehand: { off: true } }\n }\n};\nvar isObjectGuard = (o) => o instanceof Object;\nvar capabilityStringToObjects = (capability) => Object.entries(capabilityStringToObjectMap).filter(([key]) => key.startsWith(capability)).map(([_, value]) => value);\nvar mergeCapabilityObjects = (target, source) => {\n const result = __spreadValues({}, target);\n for (const key in source) {\n if (result[key] && isObjectGuard(target[key]) && isObjectGuard(source[key])) {\n result[key] = mergeCapabilityObjects(target[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n};\nvar mapCapabilityPayload = (capabilities) => capabilities.flatMap(capabilityStringToObjects).reduce(mergeCapabilityObjects, {});\n\n// src/utils/index.ts\nvar safeParseJson = (value) => {\n if (typeof value !== \"string\") {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch (error) {\n return value;\n }\n};\nvar PROTOCOL_PATTERN = /^(ws|wss):\\/\\//;\nvar checkWebSocketHost = (host) => {\n const protocol = PROTOCOL_PATTERN.test(host) ? \"\" : \"wss://\";\n return `${protocol}${host}`;\n};\nvar timeoutPromise = (promise, time, exception) => {\n let timer = null;\n return Promise.race([\n promise,\n new Promise((_resolve, reject) => timer = setTimeout(reject, time, exception))\n ]).finally(() => clearTimeout(timer));\n};\nvar isGlobalEvent = (event) => {\n return GLOBAL_VIDEO_EVENTS.includes(event);\n};\nvar isSyntheticEvent = (event) => {\n return event.includes(SYNTHETIC_EVENT_PREFIX);\n};\nvar isSessionEvent = (event) => {\n return event.includes(\"session.\");\n};\nvar cleanupEventNamespace = (event) => {\n const eventParts = event.split(EVENT_NAMESPACE_DIVIDER);\n return eventParts[eventParts.length - 1];\n};\nvar WITH_CUSTOM_EVENT_NAMES = [\n \"video.member.updated\",\n \"video.member.talking\"\n];\nvar CLIENT_SIDE_EVENT_NAMES = [\n \"video.room.joined\",\n \"video.track\",\n \"video.active\",\n \"video.answering\",\n \"video.destroy\",\n \"video.early\",\n \"video.hangup\",\n \"video.held\",\n \"video.new\",\n \"video.purge\",\n \"video.recovering\",\n \"video.requesting\",\n \"video.ringing\",\n \"video.trying\",\n \"video.media.connected\",\n \"video.media.reconnecting\",\n \"video.media.disconnected\",\n \"video.microphone.updated\",\n \"video.camera.updated\",\n \"video.speaker.updated\",\n \"video.microphone.disconnected\",\n \"video.camera.disconnected\",\n \"video.speaker.disconnected\"\n];\nvar validateEventsToSubscribe = (events) => {\n const valid = events.map((internalEvent) => {\n if (typeof internalEvent === \"string\") {\n const event = cleanupEventNamespace(internalEvent);\n if (CLIENT_SIDE_EVENT_NAMES.includes(event) || isSyntheticEvent(event) || isLocalEvent(event) || isSessionEvent(event)) {\n return null;\n }\n const found = WITH_CUSTOM_EVENT_NAMES.find((withCustomName) => {\n return event.startsWith(withCustomName);\n });\n return found || event;\n }\n return internalEvent;\n });\n return Array.from(new Set(valid)).filter(Boolean);\n};\nvar isLocalEvent = (event) => {\n return event.includes(LOCAL_EVENT_PREFIX);\n};\nvar toLocalEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(LOCAL_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar toSyntheticEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(SYNTHETIC_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar isJSONRPCRequest = (e) => {\n return Boolean(e.method);\n};\nvar isJSONRPCResponse = (e) => {\n return !isJSONRPCRequest(e);\n};\nvar isSATAuth = (e) => {\n return typeof e !== \"undefined\" && \"jti\" in e;\n};\n\n// src/RPCMessages/helpers.ts\nvar makeRPCRequest = (params) => {\n var _a;\n return __spreadValues({\n jsonrpc: \"2.0\",\n id: (_a = params.id) != null ? _a : v4()\n }, params);\n};\nvar makeRPCResponse = (params) => {\n return __spreadValues({\n jsonrpc: \"2.0\"\n }, params);\n};\n\n// src/RPCMessages/RPCConnect.ts\nvar DEFAULT_CONNECT_VERSION = {\n major: 3,\n minor: 0,\n revision: 0\n};\nvar UNIFIED_CONNECT_VERSION = {\n major: 4,\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 event_acks: true\n }, params)\n });\n};\n\n// src/RPCMessages/RPCReauthenticate.ts\nvar RPCReauthenticate = (authentication) => {\n return makeRPCRequest({\n method: \"signalwire.reauthenticate\",\n params: {\n authentication\n }\n });\n};\n\n// src/RPCMessages/RPCPing.ts\nvar RPCPing = () => {\n return makeRPCRequest({\n method: \"signalwire.ping\",\n params: {\n timestamp: Date.now() / 1e3\n }\n });\n};\nvar RPCPingResponse = (id, timestamp) => {\n return makeRPCResponse({\n id,\n result: {\n timestamp: timestamp || Date.now() / 1e3\n }\n });\n};\n\n// src/RPCMessages/RPCExecute.ts\nvar RPCExecute = ({ method, params }) => {\n return makeRPCRequest({\n method,\n params\n });\n};\n\n// src/RPCMessages/RPCDisconnect.ts\nvar RPCDisconnectResponse = (id) => {\n return makeRPCResponse({\n id,\n result: {}\n });\n};\n\n// src/RPCMessages/VertoMessages.ts\nvar tmpMap = {\n id: \"callID\",\n destinationNumber: \"destination_number\",\n remoteCallerName: \"remote_caller_id_name\",\n remoteCallerNumber: \"remote_caller_id_number\",\n callerName: \"caller_id_name\",\n callerNumber: \"caller_id_number\"\n};\nvar filterVertoParams = (params) => {\n if (params.hasOwnProperty(\"dialogParams\")) {\n const _a = params.dialogParams, {\n remoteSdp,\n localStream,\n remoteStream\n } = _a, dialogParams = __objRest(_a, [\n \"remoteSdp\",\n \"localStream\",\n \"remoteStream\"\n ]);\n for (const key in tmpMap) {\n if (key && dialogParams.hasOwnProperty(key)) {\n dialogParams[tmpMap[key]] = dialogParams[key];\n delete dialogParams[key];\n }\n }\n params.dialogParams = dialogParams;\n }\n return params;\n};\nvar buildVertoRPCMessage = (method) => {\n return (params = {}) => {\n return makeRPCRequest({\n method,\n params: filterVertoParams(params)\n });\n };\n};\nvar VertoInvite = buildVertoRPCMessage(\"verto.invite\");\nvar VertoBye = buildVertoRPCMessage(\"verto.bye\");\nvar VertoAttach = buildVertoRPCMessage(\"verto.attach\");\nvar VertoModify = buildVertoRPCMessage(\"verto.modify\");\nvar VertoInfo = buildVertoRPCMessage(\"verto.info\");\nvar VertoAnswer = buildVertoRPCMessage(\"verto.answer\");\nvar VertoSubscribe = buildVertoRPCMessage(\"verto.subscribe\");\nvar VertoPong = buildVertoRPCMessage(\"verto.pong\");\nvar VertoResult = (id, method) => {\n return makeRPCResponse({\n id,\n result: {\n method\n }\n });\n};\n\n// src/RPCMessages/RPCEventAck.ts\nvar RPCEventAckResponse = (id) => makeRPCResponse({ id, result: {} });\n\n// src/redux/actions.ts\nvar actions_exports = {};\n__export(actions_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n createAction: () => createAction,\n destroyAction: () => destroyAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\n\n// src/redux/toolkit/index.ts\nvar toolkit_exports = {};\n__export(toolkit_exports, {\n configureStore: () => configureStore,\n createAction: () => createAction\n});\n__reExport(toolkit_exports, redux_star);\nimport * as redux_star from \"redux\";\n\n// src/redux/toolkit/createAction.ts\nfunction createAction(type, prepareAction) {\n function actionCreator(...args) {\n if (prepareAction) {\n let prepared = prepareAction(...args);\n if (!prepared) {\n throw new Error(\"prepareAction did not return an object\");\n }\n return __spreadValues(__spreadValues({\n type,\n payload: prepared.payload\n }, \"meta\" in prepared && { meta: prepared.meta }), \"error\" in prepared && { error: prepared.error });\n }\n return { type, payload: args[0] };\n }\n actionCreator.toString = () => `${type}`;\n actionCreator.type = type;\n actionCreator.match = (action) => action.type === type;\n return actionCreator;\n}\n\n// src/redux/toolkit/configureStore.ts\nimport { createStore, compose as compose2, applyMiddleware, combineReducers } from \"redux\";\n\n// src/redux/toolkit/devtoolsExtension.ts\nimport { compose } from \"redux\";\nvar composeWithDevTools = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {\n if (arguments.length === 0)\n return void 0;\n if (typeof arguments[0] === \"object\")\n return compose;\n return compose.apply(null, arguments);\n};\nvar devToolsEnhancer = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() {\n return function(noop) {\n return noop;\n };\n};\n\n// src/redux/toolkit/isPlainObject.ts\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null)\n return false;\n let proto = Object.getPrototypeOf(value);\n if (proto === null)\n return true;\n let baseProto = proto;\n while (Object.getPrototypeOf(baseProto) !== null) {\n baseProto = Object.getPrototypeOf(baseProto);\n }\n return proto === baseProto;\n}\n\n// src/redux/toolkit/getDefaultMiddleware.ts\nfunction curryGetDefaultMiddleware() {\n return function curriedGetDefaultMiddleware() {\n return [];\n };\n}\n\n// src/redux/toolkit/configureStore.ts\nvar IS_PRODUCTION = process.env.NODE_ENV === \"production\";\nfunction configureStore(options) {\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware();\n const {\n reducer = void 0,\n middleware = curriedGetDefaultMiddleware(),\n devTools = true,\n preloadedState = void 0,\n enhancers = void 0\n } = options || {};\n let rootReducer2;\n if (typeof reducer === \"function\") {\n rootReducer2 = reducer;\n } else if (isPlainObject(reducer)) {\n rootReducer2 = combineReducers(reducer);\n } else {\n throw new Error('\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');\n }\n let finalMiddleware = middleware;\n if (typeof finalMiddleware === \"function\") {\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware);\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\n throw new Error(\"when using a middleware builder function, an array of middleware must be returned\");\n }\n }\n if (!IS_PRODUCTION && finalMiddleware.some((item) => typeof item !== \"function\")) {\n throw new Error(\"each middleware provided to configureStore must be a function\");\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n let finalCompose = compose2;\n if (devTools) {\n finalCompose = composeWithDevTools(__spreadValues({\n trace: !IS_PRODUCTION\n }, typeof devTools === \"object\" && devTools));\n }\n let storeEnhancers = [middlewareEnhancer];\n if (Array.isArray(enhancers)) {\n storeEnhancers = [middlewareEnhancer, ...enhancers];\n } else if (typeof enhancers === \"function\") {\n storeEnhancers = enhancers(storeEnhancers);\n }\n const composedEnhancer = finalCompose(...storeEnhancers);\n return createStore(rootReducer2, preloadedState, composedEnhancer);\n}\n\n// src/redux/actions.ts\nvar initAction = createAction(\"swSdk/init\");\nvar destroyAction = createAction(\"swSdk/destroy\");\nvar reauthAction = createAction(\"swSdk/reauth\");\nvar authErrorAction = createAction(\"auth/error\");\nvar authSuccessAction = createAction(\"auth/success\");\nvar authExpiringAction = createAction(\"auth/expiring\");\nvar socketMessageAction = createAction(\"socket/message\");\nvar sessionDisconnectedAction = createAction(\"session.disconnected\");\nvar sessionReconnectingAction = createAction(\"session.reconnecting\");\nvar sessionForceCloseAction = createAction(\"session.forceClose\");\nvar formatCustomSagaAction = (id, action) => {\n return `${action.type}/${id}`;\n};\nvar makeCustomSagaAction = (id, action) => {\n return __spreadProps(__spreadValues({}, action), {\n type: formatCustomSagaAction(id, action)\n });\n};\nvar getCustomSagaActionType = (id, action) => {\n return formatCustomSagaAction(id, action);\n};\n\n// src/redux/toolkit/mapBuilders.ts\nfunction executeReducerBuilderCallback(builderCallback) {\n const actionsMap = {};\n const actionMatchers = [];\n let defaultCaseReducer;\n const builder = {\n addCase(typeOrActionCreator, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (actionMatchers.length > 0) {\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addMatcher`\");\n }\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n const type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\n if (type in actionsMap) {\n throw new Error(\"addCase cannot be called with two reducers for the same action type\");\n }\n actionsMap[type] = reducer;\n return builder;\n },\n addMatcher(matcher, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n actionMatchers.push({ matcher, reducer });\n return builder;\n },\n addDefaultCase(reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(\"`builder.addDefaultCase` can only be called once\");\n }\n }\n defaultCaseReducer = reducer;\n return builder;\n }\n };\n builderCallback(builder);\n return [actionsMap, actionMatchers, defaultCaseReducer];\n}\n\n// src/redux/toolkit/createReducer.ts\nfunction isStateFunction(x) {\n return typeof x === \"function\";\n}\nfunction createReducer(initialState, mapOrBuilderCallback, actionMatchers = [], defaultCaseReducer) {\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = typeof mapOrBuilderCallback === \"function\" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer];\n let getInitialState;\n if (isStateFunction(initialState)) {\n getInitialState = () => initialState();\n } else {\n getInitialState = () => initialState;\n }\n function reducer(state = getInitialState(), action) {\n let caseReducers = [\n actionsMap[action.type],\n ...finalActionMatchers.filter(({ matcher }) => matcher(action)).map(({ reducer: reducer2 }) => reducer2)\n ];\n if (caseReducers.filter((cr) => !!cr).length === 0) {\n caseReducers = [finalDefaultCaseReducer];\n }\n return caseReducers.reduce((previousState, caseReducer) => {\n if (caseReducer) {\n return caseReducer(previousState, action);\n }\n return previousState;\n }, state);\n }\n reducer.getInitialState = getInitialState;\n return reducer;\n}\n\n// src/redux/toolkit/createSlice.ts\nfunction getType(slice, actionKey) {\n return `${slice}/${actionKey}`;\n}\nfunction createSlice(options) {\n const { name } = options;\n if (!name) {\n throw new Error(\"`name` is a required option for createSlice\");\n }\n const initialState = options.initialState;\n const reducers = options.reducers || {};\n const reducerNames = Object.keys(reducers);\n const sliceCaseReducersByName = {};\n const sliceCaseReducersByType = {};\n const actionCreators = {};\n reducerNames.forEach((reducerName) => {\n const maybeReducerWithPrepare = reducers[reducerName];\n const type = getType(name, reducerName);\n let caseReducer;\n let prepareCallback;\n if (\"reducer\" in maybeReducerWithPrepare) {\n caseReducer = maybeReducerWithPrepare.reducer;\n prepareCallback = maybeReducerWithPrepare.prepare;\n } else {\n caseReducer = maybeReducerWithPrepare;\n }\n sliceCaseReducersByName[reducerName] = caseReducer;\n sliceCaseReducersByType[type] = caseReducer;\n actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type);\n });\n function buildReducer() {\n const [\n extraReducers = {},\n actionMatchers = [],\n defaultCaseReducer = void 0\n ] = typeof options.extraReducers === \"function\" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers];\n const finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType);\n return createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer);\n }\n let _reducer;\n return {\n name,\n reducer(state, action) {\n if (!_reducer)\n _reducer = buildReducer();\n return _reducer(state, action);\n },\n actions: actionCreators,\n caseReducers: sliceCaseReducersByName,\n getInitialState() {\n if (!_reducer)\n _reducer = buildReducer();\n return _reducer.getInitialState();\n }\n };\n}\n\n// src/redux/utils/createDestroyableSlice.ts\nvar createDestroyableSlice = ({\n name = \"\",\n initialState,\n reducers,\n extraReducers\n}) => {\n return createSlice({\n name,\n initialState,\n reducers,\n extraReducers: (builder) => {\n builder.addCase(destroyAction.type, () => {\n return initialState;\n });\n if (typeof extraReducers === \"function\") {\n extraReducers(builder);\n }\n }\n });\n};\n\n// src/redux/features/session/sessionSlice.ts\nvar initialSessionState = {\n protocol: \"\",\n iceServers: [],\n authStatus: \"unknown\",\n authState: void 0,\n authError: void 0,\n authCount: 0\n};\nfunction authorizingAction(action) {\n return [initAction.type, reauthAction.type].includes(action.type);\n}\nvar sessionSlice = createDestroyableSlice({\n name: \"session\",\n initialState: initialSessionState,\n reducers: {\n connected: (state, { payload }) => {\n var _a, _b;\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorized\",\n authState: payload == null ? void 0 : payload.authorization,\n authCount: state.authCount + 1,\n protocol: (_a = payload == null ? void 0 : payload.protocol) != null ? _a : \"\",\n iceServers: (_b = payload == null ? void 0 : payload.ice_servers) != null ? _b : []\n });\n },\n authStatus: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: payload\n });\n },\n updateAuthState: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authState: payload\n });\n }\n },\n extraReducers: (builder) => {\n builder.addCase(authErrorAction.type, (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"unauthorized\",\n authError: payload.error\n });\n });\n builder.addMatcher(authorizingAction, (state) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorizing\"\n });\n });\n }\n});\nvar {\n actions: sessionActions,\n reducer: sessionReducer\n} = sessionSlice;\n\n// src/BaseSession.ts\nvar SW_SYMBOL = Symbol(\"BaseSession\");\nvar randomInt = (min, max) => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\nvar reconnectDelay = () => {\n return randomInt(1, 4) * 1e3;\n};\nvar BaseSession = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"__sw_symbol\", SW_SYMBOL);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"WebSocketConstructor\");\n __publicField(this, \"CloseEventConstructor\");\n __publicField(this, \"agent\");\n __publicField(this, \"connectVersion\", DEFAULT_CONNECT_VERSION);\n __publicField(this, \"_rpcConnectResult\");\n __publicField(this, \"_requests\", /* @__PURE__ */ new Map());\n __publicField(this, \"_socket\", null);\n __publicField(this, \"_host\", DEFAULT_HOST);\n __publicField(this, \"_executeTimeoutMs\", 10 * 1e3);\n __publicField(this, \"_executeTimeoutError\", Symbol.for(\"sw-execute-timeout\"));\n __publicField(this, \"_executeQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_swConnectError\", Symbol.for(\"sw-connect-error\"));\n __publicField(this, \"_executeConnectionClosed\", Symbol.for(\"sw-execute-connection-closed\"));\n __publicField(this, \"_checkPingDelay\", 15 * 1e3);\n __publicField(this, \"_checkPingTimer\", null);\n __publicField(this, \"_reconnectTimer\");\n __publicField(this, \"_status\", \"unknown\");\n __publicField(this, \"_sessionChannel\");\n __publicField(this, \"wsOpenHandler\");\n __publicField(this, \"wsCloseHandler\");\n __publicField(this, \"wsErrorHandler\");\n var _a, _b;\n const { host, logLevel = \"info\", sessionChannel } = options;\n if (host) {\n this._host = checkWebSocketHost(host);\n }\n if (sessionChannel) {\n this._sessionChannel = sessionChannel;\n }\n if (logLevel) {\n (_b = (_a = this.logger).setLevel) == null ? void 0 : _b.call(_a, logLevel);\n }\n this._onSocketOpen = this._onSocketOpen.bind(this);\n this._onSocketError = this._onSocketError.bind(this);\n this._onSocketClose = this._onSocketClose.bind(this);\n this._onSocketMessage = this._onSocketMessage.bind(this);\n this.execute = this.execute.bind(this);\n this.connect = this.connect.bind(this);\n this.wsOpenHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"open\", this.wsOpenHandler);\n this._onSocketOpen(event);\n };\n this.wsCloseHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"close\", this.wsCloseHandler);\n this._onSocketClose(event);\n };\n this.wsErrorHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"error\", this.wsErrorHandler);\n this._onSocketError(event);\n };\n }\n get host() {\n return this._host;\n }\n get rpcConnectResult() {\n return this._rpcConnectResult;\n }\n get relayProtocol() {\n var _a, _b;\n return (_b = (_a = this._rpcConnectResult) == null ? void 0 : _a.protocol) != null ? _b : \"\";\n }\n get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult;\n return authorization.signature;\n }\n return void 0;\n }\n get logger() {\n return getLogger();\n }\n get connecting() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 0 /* CONNECTING */;\n }\n get connected() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 1 /* OPEN */;\n }\n get closing() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 2 /* CLOSING */;\n }\n get closed() {\n return this._socket ? this._socket.readyState === 3 /* CLOSED */ : true;\n }\n get status() {\n return this._status;\n }\n get idle() {\n return this._status === \"idle\";\n }\n get ready() {\n return !Boolean(this.idle || !this.connected);\n }\n set token(token) {\n this.options.token = token;\n }\n connect() {\n if (!(this == null ? void 0 : this.WebSocketConstructor)) {\n throw new Error(\"Missing WebSocketConstructor\");\n }\n if (!(this == null ? void 0 : this.CloseEventConstructor)) {\n throw new Error(\"Missing CloseEventConstructor\");\n }\n this._clearTimers();\n if (this.connecting || this.connected) {\n this.logger.warn(\"Session already connected.\");\n return;\n }\n this._removeSocketListeners();\n this.destroySocket();\n this._clearCheckPingTimer();\n this._socket = this._createSocket();\n this._addSocketListeners();\n }\n _createSocket() {\n return new this.WebSocketConstructor(this._host);\n }\n destroySocket() {\n if (this._socket) {\n this._socket.close();\n this.wsCloseHandler(new this.CloseEventConstructor(\"close\", {\n reason: \"Client-side closed\"\n }));\n this._socket = null;\n }\n }\n _addSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to add listeners\");\n }\n this._removeSocketListeners();\n this._socket.addEventListener(\"open\", this.wsOpenHandler);\n this._socket.addEventListener(\"close\", this.wsCloseHandler);\n this._socket.addEventListener(\"error\", this.wsErrorHandler);\n this._socket.addEventListener(\"message\", this._onSocketMessage);\n }\n _removeSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to remove listeners\");\n }\n this._socket.removeEventListener(\"open\", this.wsOpenHandler);\n this._socket.removeEventListener(\"close\", this.wsCloseHandler);\n this._socket.removeEventListener(\"error\", this.wsErrorHandler);\n this._socket.removeEventListener(\"message\", this._onSocketMessage);\n }\n disconnect() {\n if (!this._socket || this.closing) {\n this.logger.debug(\"Session not connected or already in closing state.\");\n return;\n }\n this._status = \"disconnecting\";\n this._checkCurrentStatus();\n }\n execute(msg) {\n if (this._status === \"disconnecting\") {\n this.logger.warn(\"Reject request because the session is disconnecting\", msg);\n return Promise.reject({\n code: \"400\",\n message: \"The SDK session is disconnecting\"\n });\n }\n if (this._status === \"disconnected\") {\n return Promise.reject({\n code: \"400\",\n message: \"The SDK is disconnected\"\n });\n }\n let promise = Promise.resolve();\n if (\"params\" in msg) {\n promise = new Promise((resolve, reject) => {\n this._requests.set(msg.id, { rpcRequest: msg, resolve, reject });\n });\n }\n if (!this.ready) {\n this._addToExecuteQueue(msg);\n this.connect();\n return promise;\n }\n this._send(msg);\n return timeoutPromise(promise, this._executeTimeoutMs, this._executeTimeoutError).catch((error) => {\n if (error === this._executeConnectionClosed) {\n throw this._executeConnectionClosed;\n } else if (error === this._executeTimeoutError) {\n if (\"method\" in msg && msg.method === \"signalwire.connect\") {\n throw this._swConnectError;\n }\n this._checkCurrentStatus();\n this.logger.error(\"Request Timeout\", msg);\n if (this.status === \"disconnected\") {\n return this.logger.debug(\"Request failed because the session is disconnected\", this.status, this._socket);\n }\n this._closeConnection(\"reconnecting\");\n } else {\n throw error;\n }\n });\n }\n get _connectParams() {\n return {\n agent: this.agent,\n version: this.connectVersion,\n authentication: {\n project: this.options.project,\n token: this.options.token\n }\n };\n }\n async authenticate() {\n var _a, _b;\n const params = this._connectParams;\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n }\n if ((_a = this.options.topics) == null ? void 0 : _a.length) {\n params.contexts = this.options.topics;\n } else if ((_b = this.options.contexts) == null ? void 0 : _b.length) {\n params.contexts = this.options.contexts;\n }\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n }\n authError(error) {\n this._removeSocketListeners();\n this.dispatch(authErrorAction({ error }));\n }\n forceClose() {\n this._removeSocketListeners();\n return this._closeConnection(\"reconnecting\");\n }\n async _onSocketOpen(event) {\n this.logger.debug(\"_onSocketOpen\", event.type);\n try {\n this._status = \"unknown\";\n this._clearTimers();\n await this.authenticate();\n this._status = \"connected\";\n this._flushExecuteQueue();\n this.dispatch(authSuccessAction());\n } catch (error) {\n if (error === this._swConnectError || error === this._executeConnectionClosed) {\n this.logger.debug(\"Invalid connect or connection closed. Waiting for retry.\");\n return;\n }\n this.logger.error(\"Auth Error\", error);\n this.authError(error);\n }\n }\n _onSocketError(event) {\n this.logger.debug(\"_onSocketError\", event);\n }\n _onSocketClose(event) {\n this.logger.debug(\"_onSocketClose\", event.type, event.code, event.reason);\n if (this._status !== \"disconnected\") {\n this._status = \"reconnecting\";\n this.dispatch(sessionReconnectingAction());\n this._clearTimers();\n this._clearPendingRequests();\n this._reconnectTimer = setTimeout(() => {\n this.connect();\n }, reconnectDelay());\n }\n this._socket = null;\n }\n _clearTimers() {\n clearTimeout(this._reconnectTimer);\n }\n _clearPendingRequests() {\n this.logger.debug(\"_clearPendingRequests\", this._requests.size);\n this._requests.forEach(({ reject }) => {\n reject(this._executeConnectionClosed);\n });\n }\n _onSocketMessage(event) {\n const payload = this.decode(event.data);\n this.logger.wsTraffic({ type: \"recv\", payload });\n if (isJSONRPCResponse(payload)) {\n const request = this._requests.get(payload.id);\n if (request) {\n const { rpcRequest, resolve, reject } = request;\n this._requests.delete(payload.id);\n const { result, error } = parseRPCResponse({\n response: payload,\n request: rpcRequest\n });\n this._checkCurrentStatus();\n return error ? reject(error) : resolve(result);\n }\n return this.logger.warn(\"Unknown request for\", payload);\n }\n switch (payload.method) {\n case \"signalwire.ping\":\n return this._pingHandler(payload);\n case \"signalwire.disconnect\": {\n this.execute(RPCDisconnectResponse(payload.id)).catch((error) => {\n this.logger.error(\"SwDisconnect Error\", error);\n }).finally(() => {\n this._status = \"idle\";\n });\n break;\n }\n default:\n this._eventAcknowledgingHandler(payload).catch((error) => this.logger.error(\"Event Acknowledging Error\", error));\n this.dispatch(socketMessageAction(payload));\n }\n }\n dispatch(_payload) {\n if (!this._sessionChannel) {\n throw new Error(\"Session channel does not exist\");\n }\n this._sessionChannel.put(_payload);\n }\n _relayProtocolIsValid() {\n var _a;\n return this.signature && ((_a = this == null ? void 0 : this.relayProtocol) == null ? void 0 : _a.split(\"_\")[1]) === this.signature;\n }\n encode(input) {\n return JSON.stringify(input);\n }\n decode(input) {\n return safeParseJson(input);\n }\n async onSwAuthorizationState(state) {\n this.persistSwAuthorizationState(state);\n }\n async retrieveSwAuthorizationState() {\n return \"\";\n }\n async persistSwAuthorizationState(_) {\n }\n _send(msg) {\n this.logger.wsTraffic({ type: \"send\", payload: msg });\n this._socket.send(this.encode(msg));\n }\n _addToExecuteQueue(msg) {\n this.logger.warn(\"Request queued waiting for session to reconnect\", msg);\n this._executeQueue.add(msg);\n }\n _flushExecuteQueue() {\n if (!this._executeQueue.size) {\n return;\n }\n if (!this.ready) {\n this.logger.warn(`Session not ready to flush the queue.`);\n this._closeConnection(\"reconnecting\");\n return;\n }\n this.logger.debug(`${this._executeQueue.size} messages to flush`);\n this._executeQueue.forEach((msg) => {\n this._send(msg);\n this._executeQueue.delete(msg);\n });\n this._executeQueue.clear();\n }\n _clearCheckPingTimer() {\n clearTimeout(this._checkPingTimer);\n }\n async _pingHandler(payload) {\n var _a;\n this._clearCheckPingTimer();\n this._checkPingTimer = setTimeout(() => {\n this.logger.debug(\"Timeout waiting for ping\");\n this._closeConnection(\"reconnecting\");\n }, this._checkPingDelay);\n await this.execute(RPCPingResponse(payload.id, (_a = payload == null ? void 0 : payload.params) == null ? void 0 : _a.timestamp));\n }\n async _eventAcknowledgingHandler(payload) {\n const { method, id } = payload;\n if (method === \"signalwire.event\") {\n return this.execute(RPCEventAckResponse(id));\n }\n return Promise.resolve();\n }\n _checkCurrentStatus() {\n switch (this._status) {\n case \"disconnecting\":\n if (this._requests.size > 0) {\n return;\n }\n this._requests.clear();\n this._closeConnection(\"disconnected\");\n break;\n case \"disconnected\":\n this.dispatch(sessionDisconnectedAction());\n break;\n case \"reconnecting\":\n this.wsCloseHandler(new this.CloseEventConstructor(\"close\", {\n reason: \"Client-side closed\"\n }));\n break;\n }\n }\n _closeConnection(status) {\n this._clearCheckPingTimer();\n this.logger.debug(\"Close Connection:\", status);\n this._status = status;\n this.dispatch(sessionActions.authStatus(status === \"disconnected\" ? \"unauthorized\" : \"unknown\"));\n this._removeSocketListeners();\n this.destroySocket();\n this._checkCurrentStatus();\n }\n};\n\n// src/BaseJWTSession.ts\nvar BaseJWTSession = class extends BaseSession {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"_expiredDiffSeconds\", 0);\n __publicField(this, \"_refreshTokenNotificationDiff\", 120);\n __publicField(this, \"_checkTokenExpirationDelay\", 20 * 1e3);\n __publicField(this, \"_checkTokenExpirationTimer\", null);\n this._checkTokenExpiration = this._checkTokenExpiration.bind(this);\n this.reauthenticate = this.reauthenticate.bind(this);\n }\n get expiresAt() {\n var _a;\n if (!(this == null ? void 0 : this._rpcConnectResult)) {\n return 0;\n }\n const { authorization } = this._rpcConnectResult;\n const expiresAt = (_a = isSATAuth(authorization) ? authorization.fabric_subscriber.expires_at : authorization == null ? void 0 : authorization.expires_at) != null ? _a : 0;\n if (typeof expiresAt === \"string\") {\n const parsed = Date.parse(expiresAt);\n if (!isNaN(parsed)) {\n return Math.floor(parsed / 1e3);\n }\n }\n return expiresAt;\n }\n get expiresIn() {\n const now = Math.floor(Date.now() / 1e3);\n return this.expiresAt - now;\n }\n get expired() {\n return this.expiresAt > 0 && this.expiresIn <= this._expiredDiffSeconds;\n }\n async authenticate() {\n const params = __spreadProps(__spreadValues({}, this._connectParams), {\n authentication: {\n jwt_token: this.options.token\n }\n });\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n } else {\n const prevProtocol = await this.retrieveRelayProtocol();\n if (prevProtocol) {\n params.protocol = prevProtocol;\n }\n }\n if (params.protocol) {\n const authorizationState = await this.retrieveSwAuthorizationState();\n if (authorizationState) {\n params.authorization_state = authorizationState;\n }\n }\n try {\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n await this.persistRelayProtocol();\n await this._checkTokenExpiration();\n } catch (error) {\n this.logger.debug(\"BaseJWTSession authenticate error\", error);\n throw error;\n }\n }\n async retrieveRelayProtocol() {\n return \"\";\n }\n async persistRelayProtocol() {\n }\n async reauthenticate() {\n this.logger.debug(\"Session Reauthenticate\", {\n ready: this.ready,\n expired: this.expired\n });\n if (!this.ready || this.expired) {\n return this.connect();\n }\n const params = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token\n };\n try {\n this._rpcConnectResult = await this.execute(RPCReauthenticate(params));\n } catch (error) {\n clearTimeout(this._checkTokenExpirationTimer);\n throw error;\n }\n }\n _onSocketClose(event) {\n clearTimeout(this._checkTokenExpirationTimer);\n super._onSocketClose(event);\n }\n async _checkTokenExpiration() {\n if (!this.expiresAt) {\n return;\n }\n const refreshTokenFn = this.options.onRefreshToken;\n if (this.expiresIn <= this._refreshTokenNotificationDiff) {\n this.dispatch(authExpiringAction());\n if (typeof refreshTokenFn === \"function\") {\n try {\n const token = await refreshTokenFn();\n this.dispatch(reauthAction({ token }));\n } catch (error) {\n this.logger.error(error);\n }\n } else {\n this.logger.warn(\"The token is going to expire!\");\n }\n }\n clearTimeout(this._checkTokenExpirationTimer);\n if (!this.expired) {\n this._checkTokenExpirationTimer = setTimeout(this._checkTokenExpiration, this._checkTokenExpirationDelay);\n }\n }\n};\n\n// src/redux/index.ts\nvar redux_exports = {};\n__export(redux_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n configureStore: () => configureStore2,\n connect: () => connect,\n createAction: () => createAction,\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n destroyAction: () => destroyAction,\n eventChannel: () => eventChannel,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\nimport createSagaMiddleware, {\n channel,\n multicastChannel\n} from \"@redux-saga/core\";\n\n// src/redux/features/component/componentSlice.ts\nvar initialComponentState = {\n byId: {}\n};\nvar componentSlice = createDestroyableSlice({\n name: \"components\",\n initialState: initialComponentState,\n reducers: {\n upsert: (state, { payload }) => {\n if (payload.id in state.byId) {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: __spreadValues(__spreadValues({}, state.byId[payload.id]), payload)\n })\n });\n } else {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: payload\n })\n });\n }\n },\n cleanup: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n byId: Object.entries(state.byId).reduce((reducer, [componentId, value]) => {\n if (!payload.ids.includes(componentId)) {\n reducer[componentId] = value;\n }\n return reducer;\n }, {})\n });\n }\n }\n});\nvar {\n actions: componentActions,\n reducer: componentReducer\n} = componentSlice;\n\n// src/redux/rootReducer.ts\nvar rootReducer = (0, toolkit_exports.combineReducers)({\n components: componentReducer,\n session: sessionReducer\n});\n\n// src/redux/rootSaga.ts\nimport { fork as fork2, call as call2, take as take2, put as put2, all, cancelled } from \"@redux-saga/core/effects\";\n\n// src/redux/features/session/sessionSaga.ts\nimport { put, take, fork } from \"@redux-saga/core/effects\";\n\n// src/redux/utils/sagaHelpers.ts\nvar sagaHelpers_exports = {};\n__export(sagaHelpers_exports, {\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n eventChannel: () => eventChannel\n});\nimport { call, spawn } from \"@redux-saga/core/effects\";\nimport { eventChannel } from \"@redux-saga/core\";\nvar createRestartableSaga = (saga) => {\n return function* () {\n spawn(function* () {\n while (true) {\n try {\n getLogger().debug(\"Run a restartable saga\");\n yield call(saga);\n getLogger().debug(\"One of the restartable saga has ended. Restarting..\");\n } catch (error) {\n getLogger().error(\"Restartable Saga Error\", error);\n }\n }\n });\n };\n};\nvar defaultCatchHandler = (error) => getLogger().error(\"Catchable Saga Error\", error);\nvar createCatchableSaga = (saga, errorHandler = defaultCatchHandler) => {\n return function* (...params) {\n try {\n yield call(saga, ...params);\n } catch (error) {\n errorHandler(error);\n }\n };\n};\n\n// src/redux/features/session/sessionSaga.ts\nvar isWebrtcEvent = (e) => {\n return isWebrtcEventType(e == null ? void 0 : e.event_type);\n};\nvar isVideoEvent = (e) => {\n var _a;\n return !!((_a = e == null ? void 0 : e.event_type) == null ? void 0 : _a.startsWith(\"video.\"));\n};\nvar isSwAuthorizationState = (e) => {\n return (e == null ? void 0 : e.event_type) === \"signalwire.authorization.state\";\n};\nfunction* sessionChannelWatcher({\n sessionChannel,\n swEventChannel,\n session\n}) {\n getLogger().debug(\"sessionChannelWatcher [started]\");\n function* swEventWorker(broadcastParams) {\n yield put(swEventChannel, toInternalAction(broadcastParams));\n if (isWebrtcEvent(broadcastParams) || isVideoEvent(broadcastParams)) {\n return;\n }\n if (isSwAuthorizationState(broadcastParams)) {\n session.onSwAuthorizationState(broadcastParams.params.authorization_state);\n return;\n }\n yield put({ type: broadcastParams.event_type, payload: broadcastParams });\n }\n function* sessionChannelWorker(action) {\n if (action.type !== socketMessageAction.type) {\n yield put(action);\n return;\n }\n const { method, params } = action.payload;\n switch (method) {\n case \"signalwire.event\":\n yield fork(swEventWorker, params);\n break;\n default:\n return getLogger().debug(`Unknown message: ${method}`, action);\n }\n }\n const sessionChannelWorkerCatchable = createCatchableSaga(sessionChannelWorker, (error) => {\n getLogger().error(\"Channel Error\", error);\n });\n while (true) {\n try {\n while (true) {\n const action = yield take(sessionChannel);\n yield fork(sessionChannelWorkerCatchable, action);\n }\n } catch (error) {\n getLogger().error(\"sessionChannelWorker error:\", error);\n } finally {\n getLogger().debug(\"sessionChannelWorker [finally]\");\n }\n }\n}\n\n// src/CustomErrors.ts\nvar AuthError = class extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n this.message = message;\n __publicField(this, \"name\", \"AuthError\");\n Object.setPrototypeOf(this, AuthError.prototype);\n }\n};\nvar HttpError = class extends Error {\n constructor(code, message, response) {\n super(message);\n this.code = code;\n this.message = message;\n this.response = response;\n __publicField(this, \"name\", \"HttpError\");\n Object.setPrototypeOf(this, HttpError.prototype);\n }\n};\n\n// src/redux/rootSaga.ts\nfunction* sessionSaga({\n initSession,\n sessionEmitter,\n userOptions,\n channels\n}) {\n var _a;\n getLogger().debug(\"sessionSaga [started]\");\n const session = initSession();\n const swEventChannel = channels.swEventChannel;\n const sessionChannel = channels.sessionChannel;\n let customTasks = [];\n if ((_a = userOptions.workers) == null ? void 0 : _a.length) {\n try {\n const effects = userOptions.workers.map((saga) => {\n return call2(createRestartableSaga(saga));\n });\n customTasks = yield all(effects);\n } catch (error) {\n getLogger().error(\"Error running custom workers\", error);\n }\n }\n const sessionChannelTask = yield fork2(sessionChannelWatcher, {\n session,\n sessionChannel,\n swEventChannel\n });\n const sessionStatusTask = yield fork2(sessionStatusWatcher, {\n session,\n sessionEmitter,\n sessionChannel,\n userOptions\n });\n session.connect();\n yield take2(destroyAction.type);\n session.disconnect();\n yield take2(sessionDisconnectedAction.type);\n sessionEmitter.emit(\"session.disconnected\");\n sessionStatusTask.cancel();\n sessionChannelTask.cancel();\n customTasks.forEach((task) => task.cancel());\n swEventChannel.close();\n sessionChannel.close();\n getLogger().debug(\"sessionSaga [ended]\");\n}\nfunction* reauthenticateWorker({\n session,\n token,\n sessionEmitter\n}) {\n try {\n if (session.reauthenticate) {\n session.token = token;\n yield call2(session.reauthenticate);\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n }\n } catch (error) {\n getLogger().error(\"Reauthenticate Error\", error);\n session.authError(error);\n }\n}\nfunction* sessionStatusWatcher(options) {\n getLogger().debug(\"sessionStatusWatcher [started]\");\n const { session, sessionEmitter } = options;\n try {\n while (true) {\n const action = yield take2([\n authSuccessAction.type,\n authErrorAction.type,\n authExpiringAction.type,\n reauthAction.type,\n sessionReconnectingAction.type,\n sessionForceCloseAction.type\n ]);\n getLogger().debug(\"sessionStatusWatcher\", action.type, action.payload);\n switch (action.type) {\n case authSuccessAction.type: {\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n break;\n }\n case authErrorAction.type: {\n yield fork2(sessionAuthErrorSaga, __spreadProps(__spreadValues({}, options), {\n action\n }));\n break;\n }\n case authExpiringAction.type: {\n sessionEmitter.emit(\"session.expiring\");\n break;\n }\n case reauthAction.type: {\n yield fork2(reauthenticateWorker, {\n session,\n token: action.payload.token,\n sessionEmitter\n });\n break;\n }\n case sessionReconnectingAction.type: {\n sessionEmitter.emit(\"session.reconnecting\");\n break;\n }\n case sessionForceCloseAction.type: {\n session.forceClose();\n break;\n }\n }\n }\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionStatusWatcher [cancelled]\");\n }\n }\n}\nfunction* sessionAuthErrorSaga(options) {\n getLogger().debug(\"sessionAuthErrorSaga [started]\");\n try {\n const { action, sessionEmitter } = options;\n const { error: authError } = action.payload;\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n sessionEmitter.emit(\"session.auth_error\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionAuthErrorSaga [cancelled]\");\n }\n }\n}\nvar rootSaga_default = (options) => {\n return function* root({\n userOptions,\n channels\n }) {\n getLogger().debug(\"rootSaga [started]\");\n if (userOptions.logger) {\n setLogger(userOptions.logger);\n }\n if (userOptions.debug) {\n setDebugOptions(userOptions.debug);\n }\n while (true) {\n yield take2(initAction.type);\n try {\n yield call2(sessionSaga, __spreadProps(__spreadValues({}, options), {\n userOptions,\n channels\n }));\n break;\n } catch (error) {\n getLogger().error(\"RootSaga Error:\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"rootSaga [cancelled]\");\n }\n getLogger().debug(\"Reboot rootSaga\");\n }\n }\n getLogger().debug(\"rootSaga [finished]\");\n };\n};\n\n// src/redux/features/session/sessionSelectors.ts\nvar sessionSelectors_exports = {};\n__export(sessionSelectors_exports, {\n getAuthError: () => getAuthError,\n getAuthState: () => getAuthState,\n getAuthStatus: () => getAuthStatus,\n getIceServers: () => getIceServers,\n getSession: () => getSession\n});\nvar getIceServers = ({ session }) => {\n var _a;\n return (_a = session == null ? void 0 : session.iceServers) != null ? _a : [];\n};\nvar getSession = (store) => {\n return store.session;\n};\nvar getAuthStatus = ({ session }) => {\n return session.authStatus;\n};\nvar getAuthError = ({ session }) => {\n return session.authError;\n};\nvar getAuthState = ({ session }) => {\n return session.authState;\n};\n\n// src/redux/connect.ts\nvar connect = (options) => {\n const { sessionListeners = {}, store, Component, customSagas = [] } = options;\n const sessionKeys = Object.keys(sessionListeners);\n return (userOptions) => {\n const instance = new Component(__spreadProps(__spreadValues({}, userOptions), { store }));\n const cacheMap = /* @__PURE__ */ new Map();\n let run = true;\n const storeUnsubscribe = store.subscribe(() => {\n const state = store.getState();\n const session = getSession(state);\n for (const reduxKey of sessionKeys) {\n if (run === false) {\n return;\n }\n const cacheKey = `session.${reduxKey}`;\n const current = cacheMap.get(cacheKey);\n const updatedValue = session[reduxKey];\n if (updatedValue !== void 0 && current !== updatedValue) {\n cacheMap.set(cacheKey, updatedValue);\n const fnName = sessionListeners[reduxKey];\n if (typeof fnName === \"string\") {\n instance[fnName](session);\n } else if (typeof fnName === \"function\") {\n fnName(session);\n }\n }\n }\n });\n const taskList = customSagas == null ? void 0 : customSagas.map((saga) => {\n return store.runSaga(saga, { instance, runSaga: store.runSaga });\n });\n instance.destroyer = () => {\n run = false;\n storeUnsubscribe();\n cacheMap.clear();\n if (taskList == null ? void 0 : taskList.length) {\n taskList.forEach((task) => task.cancel());\n }\n };\n return instance;\n };\n};\n\n// src/utils/EventEmitter.ts\nimport EventEmitter from \"eventemitter3\";\nvar getEventEmitter = () => {\n return new EventEmitter();\n};\n\n// src/redux/utils/useSession.ts\nvar useSession = (options) => {\n const { SessionConstructor, userOptions, sessionChannel } = options;\n const sessionEmitter = getEventEmitter();\n let session = null;\n const initSession = () => {\n session = new SessionConstructor(__spreadProps(__spreadValues({}, userOptions), {\n sessionChannel\n }));\n return session;\n };\n const getSession2 = () => {\n if (!session) {\n getLogger().warn(\"Session does not exist!\");\n }\n return session;\n };\n return { session, initSession, getSession: getSession2, sessionEmitter };\n};\n\n// src/redux/utils/useInstanceMap.ts\nvar useInstanceMap = () => {\n const instanceMap = /* @__PURE__ */ new Map();\n const getInstance = (key) => {\n return instanceMap.get(key);\n };\n const setInstance = (key, value) => {\n instanceMap.set(key, value);\n return instanceMap;\n };\n const deleteInstance = (key) => {\n instanceMap.delete(key);\n return instanceMap;\n };\n const getAllInstances = () => {\n return Array.from(instanceMap.entries());\n };\n const deleteAllInstances = () => {\n instanceMap.clear();\n return instanceMap;\n };\n return {\n get: getInstance,\n set: setInstance,\n remove: deleteInstance,\n getAll: getAllInstances,\n deleteAll: deleteAllInstances\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 runRootSaga = true\n } = options;\n const sagaMiddleware = createSagaMiddleware({\n sagaMonitor: userOptions.sagaMonitor\n });\n const swEventChannel = multicastChannel();\n const sessionChannel = channel();\n const channels = {\n swEventChannel,\n sessionChannel\n };\n const store = configureStore({\n devTools: (_a = userOptions == null ? void 0 : userOptions.devTools) != null ? _a : true,\n reducer: rootReducer,\n preloadedState,\n middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(sagaMiddleware)\n });\n const instanceMap = useInstanceMap();\n const { initSession, getSession: getSession2, sessionEmitter } = useSession({\n userOptions,\n sessionChannel,\n SessionConstructor\n });\n const runSaga = (saga, args) => {\n return sagaMiddleware.run(saga, __spreadProps(__spreadValues({}, args), {\n channels,\n getSession: getSession2,\n instanceMap\n }));\n };\n if (runRootSaga) {\n const saga = rootSaga_default({\n initSession,\n sessionEmitter\n });\n sagaMiddleware.run(saga, { userOptions, channels });\n }\n return __spreadProps(__spreadValues({}, store), {\n runSaga,\n channels,\n instanceMap,\n sessionEmitter\n });\n};\n\n// src/workers/executeActionWorker.ts\nimport { call as call3 } from \"@redux-saga/core/effects\";\nvar executeActionWorker = function* (options) {\n const { initialState, onDone, onFail, getSession: getSession2 } = options;\n const { requestId: id, method, params } = initialState;\n const session = getSession2();\n if (!session) {\n const error = new Error(\"Session does not exist!\");\n getLogger().error(error);\n onFail == null ? void 0 : onFail(error);\n return;\n }\n try {\n let message = RPCExecute({ id, method, params });\n const response = yield call3(session.execute, message);\n onDone == null ? void 0 : onDone(response);\n } catch (error) {\n getLogger().warn(\"Execute error: \", error);\n onFail == null ? void 0 : onFail(error);\n }\n};\n\n// src/BaseComponent.ts\nvar identity = (payload) => payload;\nvar SW_SYMBOL2 = Symbol(\"BaseComponent\");\nvar BaseComponent = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"__sw_symbol\", SW_SYMBOL2);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"_customSagaTriggers\", /* @__PURE__ */ new Map());\n __publicField(this, \"_destroyer\");\n __publicField(this, \"eventEmitter\");\n __publicField(this, \"_runningWorkers\", []);\n __publicField(this, \"_workers\", /* @__PURE__ */ new Map());\n this.eventEmitter = new EventEmitter();\n }\n get __uuid() {\n return this.uuid;\n }\n get logger() {\n return getLogger();\n }\n set destroyer(d) {\n this._destroyer = d;\n }\n get store() {\n return this.options.store;\n }\n get instanceMap() {\n return this.store.instanceMap;\n }\n get emitter() {\n return this.eventEmitter;\n }\n get sessionEmitter() {\n return this.store.sessionEmitter;\n }\n get session() {\n return this.sessionEmitter;\n }\n on(event, fn) {\n return this.emitter.on(event, fn);\n }\n once(event, fn) {\n return this.emitter.once(event, fn);\n }\n off(event, fn) {\n return this.emitter.off(event, fn);\n }\n removeAllListeners(event) {\n if (event) {\n return this.off(event);\n }\n this.eventNames().forEach((eventName) => {\n this.off(eventName);\n });\n return this.emitter;\n }\n eventNames() {\n return this.emitter.eventNames();\n }\n sessionEventNames() {\n return this.sessionEmitter.eventNames();\n }\n getSubscriptions() {\n return validateEventsToSubscribe(this.eventNames());\n }\n emit(event, ...args) {\n return this.emitter.emit(event, ...args);\n }\n listenerCount(event) {\n return this.emitter.listenerCount(event);\n }\n destroy() {\n var _a;\n (_a = this._destroyer) == null ? void 0 : _a.call(this);\n this.removeAllListeners();\n this.detachWorkers();\n }\n execute({ method, params }, {\n transformParams = identity,\n transformResolve = identity,\n transformReject = identity\n } = {\n transformParams: identity,\n transformResolve: identity,\n transformReject: identity\n }) {\n return new Promise((resolve, reject) => {\n const requestId = v4();\n this.runWorker(\"executeActionWorker\", {\n worker: executeActionWorker,\n onDone: (data) => resolve(transformResolve(data)),\n onFail: (error) => reject(transformReject(error)),\n initialState: {\n requestId,\n componentId: this.__uuid,\n method,\n params: transformParams(params)\n }\n });\n });\n }\n triggerCustomSaga(action) {\n return new Promise((resolve, reject) => {\n const dispatchId = v4();\n this._customSagaTriggers.set(dispatchId, { resolve, reject });\n this.store.dispatch(__spreadValues({\n dispatchId\n }, makeCustomSagaAction(this.__uuid, action)));\n });\n }\n settleCustomSagaTrigger({\n dispatchId,\n payload,\n kind\n }) {\n const actions = this._customSagaTriggers.get(dispatchId);\n if (actions) {\n actions[kind](payload);\n this._customSagaTriggers.delete(dispatchId);\n }\n }\n select(selectorFn) {\n return selectorFn(this.store.getState());\n }\n getStateProperty(param) {\n return this[param];\n }\n get _sessionAuthStatus() {\n return getAuthStatus(this.store.getState());\n }\n get _sessionAuthState() {\n return getAuthState(this.store.getState());\n }\n _waitUntilSessionAuthorized() {\n const authStatus = getAuthStatus(this.store.getState());\n switch (authStatus) {\n case \"authorized\":\n return Promise.resolve(this);\n case \"unknown\":\n case \"authorizing\":\n return new Promise((resolve, reject) => {\n const unsubscribe = this.store.subscribe(() => {\n const authStatus2 = getAuthStatus(this.store.getState());\n const authError = getAuthError(this.store.getState());\n if (authStatus2 === \"authorized\") {\n resolve(this);\n unsubscribe();\n } else if (authStatus2 === \"unauthorized\") {\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n reject(error);\n unsubscribe();\n }\n });\n });\n case \"unauthorized\":\n return Promise.reject(new Error(\"Unauthorized\"));\n }\n }\n runWorker(name, def) {\n if (this._workers.has(name)) {\n getLogger().warn(`[runWorker] Worker with name ${name} has already been registerd.`);\n } else {\n this._setWorker(name, def);\n }\n return this._attachWorker(name, def);\n }\n _setWorker(name, def) {\n this._workers.set(name, def);\n }\n _attachWorker(name, _a) {\n var _b = _a, { worker } = _b, params = __objRest(_b, [\"worker\"]);\n const task = this.store.runSaga(worker, __spreadValues({\n instance: this,\n runSaga: this.store.runSaga\n }, params));\n this._runningWorkers.push(task);\n this._workers.delete(name);\n return task;\n }\n detachWorkers() {\n this._runningWorkers.forEach((task) => {\n task.cancel();\n });\n this._runningWorkers = [];\n }\n};\n\n// src/BaseClient.ts\nvar BaseClient = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n }\n connect() {\n const authStatus = getAuthStatus(this.store.getState());\n if (authStatus === \"unknown\" || authStatus === \"unauthorized\") {\n this.store.dispatch(initAction());\n }\n return this._waitUntilSessionAuthorized();\n }\n disconnect() {\n this.store.dispatch(destroyAction());\n }\n removeAllListeners(event) {\n this.sessionEventNames().forEach((eventName) => {\n this.sessionEmitter.off(eventName);\n });\n return super.removeAllListeners(event);\n }\n};\n\n// src/BaseConsumer.ts\nvar BaseConsumer = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"subscribeMethod\", \"signalwire.subscribe\");\n __publicField(this, \"subscribeParams\", {});\n __publicField(this, \"_latestExecuteParams\");\n const resetLatestExecuteParams = () => {\n this._latestExecuteParams = void 0;\n };\n super.session.on(\"session.connected\", resetLatestExecuteParams);\n super.session.on(\"session.disconnected\", resetLatestExecuteParams);\n super.session.on(\"session.reconnecting\", resetLatestExecuteParams);\n }\n shouldExecuteSubscribe(execParams) {\n return !this._latestExecuteParams || JSON.stringify(execParams) !== JSON.stringify(this._latestExecuteParams);\n }\n async subscribe() {\n await this._waitUntilSessionAuthorized();\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.debug(\"`subscribe()` was called without any listeners attached.\");\n return;\n }\n const execParams = {\n method: this.subscribeMethod,\n params: __spreadProps(__spreadValues({}, this.subscribeParams), {\n event_channel: this.getStateProperty(\"eventChannel\"),\n events: subscriptions\n })\n };\n if (!this.shouldExecuteSubscribe(execParams)) {\n this.logger.debug(\"BaseConsumer.subscribe() - Skipped .execute() since the execParams are exactly the same as last time\");\n return;\n }\n this._latestExecuteParams = execParams;\n return new Promise(async (resolve, reject) => {\n try {\n await this.execute(execParams);\n return resolve(void 0);\n } catch (error) {\n return reject(error);\n }\n });\n }\n};\n\n// src/redux/features/shared/namespace.ts\nvar isVideoMemberEvent = (action) => {\n return action.type.startsWith(\"video.member.\") || action.type.startsWith(\"video.__synthetic__.member\");\n};\nvar isVideoRoomEvent = (action) => {\n return action.type.startsWith(\"video.room.\");\n};\nvar isVideoRoomAudienceCountEvent = (action) => {\n return action.type === \"video.room.audience_count\" || action.type === \"video.room.audienceCount\";\n};\nvar isVideoLayoutEvent = (action) => {\n return action.type.startsWith(\"video.layout.\");\n};\nvar isVideoRecordingEvent = (action) => {\n return action.type.startsWith(\"video.recording.\");\n};\nvar isVideoPlaybackEvent = (action) => {\n return action.type.startsWith(\"video.playback.\");\n};\nvar isVideoStreamEvent = (action) => {\n return action.type.startsWith(\"video.stream.\");\n};\nvar isChatEvent = (action) => {\n return action.type.startsWith(\"chat.\");\n};\nvar isVoiceCallEvent = (action) => {\n return action.type.startsWith(\"calling.\");\n};\nvar findNamespaceInPayload = (action) => {\n var _a;\n if (action.payload === void 0) {\n return \"\";\n } else if (isVideoMemberEvent(action) || isVideoLayoutEvent(action) || isVideoRecordingEvent(action) || isVideoPlaybackEvent(action) || isVideoStreamEvent(action) || isVideoRoomAudienceCountEvent(action)) {\n return action.payload.room_session_id;\n } else if (isVideoRoomEvent(action)) {\n return action.payload.room_session.id;\n } else if (isChatEvent(action)) {\n return \"\";\n } else if (isVoiceCallEvent(action)) {\n return (_a = action.payload.tag) != null ? _a : \"\";\n }\n if (process.env.NODE_ENV === \"development\") {\n getLogger().info(\"Namespace not found for action.type: \", action == null ? void 0 : action.type);\n }\n return \"\";\n};\n\n// src/types/videoMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS = {\n audio_muted: true,\n video_muted: true,\n deaf: true,\n visible: true,\n input_volume: 1,\n output_volume: 1,\n input_sensitivity: 1\n};\nvar INTERNAL_MEMBER_UPDATED_EVENTS = Object.keys(INTERNAL_MEMBER_UPDATABLE_PROPS).map((key) => {\n return `${PRODUCT_PREFIX_VIDEO}.member.updated.${key}`;\n});\nvar MEMBER_UPDATABLE_PROPS = toExternalJSON(INTERNAL_MEMBER_UPDATABLE_PROPS);\nvar MEMBER_UPDATED_EVENTS = Object.keys(MEMBER_UPDATABLE_PROPS).map((key) => {\n return `member.updated.${key}`;\n});\n\n// src/redux/features/component/componentSelectors.ts\nvar componentSelectors_exports = {};\n__export(componentSelectors_exports, {\n getComponent: () => getComponent,\n getComponentsById: () => getComponentsById,\n getComponentsToCleanup: () => getComponentsToCleanup\n});\nvar getComponent = ({ components }, id) => {\n var _a;\n return (_a = components.byId) == null ? void 0 : _a[id];\n};\nvar getComponentsById = ({ components }) => {\n return components.byId;\n};\nvar getComponentsToCleanup = (state) => {\n const components = getComponentsById(state);\n let toCleanup = [];\n Object.keys(components).forEach((id) => {\n if (components[id].responses || components[id].errors) {\n toCleanup.push(id);\n }\n });\n return toCleanup;\n};\n\n// src/types/fabricMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS2 = {\n audioMuted: true,\n videoMuted: true,\n deaf: true,\n visible: true,\n inputVolume: 1,\n outputVolume: 1,\n inputSensitivity: 1\n};\nvar INTERNAL_CALL_FABRIC_MEMBER_UPDATED_EVENTS = Object.keys(INTERNAL_MEMBER_UPDATABLE_PROPS2).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 RoomSessionStreamAPI: () => RoomSessionStreamAPI,\n audioMuteMember: () => audioMuteMember,\n audioUnmuteMember: () => audioUnmuteMember,\n createRoomSessionPlaybackObject: () => createRoomSessionPlaybackObject,\n createRoomSessionRecordingObject: () => createRoomSessionRecordingObject,\n createRoomSessionStreamObject: () => createRoomSessionStreamObject,\n deafMember: () => deafMember,\n deleteMemberMeta: () => deleteMemberMeta,\n deleteMeta: () => deleteMeta,\n demote: () => demote,\n getLayouts: () => getLayouts,\n getMemberMeta: () => getMemberMeta,\n getMembers: () => getMembers,\n getMeta: () => getMeta,\n getPlaybacks: () => getPlaybacks,\n getRecordings: () => getRecordings,\n getStreams: () => getStreams,\n hideVideoMuted: () => hideVideoMuted,\n lock: () => lock,\n play: () => play,\n promote: () => promote,\n removeAllMembers: () => removeAllMembers,\n removeMember: () => removeMember,\n setDeaf: () => setDeaf,\n setHideVideoMuted: () => setHideVideoMuted,\n setInputSensitivityMember: () => setInputSensitivityMember,\n setInputVolumeMember: () => setInputVolumeMember,\n setLayout: () => setLayout,\n setMemberMeta: () => setMemberMeta,\n setMemberPosition: () => setMemberPosition,\n setMeta: () => setMeta,\n setOutputVolumeMember: () => setOutputVolumeMember,\n setPositions: () => setPositions,\n setPrioritizeHandraise: () => setPrioritizeHandraise,\n setRaisedHand: () => setRaisedHand,\n showVideoMuted: () => showVideoMuted,\n startRecording: () => startRecording,\n startStream: () => startStream,\n undeafMember: () => undeafMember,\n unlock: () => unlock,\n updateMemberMeta: () => updateMemberMeta,\n updateMeta: () => updateMeta,\n videoMuteMember: () => videoMuteMember,\n videoUnmuteMember: () => videoUnmuteMember\n});\n\n// src/rooms/methods.ts\nvar baseCodeTransform = () => {\n};\nvar createRoomMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute({\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n }, options);\n }\n});\nvar createRoomMemberMethod = (method, options = {}) => ({\n value: function(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this.execute({\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId || this.memberId\n }, rest)\n }, options);\n }\n});\nvar getLayouts = createRoomMethod(\"video.list_available_layouts\", {\n transformResolve: (payload) => ({ layouts: payload.layouts })\n});\nvar getMembers = createRoomMethod(\"video.members.get\", {\n transformResolve: (payload) => ({ members: payload.members })\n});\nvar setLayout = createRoomMethod(\"video.set_layout\", {\n transformResolve: baseCodeTransform\n});\nvar setPositions = createRoomMethod(\"video.set_position\", {\n transformResolve: baseCodeTransform\n});\nvar hideVideoMuted = createRoomMethod(\"video.hide_video_muted\", {\n transformResolve: baseCodeTransform\n});\nvar showVideoMuted = createRoomMethod(\"video.show_video_muted\", {\n transformResolve: baseCodeTransform\n});\nvar lock = createRoomMethod(\"video.lock\", {\n transformResolve: baseCodeTransform\n});\nvar unlock = createRoomMethod(\"video.unlock\", {\n transformResolve: baseCodeTransform\n});\nvar setHideVideoMuted = {\n value: function(value) {\n return this.execute({\n method: value ? \"video.hide_video_muted\" : \"video.show_video_muted\",\n params: {\n room_session_id: this.roomSessionId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar getRecordings = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recordings } = await this.execute({\n method: \"video.recording.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstances = [];\n recordings.forEach((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n } else {\n recordingInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n });\n }\n recordingInstances.push(recordingInstance);\n this.instanceMap.set(recordingInstance.id, recordingInstance);\n });\n resolve({ recordings: recordingInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startRecording = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recording } = await this.execute({\n method: \"video.recording.start\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n this.instanceMap.set(recordingInstance.id, recordingInstance);\n resolve(recordingInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar getPlaybacks = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { playbacks } = await this.execute({\n method: \"video.playback.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const playbackInstances = [];\n playbacks.forEach((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n } else {\n playbackInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n });\n }\n playbackInstances.push(playbackInstance);\n this.instanceMap.set(playbackInstance.id, playbackInstance);\n });\n resolve({ playbacks: playbackInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar play = {\n value: function(_a) {\n var _b = _a, { seekPosition, currentTimecode } = _b, params = __objRest(_b, [\"seekPosition\", \"currentTimecode\"]);\n return new Promise(async (resolve, reject) => {\n try {\n const seek_position = seekPosition || currentTimecode;\n const { playback } = await this.execute({\n method: \"video.playback.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n seek_position\n }, params)\n });\n const playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n this.instanceMap.set(playbackInstance.id, playbackInstance);\n resolve(playbackInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar createRoomMetaMethod = (method) => {\n return createRoomMethod(method, {\n transformResolve: baseCodeTransform,\n transformParams: (params) => {\n const _a = params, { room_session_id } = _a, meta = __objRest(_a, [\"room_session_id\"]);\n return { room_session_id, meta };\n }\n });\n};\nvar getMeta = createRoomMethod(\"video.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMeta = createRoomMetaMethod(\"video.set_meta\");\nvar updateMeta = createRoomMetaMethod(\"video.update_meta\");\nvar deleteMeta = {\n value: function(params) {\n return this.execute({\n method: \"video.delete_meta\",\n params: {\n room_session_id: this.roomSessionId,\n keys: params\n }\n });\n }\n};\nvar getStreams = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { streams } = await this.execute({\n method: \"video.stream.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const streamInstances = [];\n streams.forEach((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n } else {\n streamInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n });\n }\n streamInstances.push(streamInstance);\n this.instanceMap.set(streamInstance.id, streamInstance);\n });\n resolve({ streams: streamInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startStream = {\n value: function(params) {\n return new Promise(async (resolve, reject) => {\n try {\n const { stream } = await this.execute({\n method: \"video.stream.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n });\n const streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n this.instanceMap.set(streamInstance.id, streamInstance);\n resolve({ stream: streamInstance });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar setPrioritizeHandraise = {\n value: function(params) {\n return this.execute({\n method: \"video.prioritize_handraise\",\n params: {\n room_session_id: this.roomSessionId,\n enable: params\n }\n });\n }\n};\nvar audioMuteMember = createRoomMemberMethod(\"video.member.audio_mute\", {\n transformResolve: baseCodeTransform\n});\nvar audioUnmuteMember = createRoomMemberMethod(\"video.member.audio_unmute\", {\n transformResolve: baseCodeTransform\n});\nvar videoMuteMember = createRoomMemberMethod(\"video.member.video_mute\", {\n transformResolve: baseCodeTransform\n});\nvar videoUnmuteMember = createRoomMemberMethod(\"video.member.video_unmute\", {\n transformResolve: baseCodeTransform\n});\nvar deafMember = createRoomMemberMethod(\"video.member.deaf\", {\n transformResolve: baseCodeTransform\n});\nvar undeafMember = createRoomMemberMethod(\"video.member.undeaf\", {\n transformResolve: baseCodeTransform\n});\nvar setDeaf = {\n value: function(value) {\n return this.execute({\n method: value ? \"video.member.deaf\" : \"video.member.undeaf\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: this.memberId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar setInputVolumeMember = createRoomMemberMethod(\"video.member.set_input_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setOutputVolumeMember = createRoomMemberMethod(\"video.member.set_output_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setInputSensitivityMember = createRoomMemberMethod(\"video.member.set_input_sensitivity\", {\n transformResolve: baseCodeTransform\n});\nvar promote = {\n value: function(_a) {\n var _b = _a, {\n memberId,\n mediaAllowed,\n joinAudioMuted,\n joinVideoMuted\n } = _b, rest = __objRest(_b, [\n \"memberId\",\n \"mediaAllowed\",\n \"joinAudioMuted\",\n \"joinVideoMuted\"\n ]);\n return this.execute({\n method: \"video.member.promote\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed,\n join_audio_muted: joinAudioMuted,\n join_video_muted: joinVideoMuted\n }, rest)\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar demote = {\n value: function({ memberId, mediaAllowed }) {\n return this.execute({\n method: \"video.member.demote\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar setMemberPosition = createRoomMemberMethod(\"video.member.set_position\", {\n transformResolve: baseCodeTransform\n});\nvar removeMember = {\n value: function(_a) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n if (!memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument');\n }\n return this.execute({\n method: \"video.member.remove\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId\n }, rest)\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar removeAllMembers = {\n value: function() {\n return this.execute({\n method: \"video.member.remove\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: \"all\"\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\nvar getMemberMeta = createRoomMemberMethod(\"video.member.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMemberMeta = createRoomMemberMethod(\"video.member.set_meta\", {\n transformResolve: baseCodeTransform\n});\nvar updateMemberMeta = createRoomMemberMethod(\"video.member.update_meta\", {\n transformResolve: baseCodeTransform\n});\nvar deleteMemberMeta = createRoomMemberMethod(\"video.member.delete_meta\", {\n transformResolve: baseCodeTransform\n});\nvar setRaisedHand = {\n value: function(value) {\n const { raised = true, memberId = this.memberId } = value || {};\n if (!memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument');\n }\n return this.execute({\n method: raised ? \"video.member.raisehand\" : \"video.member.lowerhand\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId\n }\n }, {\n transformResolve: baseCodeTransform\n });\n }\n};\n\n// src/rooms/RoomSessionRecording.ts\nvar RoomSessionRecordingAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.recording.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.recording.state;\n }\n get duration() {\n return this._payload.recording.duration;\n }\n get startedAt() {\n if (!this._payload.recording.started_at)\n return void 0;\n return new Date(this._payload.recording.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.recording.ended_at)\n return void 0;\n return new Date(this._payload.recording.ended_at * 1e3);\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.recording.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.recording.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.recording.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionRecordingObject = (params) => {\n const recording = connect({\n store: params.store,\n Component: RoomSessionRecordingAPI\n })(params);\n return recording;\n};\n\n// src/rooms/RoomSessionPlayback.ts\nvar RoomSessionPlaybackAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.playback.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get url() {\n return this._payload.playback.url;\n }\n get state() {\n return this._payload.playback.state;\n }\n get volume() {\n return this._payload.playback.volume;\n }\n get startedAt() {\n if (!this._payload.playback.started_at)\n return void 0;\n return new Date(this._payload.playback.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.playback.ended_at)\n return void 0;\n return new Date(this._payload.playback.ended_at * 1e3);\n }\n get position() {\n return this._payload.playback.position;\n }\n get seekable() {\n return this._payload.playback.seekable;\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.playback.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.playback.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.playback.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async setVolume(volume) {\n await this.execute({\n method: \"video.playback.set_volume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n volume\n }\n });\n }\n async seek(timecode) {\n await this.execute({\n method: \"video.playback.seek_absolute\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(timecode)\n }\n });\n }\n async forward(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(offset)\n }\n });\n }\n async rewind(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: -Math.abs(offset)\n }\n });\n }\n};\nvar createRoomSessionPlaybackObject = (params) => {\n const playback = connect({\n store: params.store,\n Component: RoomSessionPlaybackAPI\n })(params);\n return playback;\n};\n\n// src/rooms/RoomSessionStream.ts\nvar RoomSessionStreamAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.stream.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.stream.state;\n }\n get duration() {\n return this._payload.stream.duration;\n }\n get url() {\n return this._payload.stream.url;\n }\n get startedAt() {\n if (!this._payload.stream.started_at)\n return void 0;\n return new Date(this._payload.stream.started_at * 1e3);\n }\n get endedAt() {\n if (!this._payload.stream.ended_at)\n return void 0;\n return new Date(this._payload.stream.ended_at * 1e3);\n }\n setPayload(payload) {\n this._payload = payload;\n }\n async stop() {\n await this.execute({\n method: \"video.stream.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n stream_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionStreamObject = (params) => {\n const stream = connect({\n store: params.store,\n Component: RoomSessionStreamAPI\n })(params);\n return stream;\n};\n\n// src/chat/index.ts\nvar chat_exports = {};\n__export(chat_exports, {\n BaseChatAPI: () => BaseChatAPI,\n BaseChatConsumer: () => BaseChatConsumer,\n ChatMember: () => ChatMember,\n ChatMessage: () => ChatMessage,\n applyCommonMethods: () => applyCommonMethods,\n createBaseChatObject: () => createBaseChatObject,\n getMemberState: () => getMemberState,\n getMembers: () => getMembers2,\n getMessages: () => getMessages,\n publish: () => publish,\n setMemberState: () => setMemberState\n});\n\n// src/chat/utils/toInternalChatChannels.ts\nvar toInternalChatChannels = (channels) => {\n const list = !channels || Array.isArray(channels) ? channels : [channels];\n if (Array.isArray(list)) {\n return list.map((name) => {\n return {\n name\n };\n });\n }\n return [];\n};\n\n// src/chat/utils/index.ts\nvar isValidChannels = (input) => {\n return Array.isArray(input) || typeof input === \"string\";\n};\n\n// src/chat/methods.ts\nvar baseCodeTransform2 = () => {\n};\nvar createChatMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute({\n method,\n params\n }, options);\n }\n});\nvar createChatMemberMethod = (method, options = {}) => ({\n value: function(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this.execute({\n method,\n params: __spreadValues({\n member_id: memberId\n }, rest)\n }, options);\n }\n});\nvar publish = createChatMethod(\"chat.publish\", {\n transformResolve: baseCodeTransform2\n});\nvar getMessages = createChatMethod(\"chat.messages.get\", {\n transformResolve: (payload) => ({\n messages: payload.messages.map((message) => toExternalJSON(message)),\n cursor: payload.cursor\n })\n});\nvar getMembers2 = createChatMethod(\"chat.members.get\", {\n transformResolve: (payload) => ({\n members: payload.members.map((member) => toExternalJSON(member))\n })\n});\nvar transformParamChannels = (params) => {\n const channels = isValidChannels(params == null ? void 0 : params.channels) ? toInternalChatChannels(params.channels) : void 0;\n return __spreadProps(__spreadValues({}, params), {\n channels\n });\n};\nvar setMemberState = createChatMemberMethod(\"chat.member.set_state\", {\n transformResolve: baseCodeTransform2,\n transformParams: transformParamChannels\n});\nvar getMemberState = createChatMemberMethod(\"chat.member.get_state\", {\n transformResolve: (payload) => ({ channels: payload.channels }),\n transformParams: transformParamChannels\n});\n\n// src/pubSub/index.ts\nvar pubSub_exports = {};\n__export(pubSub_exports, {\n BasePubSubConsumer: () => BasePubSubConsumer,\n PubSubMessage: () => PubSubMessage,\n createBasePubSubObject: () => createBasePubSubObject\n});\n\n// src/pubSub/workers/pubSubWorker.ts\nvar pubSubWorker = function* (options) {\n getLogger().trace(\"pubSubWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case `${PRODUCT_PREFIX_PUBSUB}.channel.message`: {\n const {\n channel: channel3,\n message: _a\n } = payload, _b = _a, { member } = _b, restMessage = __objRest(_b, [\"member\"]);\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, restMessage), {\n channel: channel3\n }));\n const pubSubMessage = new PubSubMessage(externalJSON);\n client.emit(\"message\", pubSubMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown pubsub event: \"${type}\"`);\n break;\n }\n }\n const isPubSubEvent = (action) => action.type.startsWith(`${PRODUCT_PREFIX_PUBSUB}.`);\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, isPubSubEvent);\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"pubSubWorker ended\");\n};\n\n// src/pubSub/BasePubSub.ts\nvar toInternalPubSubChannels = (channels) => {\n return channels.map((name) => {\n return {\n name\n };\n });\n};\nvar BasePubSubConsumer = class extends BaseConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_PUBSUB}.subscribe`);\n this.initWorker();\n }\n initWorker() {\n this.runWorker(\"pubSub\", { worker: pubSubWorker });\n }\n _getChannelsParam(channels, method) {\n const _channels = !channels || Array.isArray(channels) ? channels : [channels];\n if (!Array.isArray(_channels) || _channels.length === 0) {\n throw new Error(`Please specify one or more channels when calling .${method}()`);\n }\n return {\n channels: toInternalPubSubChannels(_channels)\n };\n }\n _setSubscribeParams(params) {\n this.subscribeParams = __spreadValues(__spreadValues({}, this.subscribeParams), params);\n }\n _getSubscribeParams({ channels }) {\n return __spreadValues({}, this._getChannelsParam(channels, \"subscribe\"));\n }\n _getUnsubscribeParams({ channels }) {\n const channelsParam = this._getChannelsParam(channels, \"unsubscribe\");\n return __spreadValues({}, channelsParam);\n }\n _checkMissingSubscriptions() {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.info(\"Subscribe was called before any listeners were attached. Move `.subscribe()` right after your event listeners to suppress this message.\");\n this.once(\"message\", () => {\n });\n }\n }\n getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => `${PRODUCT_PREFIX_PUBSUB}.${String(event)}`);\n return validateEventsToSubscribe(eventNamesWithPrefix);\n }\n async subscribe(channels) {\n this._checkMissingSubscriptions();\n const params = this._getSubscribeParams({ channels });\n this._setSubscribeParams(params);\n return super.subscribe();\n }\n async unsubscribe(channels) {\n if (this._sessionAuthStatus === \"unknown\" || this._sessionAuthStatus === \"unauthorized\") {\n throw new Error(\"You must be authenticated to unsubscribe from a channel\");\n }\n const params = this._getUnsubscribeParams({ channels });\n return new Promise(async (resolve, reject) => {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length > 0) {\n const execParams = {\n method: `${PRODUCT_PREFIX_PUBSUB}.unsubscribe`,\n params: __spreadProps(__spreadValues({}, params), {\n events: subscriptions\n })\n };\n try {\n await this.execute(execParams);\n } catch (error) {\n return reject(error);\n }\n } else {\n this.logger.warn(\"`unsubscribe()` was called without any listeners attached.\");\n }\n return resolve();\n });\n }\n updateToken(token) {\n return new Promise((resolve, reject) => {\n this.session.once(\"session.auth_error\", (error) => {\n reject(error);\n });\n this.session.once(\"session.connected\", () => {\n resolve();\n });\n this.store.dispatch(actions_exports.reauthAction({ token }));\n });\n }\n publish(params) {\n return this.execute({\n method: `${PRODUCT_PREFIX_PUBSUB}.publish`,\n params\n });\n }\n async getAllowedChannels() {\n await this._waitUntilSessionAuthorized();\n const authState = this.select(getAuthState);\n if (authState && \"channels\" in authState && authState.channels) {\n return authState.channels;\n }\n return {};\n }\n};\nvar createBasePubSubObject = (params) => {\n const pubSub = connect({\n store: params.store,\n Component: BasePubSubConsumer\n })(params);\n return pubSub;\n};\n\n// src/pubSub/PubSubMessage.ts\nvar PubSubMessage = class {\n constructor(payload) {\n this.payload = payload;\n }\n get id() {\n return this.payload.id;\n }\n get channel() {\n return this.payload.channel;\n }\n get content() {\n return this.payload.content;\n }\n get meta() {\n return this.payload.meta;\n }\n get publishedAt() {\n return this.payload.publishedAt;\n }\n};\n\n// src/chat/workers/chatWorker.ts\nvar chatWorker = function* (options) {\n getLogger().trace(\"chatWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case \"chat.channel.message\": {\n const { channel: channel3, message } = payload;\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, message), {\n channel: channel3\n }));\n const chatMessage = new ChatMessage(externalJSON);\n client.emit(\"message\", chatMessage);\n break;\n }\n case \"chat.member.joined\":\n case \"chat.member.updated\":\n case \"chat.member.left\": {\n const { member } = payload;\n const externalJSON = toExternalJSON(member);\n const chatMessage = new ChatMember(externalJSON);\n const event = stripNamespacePrefix(type);\n client.emit(event, chatMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown chat event: \"${type}\"`);\n break;\n }\n }\n const isChatEvent2 = (action) => action.type.startsWith(\"chat.\");\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, isChatEvent2);\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"chatWorker ended\");\n};\n\n// src/chat/BaseChat.ts\nvar BaseChatConsumer = class extends BasePubSubConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_CHAT}.subscribe`);\n }\n initWorker() {\n this.runWorker(\"chat\", { worker: chatWorker });\n }\n};\nvar BaseChatAPI = extendComponent(BaseChatConsumer, {\n publish,\n getMembers: getMembers2,\n getMessages,\n setMemberState,\n getMemberState\n});\nvar createBaseChatObject = (params) => {\n const chat = connect({\n store: params.store,\n Component: BaseChatAPI\n })(params);\n return chat;\n};\n\n// src/chat/ChatMessage.ts\nvar ChatMessage = class extends PubSubMessage {\n get member() {\n return this.payload.member;\n }\n};\n\n// src/chat/ChatMember.ts\nvar ChatMember = class {\n constructor(payload) {\n this.payload = payload;\n }\n get id() {\n return this.payload.id;\n }\n get channel() {\n return this.payload.channel;\n }\n get state() {\n var _a;\n return (_a = this.payload.state) != null ? _a : {};\n }\n};\n\n// src/chat/applyCommonMethods.ts\nvar transformParamChannels2 = (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 baseCodeTransform3 = () => {\n};\nfunction applyCommonMethods(targetClass) {\n return class extends targetClass {\n getMembers(params) {\n return this._client.execute({\n method: \"chat.members.get\",\n params\n }, {\n transformResolve: (payload) => ({\n members: payload.members.map((member) => toExternalJSON(member))\n })\n });\n }\n getMessages(params) {\n return this._client.execute({\n method: \"chat.messages.get\",\n params\n }, {\n transformResolve: (payload) => ({\n messages: payload.messages.map((message) => toExternalJSON(message)),\n cursor: payload.cursor\n })\n });\n }\n setMemberState(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this._client.execute({\n method: \"chat.member.set_state\",\n params: __spreadValues({\n member_id: memberId\n }, rest)\n }, {\n transformResolve: baseCodeTransform3,\n transformParams: transformParamChannels2\n });\n }\n getMemberState(_c = {}) {\n var _d = _c, { memberId } = _d, rest = __objRest(_d, [\"memberId\"]);\n return this._client.execute({\n method: \"chat.member.get_state\",\n params: __spreadValues({\n member_id: memberId\n }, rest)\n }, {\n transformResolve: (payload) => ({\n channels: payload.channels\n }),\n transformParams: transformParamChannels2\n });\n }\n };\n}\n\n// src/memberPosition/index.ts\nvar memberPosition_exports = {};\n__export(memberPosition_exports, {\n memberPositionWorker: () => memberPositionWorker,\n memberUpdatedWorker: () => memberUpdatedWorker\n});\n\n// src/memberPosition/workers.ts\nimport { fork as fork3 } from \"@redux-saga/core/effects\";\nvar defaultDispatcher = function* (type, payload, instance) {\n const event = stripNamespacePrefix(type);\n instance.emit(event, payload);\n};\nfunction* memberPositionLayoutChangedWorker(options) {\n const {\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n } = options;\n const layers = action.payload.layout.layers;\n const processedMembers = {};\n layers.forEach((layer) => {\n var _a;\n const memberId = layer.member_id;\n if (!memberId) {\n return;\n }\n const memberEventParams = memberList.get(memberId);\n if (memberEventParams && layer.position !== ((_a = memberEventParams.member) == null ? void 0 : _a.current_position)) {\n mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: layer.position\n });\n processedMembers[memberId] = true;\n } else {\n processedMembers[memberId] = false;\n }\n });\n for (const [memberId, payload] of memberList) {\n if (processedMembers[memberId]) {\n yield dispatcher == null ? void 0 : dispatcher(\"video.member.updated\", payload, instance);\n } else if (processedMembers[memberId] === void 0) {\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: \"off-canvas\"\n });\n if (!updatedMemberEventParams) {\n return;\n }\n yield dispatcher == null ? void 0 : dispatcher(\"video.member.updated\", updatedMemberEventParams, instance);\n }\n }\n}\nfunction* memberUpdatedWorker({\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n}) {\n var _a, _b;\n const memberId = action.payload.member.id;\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: (_b = (_a = memberList.get(memberId)) == null ? void 0 : _a.member) == null ? void 0 : _b.current_position\n });\n if (!updatedMemberEventParams) {\n return;\n }\n const {\n member: { updated = [] }\n } = action.payload;\n const memberUpdatedPayload = __spreadProps(__spreadValues({}, updatedMemberEventParams), {\n member: __spreadValues(__spreadValues({}, updatedMemberEventParams.member), action.payload.member)\n });\n memberList.set(memberId, memberUpdatedPayload);\n for (const key of updated) {\n const type = `${action.type}.${key}`;\n yield dispatcher == null ? void 0 : dispatcher(type, memberUpdatedPayload, instance);\n }\n yield dispatcher == null ? void 0 : dispatcher(action.type, memberUpdatedPayload, instance);\n}\nvar memberPositionWorker = function* memberPositionWorker2({\n instance,\n channels,\n initialState,\n getSession: getSession2,\n instanceMap,\n dispatcher = defaultDispatcher\n}) {\n if (!initialState) {\n return;\n }\n const { swEventChannel } = channels;\n let memberList = initializeMemberList(initialState);\n const addToMemberList = (payload) => {\n if (!memberList.has(payload.member.id)) {\n memberList.set(payload.member.id, payload);\n }\n };\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action2) => {\n const istargetEvent = action2.type === \"video.member.joined\" || action2.type === \"video.member.updated\" || action2.type === \"video.member.left\" || action2.type === \"video.layout.changed\";\n return istargetEvent;\n });\n switch (action.type) {\n case \"video.member.joined\": {\n addToMemberList(action.payload);\n break;\n }\n case \"video.member.updated\": {\n addToMemberList(action.payload);\n yield fork3(memberUpdatedWorker, {\n action,\n channels,\n memberList,\n instance,\n getSession: getSession2,\n instanceMap,\n dispatcher\n });\n break;\n }\n case \"video.member.left\": {\n const member = action.payload.member;\n memberList.delete(member.id);\n break;\n }\n case \"video.layout.changed\": {\n yield fork3(memberPositionLayoutChangedWorker, {\n action,\n channels,\n memberList,\n instance,\n dispatcher\n });\n break;\n }\n }\n }\n};\nvar mutateMemberCurrentPosition = ({\n memberList,\n memberId,\n currentPosition\n}) => {\n const memberEventParams = memberList.get(memberId);\n if (!memberEventParams) {\n return;\n } else if (!currentPosition) {\n return memberEventParams;\n }\n const updatedMemberEventParams = __spreadProps(__spreadValues({}, memberEventParams), {\n member: __spreadProps(__spreadValues({}, memberEventParams == null ? void 0 : memberEventParams.member), {\n current_position: currentPosition\n })\n });\n memberList.set(memberId, updatedMemberEventParams);\n return updatedMemberEventParams;\n};\nvar initializeMemberList = (payload) => {\n const members = payload.room_session.members;\n const memberList = /* @__PURE__ */ new Map();\n members.forEach((member) => {\n const memberId = member.id;\n const roomSessionId = payload.room_session.id || payload.room_session.room_session_id;\n memberList.set(memberId, {\n room_id: payload.room_session.room_id,\n room_session_id: roomSessionId,\n member\n });\n });\n return memberList;\n};\n\n// src/testUtils.ts\nvar testUtils_exports = {};\n__export(testUtils_exports, {\n configureFullStack: () => configureFullStack,\n configureJestStore: () => configureJestStore,\n createMockedLogger: () => createMockedLogger,\n createSessionChannel: () => createSessionChannel,\n createSwEventChannel: () => createSwEventChannel,\n rpcConnectResultVRT: () => rpcConnectResultVRT,\n wait: () => wait\n});\nimport { channel as channel2, multicastChannel as multicastChannel2 } from \"@redux-saga/core\";\nvar PROJECT_ID = \"8f0a119a-cda7-4497-a47d-c81493b824d4\";\nvar TOKEN = \"<VRT>\";\nvar createMockedLogger = () => ({\n fatal: jest.fn(),\n error: jest.fn(),\n warn: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n trace: jest.fn(),\n wsTraffic: jest.fn()\n});\nvar configureJestStore = (options) => {\n return configureStore2(__spreadValues({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false\n },\n SessionConstructor: BaseSession,\n runRootSaga: false\n }, options));\n};\nvar configureFullStack = () => {\n const session = {\n dispatch: console.log,\n connect: jest.fn(),\n disconnect: jest.fn(),\n execute: jest.fn()\n };\n const emitter = new EventEmitter();\n const store = configureStore2({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false\n },\n SessionConstructor: jest.fn().mockImplementation(() => {\n return session;\n })\n });\n store.dispatch(actions_exports.initAction());\n store.dispatch(actions_exports.authSuccessAction());\n return {\n store,\n session,\n emitter,\n destroy: () => store.dispatch(actions_exports.destroyAction())\n };\n};\nvar wait = (ms) => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n};\nvar rpcConnectResultVRT = {\n identity: \"f3bc99df-2c3d-4fa4-b1dc-e8a8ffc579e6@e3fefa44-1bad-4be9-ad9b-1cbb9abd60c7.west-us\",\n authorization: {\n type: \"video\",\n project_id: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n project: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n scopes: [\"video\"],\n scope_id: \"26675883-8499-4ee9-85eb-691c4aa209f8\",\n resource: \"9c80f1e8-9430-4070-a043-937eb3a96b38\",\n join_as: \"member\",\n user_name: \"Joe\",\n room: {\n name: \"lobby\",\n display_name: \"Lobby\",\n scopes: [\"room.self.audio_mute\", \"room.self.audio_unmute\"],\n meta: {}\n },\n signature: \"SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q\",\n media_allowed: \"all\",\n audio_allowed: \"both\",\n video_allowed: \"both\",\n meta: {}\n },\n protocol: \"signalwire_SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q_03e8c927-8ea3-4661-86d5-778c3e03296a_8f0a119a-cda7-4497-a47d-c81493b824d4\",\n ice_servers: [\n {\n urls: \"turn.swire.io:443\",\n credential: \"sFTwvi8ShXcYNOcyYjFy3ATIUpQ=\",\n credentialType: \"password\",\n username: \"1619521908:8f0a119a-cda7-4497-a47d-c81493b824d4\"\n }\n ]\n};\nvar createSwEventChannel = () => multicastChannel2();\nvar createSessionChannel = () => channel2();\n\n// src/index.ts\nvar selectors = __spreadValues({}, sessionSelectors_exports);\nexport {\n AuthError,\n BaseClient,\n BaseComponent,\n BaseConsumer,\n BaseJWTSession,\n BaseSession,\n chat_exports as Chat,\n ChatMember,\n ChatMessage,\n DEFAULT_CONNECT_VERSION,\n EventEmitter,\n GLOBAL_VIDEO_EVENTS,\n HttpError,\n INTERNAL_CALL_FABRIC_MEMBER_UPDATED_EVENTS,\n INTERNAL_MEMBER_UPDATABLE_PROPS,\n INTERNAL_MEMBER_UPDATED_EVENTS,\n LOCAL_EVENT_PREFIX,\n MEMBER_UPDATABLE_PROPS,\n MEMBER_UPDATED_EVENTS,\n memberPosition_exports as MemberPosition,\n pubSub_exports as PubSub,\n PubSubMessage,\n RPCConnect,\n RPCDisconnectResponse,\n RPCEventAckResponse,\n RPCExecute,\n RPCPing,\n RPCPingResponse,\n RPCReauthenticate,\n rooms_exports as Rooms,\n SWCloseEvent,\n UNIFIED_CONNECT_VERSION,\n VertoAnswer,\n VertoAttach,\n VertoBye,\n VertoInfo,\n VertoInvite,\n VertoModify,\n VertoPong,\n VertoResult,\n VertoSubscribe,\n WEBRTC_EVENT_TYPES,\n actions_exports as actions,\n componentActions,\n componentReducer,\n componentSelectors_exports as componentSelectors,\n configureStore2 as configureStore,\n connect,\n debounce,\n extendComponent,\n findNamespaceInPayload,\n fromSnakeToCamelCase,\n getEventEmitter,\n getLogger,\n initialComponentState,\n initialSessionState,\n isGlobalEvent,\n isJSONRPCRequest,\n isJSONRPCResponse,\n isSATAuth,\n isWebrtcEventType,\n makeRPCRequest,\n makeRPCResponse,\n mapCapabilityPayload,\n sagaEffects,\n sagaHelpers_exports as sagaHelpers,\n selectors,\n sessionActions,\n sessionReducer,\n setLogger,\n stripNamespacePrefix,\n testUtils_exports as testUtils,\n timeoutPromise,\n toExternalJSON,\n toInternalAction,\n toInternalEventName,\n toLocalEvent,\n toSnakeCaseKeys,\n toSyntheticEvent,\n v4 as uuid,\n validateEventsToSubscribe\n};\n//# sourceMappingURL=index.esm.js.map\n","import { getLogger } from '@signalwire/core';\nexport const RTCPeerConnection = (config) => {\n return new window.RTCPeerConnection(config);\n};\n/**\n * Returns whether the current environment supports the media devices API.\n */\nexport const supportsMediaDevices = () => {\n return typeof navigator !== 'undefined' && !!navigator.mediaDevices;\n};\n/**\n * Returns the mediaDevices object if supported, otherwise throws an error.\n */\nexport const getMediaDevicesApi = () => {\n if (!supportsMediaDevices()) {\n throw new Error(\"The media devices API isn't supported in this environment\");\n }\n return navigator.mediaDevices;\n};\n/**\n * Returns whether the current environment supports `getUserMedia`.\n */\nexport const supportsGetUserMedia = () => {\n return typeof getMediaDevicesApi().getUserMedia === 'function';\n};\n/**\n * Returns whether the current environment supports `getDisplayMedia`.\n */\nexport const supportsGetDisplayMedia = () => {\n return typeof getMediaDevicesApi().getDisplayMedia === 'function';\n};\n/**\n * Returns a dictionary whose fields specify the constrainable properties the user agent understands.\n */\nexport const getSupportedConstraints = () => {\n return getMediaDevicesApi().getSupportedConstraints();\n};\nexport const streamIsValid = (stream) => stream && stream instanceof MediaStream;\n/**\n * Returns whether the current environment supports the selection of a media output device.\n */\nexport const supportsMediaOutput = () => {\n return 'sinkId' in HTMLMediaElement.prototype;\n};\n/**\n * Assigns the specified audio output device to the specified HTMLMediaElement.\n * The device with id `deviceId` must be an audio output device. Asynchronously\n * returns whether the operation had success.\n *\n * > 📘\n * > Some browsers do not support output device selection. You can check by\n * > calling [`supportsMediaOutput`](supportsMediaOutput).\n *\n * @param el target element\n * @param deviceId id of the audio output device\n * @returns a promise of whether the operation had success\n *\n * @example\n * ```typescript\n * const el = document.querySelector('video')\n * const outDevices = await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * await SignalWire.WebRTC.setMediaElementSinkId(el, outDevices[0].deviceId)\n * // true\n```\n */\nexport const setMediaElementSinkId = async (el, deviceId) => {\n if (el === null) {\n getLogger().warn('No HTMLMediaElement to attach the speakerId');\n return;\n }\n else if (typeof deviceId !== 'string') {\n getLogger().warn(`Invalid speaker deviceId: '${deviceId}'`);\n return;\n }\n else if (!supportsMediaOutput()) {\n getLogger().warn('Browser does not support output device selection.');\n return;\n }\n try {\n // @ts-ignore\n return await el.setSinkId(deviceId);\n }\n catch (error) {\n if (error.name === 'SecurityError') {\n getLogger().error(`You need to use HTTPS for selecting audio output device: ${error}`);\n }\n else {\n getLogger().error(`Error: ${error}`);\n }\n throw error;\n }\n};\nexport const sdpToJsonHack = (sdp) => sdp;\nexport const stopStream = (stream) => {\n var _a;\n if (streamIsValid(stream)) {\n (_a = stream === null || stream === void 0 ? void 0 : stream.getTracks()) === null || _a === void 0 ? void 0 : _a.forEach(stopTrack);\n }\n};\nexport const stopTrack = (track) => {\n if (track && track.readyState === 'live') {\n track.stop();\n track.dispatchEvent(new Event('ended'));\n }\n};\n/**\n * Maps permission's names from `DevicePermissionDescriptor[\"name\"]`\n * to `MediaDeviceKind`\n */\nconst PERMISSIONS_MAPPING = {\n camera: 'videoinput',\n microphone: 'audioinput',\n speaker: 'audiooutput',\n};\nexport const _getMediaDeviceKindByName = (name) => {\n if (!name) {\n return undefined;\n }\n return PERMISSIONS_MAPPING[name];\n};\n//# sourceMappingURL=primitives.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Enumerates the media input and output devices available on this device.\n *\n * > 📘\n * > Depending on the browser, some information (such as the `label` and\n * > `deviceId` attributes) could be hidden until permission is granted, for\n * > example by calling {@link getUserMedia}.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.enumerateDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"EEX/N2...AjrOs=\"\n * // },\n * // ...\n * // ]\n * ```\n */\nexport const enumerateDevices = () => {\n return getMediaDevicesApi().enumerateDevices();\n};\nexport const enumerateDevicesByKind = async (filterByKind) => {\n let devices = await enumerateDevices().catch((_error) => []);\n if (filterByKind) {\n devices = devices.filter(({ kind }) => kind === filterByKind);\n }\n return devices;\n};\n//# sourceMappingURL=enumerateDevices.js.map","import { getLogger } from '@signalwire/core';\nimport { _getMediaDeviceKindByName } from './primitives';\nimport { enumerateDevicesByKind } from './enumerateDevices';\n/**\n * For browsers not supporting the Permissions API\n * @param {string} kind\n * @returns\n */\nconst _legacyCheckPermissions = async (kind) => {\n const devices = await enumerateDevicesByKind(kind);\n if (!devices.length) {\n getLogger().warn(`No ${kind} devices to check for permissions!`);\n return null;\n }\n return devices.every(({ deviceId, label }) => Boolean(deviceId && label));\n};\n/**\n * Asynchronously returns whether we have permissions to access the specified\n * resource. Some common parameter values for `name` are `\"camera\"`,\n * `\"microphone\"`, and `\"speaker\"`. In those cases, prefer the dedicated methods\n * {@link checkCameraPermissions}, {@link checkMicrophonePermissions}, and\n * {@link checkSpeakerPermissions}.\n * @param name name of the resource\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkPermissions(\"camera\")\n * // true: we have permission for using the camera\n * ```\n */\nexport const checkPermissions = async (name) => {\n if ('permissions' in navigator &&\n typeof navigator.permissions.query === 'function' &&\n name) {\n try {\n /**\n * `navigator.permissions.query` can throw if `name` is not a\n * valid enumation value for `PermissionName`. As of today, some\n * browsers like Fireforx will throw with `name: \"camera\"`\n */\n // @ts-expect-error\n const status = await navigator.permissions.query({ name });\n return status.state === 'granted';\n }\n catch (e) { }\n }\n return _legacyCheckPermissions(_getMediaDeviceKindByName(name));\n};\n/**\n * Asynchronously returns whether we have permissions to access the camera.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkCameraPermissions()\n * // true\n * ```\n */\nexport const checkCameraPermissions = () => checkPermissions('camera');\n/**\n * Asynchronously returns whether we have permissions to access the microphone.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkMicrophonePermissions()\n * // true\n * ```\n */\nexport const checkMicrophonePermissions = () => checkPermissions('microphone');\n/**\n * Asynchronously returns whether we have permissions to access the speakers.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkSpeakerPermissions()\n * // true\n * ```\n */\nexport const checkSpeakerPermissions = () => checkPermissions('speaker');\n//# sourceMappingURL=permissions.js.map","import { getLogger, timeoutPromise } from '@signalwire/core';\nimport { getMediaDevicesApi, getSupportedConstraints } from './primitives';\nimport { checkMicrophonePermissions, checkCameraPermissions, } from './permissions';\nconst GUM_TIMEOUT = 5000;\n/**\n * Check if we need to set a timeout on the gUM request.\n * In case the user needs to go through the browser prompt\n * for permissions we can't set a timer but instead just wait for\n * the user and/or the UA to solve the promise.\n * If we have the permissions already, set the timeout because we\n * had some cases where the UA is stuck reading from the device\n * and the gUM request was never resolved.\n *\n * @internal\n * @returns True/False whether the timeout should be used\n */\nconst _useTimeoutForGUM = async (constraints) => {\n const promises = [];\n if (constraints === null || constraints === void 0 ? void 0 : constraints.audio) {\n promises.push(checkMicrophonePermissions());\n }\n if (constraints === null || constraints === void 0 ? void 0 : constraints.video) {\n promises.push(checkCameraPermissions());\n }\n if (promises.length) {\n const results = await Promise.all(promises);\n return results.every(Boolean);\n }\n return false;\n};\n/**\n * Prompts the user to share one or more media devices and asynchronously\n * returns an associated [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object.\n *\n * For more information, see [`MediaDevices.getUserMedia()`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia).\n *\n * @param constraints an optional [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * To only request audio media:\n *\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n *\n * @example\n * To request both audio and video, specifying constraints for the video:\n *\n * ```typescript\n * const constraints = {\n * audio: true,\n * video: {\n * width: { min: 1024, ideal: 1280, max: 1920 },\n * height: { min: 576, ideal: 720, max: 1080 }\n * }\n * }\n * await SignalWire.WebRTC.getUserMedia(constraints)\n * // MediaStream {id: \"EDVk...\", active: true, ...}\n * ```\n */\nexport const getUserMedia = async (constraints = { audio: true, video: true }) => {\n var _a;\n try {\n const promise = getMediaDevicesApi().getUserMedia(constraints);\n const useTimeout = await _useTimeoutForGUM(constraints);\n if (useTimeout) {\n const exception = new Error('Timeout reading from your devices');\n return await timeoutPromise(promise, GUM_TIMEOUT, exception);\n }\n return await promise;\n }\n catch (error) {\n switch (error.name) {\n case 'Error': {\n getLogger().error((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : \"navigator.mediaDevices.getUserMedia doesn't seem to be supported.\");\n break;\n }\n case 'NotFoundError': {\n getLogger().error('No media tracks of the type specified were found that satisfy the given constraints.');\n break;\n }\n case 'NotReadableError': {\n getLogger().error('Hardware error occurred at the operating system, browser, or Web page level which prevented access to the device. This could have been caused by having the Camera or Mic being user by another application.');\n break;\n }\n case 'OverconstrainedError': {\n getLogger().error(`The constraint: ${error.constraint} cannot be met by the selected device.`);\n getLogger().info(`List of available constraints:`, getSupportedConstraints());\n break;\n }\n case 'NotAllowedError': {\n getLogger().error('The user has mostly likely denied access to the device. This could also happen if the browsing context is insecure (using HTTP rather than HTTPS)');\n break;\n }\n case 'TypeError': {\n if (Object.keys(constraints).length === 0) {\n getLogger().error('Constraints can\\'t be empty nor have \"video\" and \"audio\" set to false.');\n }\n else {\n getLogger().error('Please check that you are calling this method from a secure context (using HTTPS rather than HTTP).');\n }\n break;\n }\n case 'SecurityError': {\n getLogger().error('User media support is disabled on the Document on which getUserMedia() was called. The mechanism by which user media support is enabled and disabled is left up to the individual user agent.');\n break;\n }\n }\n throw error;\n }\n};\n//# sourceMappingURL=getUserMedia.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Prompts the user to share the screen and asynchronously returns a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object associated with a display or part of it.\n *\n * @param constraints an optional\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDisplayMedia()\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n */\nexport const getDisplayMedia = (constraints) => {\n return getMediaDevicesApi().getDisplayMedia(constraints);\n};\n//# sourceMappingURL=getDisplayMedia.js.map","import { getLogger, EventEmitter } from '@signalwire/core';\nimport { getUserMedia, enumerateDevices, enumerateDevicesByKind, checkPermissions, checkCameraPermissions, checkMicrophonePermissions, checkSpeakerPermissions, _getMediaDeviceKindByName, stopStream, supportsMediaOutput, getMediaDevicesApi, } from './index';\nconst _constraintsByKind = (kind) => {\n return {\n audio: !kind || kind === 'all' || kind === 'microphone' || kind === 'speaker',\n video: !kind || kind === 'all' || kind === 'camera',\n };\n};\n/**\n * After prompting the user for permission, returns an array of media input and\n * output devices available on this machine. If `kind` is not null, only the\n * devices of the specified kind are returned. Possible values of the `kind`\n * parameters are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`, which\n * respectively correspond to functions\n * {@link getCameraDevicesWithPermissions},\n * {@link getMicrophoneDevicesWithPermissions}, and\n * {@link getSpeakerDevicesWithPermissions}.\n *\n * @param kind filter for this device category\n * @param fullList By default, only devices for which\n * we have been granted permissions are returned. To obtain a list of devices regardless of\n * the permissions, pass `fullList=true`. Note however that some values such as\n * `name` and `deviceId` could be omitted.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevicesWithPermissions(\"camera\")\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getDevices} for better cross browser compatibility.\n */\nexport const getDevicesWithPermissions = async (kind, fullList = false) => getDevices(kind, fullList);\n/**\n * After prompting the user for permission, returns an array of camera devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getCameraDevices} for better cross browser compatibility.\n */\nexport const getCameraDevicesWithPermissions = () => getDevicesWithPermissions('camera');\n/**\n * After prompting the user for permission, returns an array of microphone devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getMicrophoneDevices} for better cross browser compatibility.\n */\nexport const getMicrophoneDevicesWithPermissions = () => getDevicesWithPermissions('microphone');\n/**\n * After prompting the user for permission, returns an array of speaker devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getSpeakerDevices} for better cross browser compatibility.\n */\nexport const getSpeakerDevicesWithPermissions = () => getDevicesWithPermissions('speaker');\nconst _filterDevices = (devices, options = {}) => {\n const found = [];\n return devices.filter(({ deviceId, kind, groupId }) => {\n var _a;\n if (!deviceId || (options.targets && !((_a = options.targets) === null || _a === void 0 ? void 0 : _a.includes(kind)))) {\n return false;\n }\n if (!groupId) {\n return true;\n }\n const key = `${kind}-${groupId}`;\n const checkDefault = (options === null || options === void 0 ? void 0 : options.excludeDefault) ? deviceId !== 'default' : true;\n if (!found.includes(key) && checkDefault) {\n found.push(key);\n return true;\n }\n return false;\n });\n};\n/**\n * Enumerates the media input and output devices available on this machine. If\n * `name` is provided, only the devices of the specified kind are returned.\n * Possible values of the `name` parameters are `\"camera\"`, `\"microphone\"`, and\n * `\"speaker\"`, which respectively correspond to functions\n * {@link getCameraDevices}, {@link getMicrophoneDevices}, and\n * {@link getSpeakerDevices}.\n *\n * @param name filter for this device category\n * @param fullList Default to false. Set to true to retrieve the raw list as returned by\n * the browser, which might include multiple, duplicate deviceIds for the same group.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevices(\"camera\", true)\n * // [\n * // {\n * // \"deviceId\": \"3c4f97...\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD Camera\",\n * // \"groupId\": \"828fec...\"\n * // }\n * // ]\n * ```\n */\nexport const getDevices = async (name, fullList = false) => {\n const hasPerms = await checkPermissions(name);\n let stream = undefined;\n if (hasPerms === false) {\n const constraints = _constraintsByKind(name);\n stream = await getUserMedia(constraints);\n }\n const devices = await enumerateDevicesByKind(_getMediaDeviceKindByName(name));\n /**\n * Firefox requires an active stream at the time of `enumerateDevices`\n * so we need to stop it after `WebRTC.enumerateDevicesByKind`\n */\n if (stream) {\n stopStream(stream);\n }\n if (fullList === true) {\n return devices;\n }\n return _filterDevices(devices);\n};\n/**\n * Returns an array of camera devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n */\nexport const getCameraDevices = () => getDevices('camera');\n/**\n * Returns an array of microphone devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getMicrophoneDevices = () => getDevices('microphone');\n/**\n * Returns an array of speaker devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getSpeakerDevices = () => getDevices('speaker');\n/**\n * Assure a deviceId exists in the current device list from the browser.\n * It checks for deviceId or label - in case the UA changed the deviceId randomly\n */\nexport const assureDeviceId = async (id, label, name) => {\n const devices = await getDevices(name, true);\n for (let i = 0; i < devices.length; i++) {\n const { deviceId, label: deviceLabel } = devices[i];\n if (id === deviceId || label === deviceLabel) {\n return deviceId;\n }\n }\n return null;\n};\n/**\n * Helper methods to assure a deviceId without asking the user the \"kind\"\n */\nexport const assureVideoDevice = (id, label) => assureDeviceId(id, label, 'camera');\nexport const assureAudioInDevice = (id, label) => assureDeviceId(id, label, 'microphone');\nexport const assureAudioOutDevice = (id, label) => assureDeviceId(id, label, 'speaker');\nconst _deviceInfoToMap = (devices) => {\n const map = new Map();\n devices.forEach((deviceInfo) => {\n if (deviceInfo.deviceId) {\n map.set(deviceInfo.deviceId, deviceInfo);\n }\n });\n return map;\n};\nconst _getDeviceListDiff = (oldDevices, newDevices) => {\n const current = _deviceInfoToMap(oldDevices);\n const removals = _deviceInfoToMap(oldDevices);\n const updates = [];\n getLogger().debug('[_getDeviceListDiff] <- oldDevices', oldDevices);\n getLogger().debug('[_getDeviceListDiff] -> newDevices', newDevices);\n const additions = newDevices.filter((newDevice) => {\n const id = newDevice.deviceId;\n const oldDevice = current.get(id);\n if (oldDevice) {\n removals.delete(id);\n if (newDevice.label !== oldDevice.label) {\n updates.push(newDevice);\n }\n }\n return oldDevice === undefined;\n });\n return {\n updated: updates.map((value) => {\n return {\n type: 'updated',\n payload: value,\n };\n }),\n // Removed devices\n removed: Array.from(removals, ([_, value]) => value).map((value) => {\n return {\n type: 'removed',\n payload: value,\n };\n }),\n added: additions.map((value) => {\n return {\n type: 'added',\n payload: value,\n };\n }),\n };\n};\nconst TARGET_PERMISSIONS_MAP = {\n // FIXME: Replace this object with just checkPermissions(<target>)\n camera: checkCameraPermissions,\n microphone: checkMicrophonePermissions,\n speaker: checkSpeakerPermissions,\n};\nconst DEFAULT_TARGETS = [\n 'camera',\n 'microphone',\n 'speaker',\n];\nconst ALLOWED_TARGETS_MSG = `Allowed targets are: '${DEFAULT_TARGETS.join(\"', '\")}'`;\nconst CHECK_SUPPORT_MAP = {\n speaker: supportsMediaOutput,\n};\nconst checkTargetPermissions = async (options) => {\n const targets = options.targets;\n const permissions = await Promise.all(targets.map((target) => TARGET_PERMISSIONS_MAP[target]()));\n return permissions.reduce((reducer, permission, index) => {\n var _a;\n const target = targets[index];\n /**\n * If we don't specify a check for the target we'll assume\n * there's no need to check for support\n */\n const platformSupportStatus = target in CHECK_SUPPORT_MAP ? (_a = CHECK_SUPPORT_MAP[target]) === null || _a === void 0 ? void 0 : _a.call(CHECK_SUPPORT_MAP) : true;\n const supportStatus = platformSupportStatus\n ? 'supported'\n : 'unsupported';\n reducer[supportStatus].push([target, !!permission]);\n return reducer;\n }, { supported: [], unsupported: [] });\n};\nconst validateTargets = async (options) => {\n var _a;\n const targets = ((_a = options.targets) !== null && _a !== void 0 ? _a : DEFAULT_TARGETS).filter((target) => {\n if (!DEFAULT_TARGETS.includes(target)) {\n getLogger().warn(`We'll ignore the \"${target}\" target as it is not allowed. ${ALLOWED_TARGETS_MSG}.`);\n return false;\n }\n return true;\n });\n if (!targets.length) {\n throw new Error(`At least one \"target\" is required for createDeviceWatcher(). ${ALLOWED_TARGETS_MSG}.`);\n }\n const permissions = await checkTargetPermissions({ targets });\n if (permissions.unsupported.length > 0 &&\n targets.length === permissions.unsupported.length) {\n throw new Error(`The platform doesn't support \"${targets.join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices.`);\n }\n else if (permissions.supported.every(([_, status]) => !status)) {\n throw new Error('You must ask the user for permissions before being able to listen for device changes. Try calling getUserMedia() before calling `createDeviceWatcher()`.');\n }\n let needPermissionsTarget = [];\n const filteredTargets = permissions.supported.reduce((reducer, [target, status]) => {\n if (!status) {\n needPermissionsTarget.push(target);\n }\n else {\n reducer.push(target);\n }\n return reducer;\n }, []);\n /**\n * If the length of these two arrays is different it means whether\n * we have unsupported devices or that the user hasn't granted the\n * permissions for certain targets\n */\n if (filteredTargets.length !== targets.length) {\n const unsupportedTargets = permissions.unsupported.length > 0\n ? `The platform doesn't support \"${permissions.unsupported\n .map(([t]) => t)\n .join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices. `\n : '';\n const needPermissions = needPermissionsTarget.length > 0\n ? `The user hasn't granted permissions for the following targets: ${needPermissionsTarget.join(', ')}. `\n : '';\n getLogger().warn(`${unsupportedTargets}${needPermissions}We'll be watching for the following targets instead: \"${filteredTargets.join(', ')}\"`);\n }\n getLogger().debug(`Watching these targets: \"${filteredTargets.join(', ')}\"`);\n return filteredTargets;\n};\n// FIXME: Move createDeviceWatcher and all related helpers/derived methods to its own module\n/**\n * Asynchronously returns an event emitter that notifies changes in the devices.\n * The possible events are:\n *\n * - \"added\": a device has been added\n * - \"removed\": a device has been removed\n * - \"updated\": a device has been updated\n * - \"changed\": any of the previous events occurred\n *\n * In all cases, your event handler gets as parameter an object `e` with the\n * following keys:\n *\n * - `e.changes`: the changed devices. For \"added\", \"removed\", and \"updated\"\n * event handlers, you only get the object associated to the respective event\n * (i.e., only a list of added devices, removed devices, or updated devices).\n * For \"changed\" event handlers, you get all three lists.\n * - `e.devices`: the new list of devices\n *\n * For device-specific helpers, see {@link createCameraDeviceWatcher},\n * {@link createMicrophoneDeviceWatcher}, and {@link createSpeakerDeviceWatcher}.\n *\n * @param options if null, the event emitter is associated to all devices for\n * which we have permission. Otherwise, you can pass an object\n * `{targets: string}`, where the value for key targets is a list of categories.\n * Allowed categories are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`.\n *\n * @example\n * Creating an event listener on the \"changed\" event and printing the received parameter after both connecting and disconnecting external headphones:\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * h = await SignalWire.WebRTC.createDeviceWatcher()\n * h.on('changed', (c) => console.log(c))\n * ```\n *\n * @example\n * Getting notified just for changes about audio input and output devices, ignoring the camera:\n * ```typescript\n * h = await SignalWire.WebRTC.createDeviceWatcher({targets: ['microphone', 'speaker']})\n * h.on('changed', (c) => console.log(c))\n * ```\n */\nexport const createDeviceWatcher = async (options = {}) => {\n const targets = await validateTargets({ targets: options.targets });\n const emitter = new EventEmitter();\n const currentDevices = await enumerateDevices();\n const kinds = targets === null || targets === void 0 ? void 0 : targets.reduce((reducer, name) => {\n const kind = _getMediaDeviceKindByName(name);\n if (kind) {\n reducer.push(kind);\n }\n return reducer;\n }, []);\n let knownDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n const deviceChangeHandler = async () => {\n const currentDevices = await enumerateDevices();\n const oldDevices = knownDevices;\n const newDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n knownDevices = newDevices;\n const changes = _getDeviceListDiff(oldDevices, newDevices);\n const hasAddedDevices = changes.added.length > 0;\n const hasRemovedDevices = changes.removed.length > 0;\n const hasUpdatedDevices = changes.updated.length > 0;\n if (hasAddedDevices || hasRemovedDevices || hasUpdatedDevices) {\n emitter.emit('changed', { changes: changes, devices: newDevices });\n }\n if (hasAddedDevices) {\n emitter.emit('added', {\n changes: changes.added,\n devices: newDevices,\n });\n }\n if (hasRemovedDevices) {\n emitter.emit('removed', {\n changes: changes.removed,\n devices: newDevices,\n });\n }\n if (hasUpdatedDevices) {\n emitter.emit('updated', {\n changes: changes.updated,\n devices: newDevices,\n });\n }\n };\n getMediaDevicesApi().addEventListener('devicechange', deviceChangeHandler);\n return emitter;\n};\n/**\n * Asynchronously returns an event emitter that notifies changes in all\n * microphone devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['microphone'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createMicrophoneDeviceWatcher = () => createDeviceWatcher({ targets: ['microphone'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all speaker\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['speaker'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createSpeakerDeviceWatcher = () => createDeviceWatcher({ targets: ['speaker'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all camera\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['camera'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createCameraDeviceWatcher = () => createDeviceWatcher({ targets: ['camera'] });\nconst isMediaStream = (options) => {\n return typeof (options === null || options === void 0 ? void 0 : options.getTracks) === 'function';\n};\n// FIXME: Move getMicrophoneAnalyzerMediaStream and all related helpers/derived methods to its own module\nconst getMicrophoneAnalyzerMediaStream = async (options) => {\n if (isMediaStream(options)) {\n return options;\n }\n let constraints;\n if (typeof options === 'string') {\n constraints = {\n audio: {\n deviceId: options,\n },\n };\n }\n else {\n constraints = {\n audio: options,\n };\n }\n return getUserMedia(constraints);\n};\nconst createAnalyzer = (audioContext) => {\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 64;\n analyser.minDecibels = -90;\n analyser.maxDecibels = -10;\n analyser.smoothingTimeConstant = 0.85;\n return analyser;\n};\nconst MAX_VOLUME = 100;\n/**\n * Initializes a microphone analyzer. You can use a MicrophoneAnalyzer to track\n * the input audio volume.\n *\n * To stop the analyzer, plase call the `destroy()` method on the object\n * returned by this method.\n *\n * The returned object emits the following events:\n *\n * - `volumeChanged`: instantaneous volume from 0 to 100\n * - `destroyed`: the object has been destroyed. You get a parameter\n * describing the reason, which can be `null` (if you called `destroy()`),\n * `\"error\"` (in case of errors), or `\"disconnected\"` (if the device was\n * disconnected).\n *\n * @example\n *\n * ```js\n * const micAnalyzer = await createMicrophoneAnalyzer('device-id')\n *\n * micAnalyzer.on('volumeChanged', (vol) => {\n * console.log(\"Volume: \", vol)\n * })\n * micAnalyzer.on('destroyed', (reason) => {\n * console.log('Microphone analyzer destroyed', reason)\n * })\n *\n * micAnalyzer.destroy()\n * ```\n *\n * @param options either the id of the device to analize, or\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints),\n * or a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @returns Asynchronously returns a MicrophoneAnalyzer.\n */\nexport const createMicrophoneAnalyzer = async (options) => {\n const stream = await getMicrophoneAnalyzerMediaStream(options);\n if (!stream) {\n throw new Error('Failed to get the audio stream');\n }\n const emitter = new EventEmitter();\n const audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n const analyser = createAnalyzer(audioContext);\n let rafId;\n let volume;\n try {\n audioContext.createMediaStreamSource(stream).connect(analyser);\n }\n catch (error) {\n throw new Error('No audio track found');\n }\n /**\n * If the device gets disconnected, we'll notify the user of\n * the change.\n */\n stream.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', () => {\n emitter.emit('destroyed', 'disconnected');\n });\n });\n const startMetering = () => {\n try {\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(dataArray);\n /**\n * dataArray contains the values of the volume\n * gathered within a single requestAnimationFrame With\n * reduce and divide by 20 we translate the array\n * values into a 0-100 scale to draw the green bars\n * for the voice/volume energy.\n */\n const latestVol = dataArray.reduce((final, value) => final + value, 0) / 20;\n if (volume !== latestVol) {\n volume = latestVol;\n emitter.emit('volumeChanged', Math.min(volume, MAX_VOLUME));\n }\n rafId = requestAnimationFrame(startMetering);\n }\n catch (e) {\n emitter.emit('destroyed', 'error');\n }\n };\n rafId = requestAnimationFrame(startMetering);\n const destroy = () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n }\n if (audioContext.state !== 'closed') {\n audioContext.close().catch((error) => {\n getLogger().error('Error closing the AudioContext', error);\n });\n }\n /**\n * If the user provided a MediaStream, we don't need to\n * close it.\n */\n if (!isMediaStream(options)) {\n stream.getTracks().forEach((track) => track.stop());\n }\n emitter.emit('destroyed', null);\n emitter.removeAllListeners();\n };\n return new Proxy(\n // @ts-expect-error\n emitter, {\n get(target, prop, receiver) {\n if (prop === 'destroy') {\n return destroy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n};\n/**\n * Returns the speaker based on the given id.\n * @param id string\n * @returns MediaDevices | undefined\n */\nexport const getSpeakerById = async (id) => {\n const speakers = await getSpeakerDevices();\n return speakers.find((audio) => audio.deviceId === id ||\n (audio.deviceId === 'default' && id === '') ||\n (audio.deviceId === '' && id === 'default'));\n};\n//# sourceMappingURL=deviceHelpers.js.map","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","import { getLogger } from '@signalwire/core';\nimport SDPUtils from 'sdp';\nconst _isAudioLine = (line) => /^m=audio/.test(line);\nconst _isVideoLine = (line) => /^m=video/.test(line);\nconst _getCodecPayloadType = (line) => {\n const pattern = new RegExp('a=rtpmap:(\\\\d+) \\\\w+\\\\/\\\\d+');\n const result = line.match(pattern);\n return result && result.length == 2 ? result[1] : null;\n};\n/**\n * test if sdp has a video section\n */\nexport const hasMediaSection = (sdp, media) => {\n return sdp.includes(`\\r\\nm=${media}`);\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 (offerVideoIndex == -1 ||\n offerAudioIndex == -1 ||\n offerAudioIndex < offerVideoIndex) {\n return answer;\n }\n const answerLines = answer.split(endOfLine);\n const answerAudioIndex = answerLines.findIndex(_isAudioLine);\n const answerVideoIndex = answerLines.findIndex(_isVideoLine);\n const audioLines = answerLines.slice(answerAudioIndex, answerVideoIndex);\n const videoLines = answerLines.slice(answerVideoIndex, answerLines.length - 1);\n const beginLines = answerLines.slice(0, answerAudioIndex);\n return [...beginLines, ...videoLines, ...audioLines, ''].join(endOfLine);\n};\n/**\n * Modify the SDP to increase video bitrate\n * @return the SDP modified\n */\nexport const sdpBitrateHack = (sdp, max, min, start) => {\n const endOfLine = '\\r\\n';\n const lines = sdp.split(endOfLine);\n lines.forEach((line, i) => {\n if (/^a=fmtp:\\d*/.test(line)) {\n lines[i] += `;x-google-max-bitrate=${max};x-google-min-bitrate=${min};x-google-start-bitrate=${start}`;\n }\n else if (/^a=mid:(1|video)/.test(line)) {\n lines[i] += `\\r\\nb=AS:${max}`;\n }\n });\n return lines.join(endOfLine);\n};\n// const sdpAudioRemoveRTPExtensions = (sdp: string, extensionsToFilter: string[]): string => {\n// const endOfLine = '\\r\\n'\n// let beginLines: string[] = []\n// let audioLines: string[] = []\n// let videoLines: string[] = []\n// const newLines = sdp.split(endOfLine)\n// const offerAudioIndex = newLines.findIndex(_isAudioLine)\n// const offerVideoIndex = newLines.findIndex(_isVideoLine)\n// if (offerAudioIndex < offerVideoIndex) {\n// beginLines = newLines.slice(0, offerAudioIndex)\n// audioLines = newLines.slice(offerAudioIndex, offerVideoIndex)\n// videoLines = newLines.slice(offerVideoIndex, (newLines.length - 1))\n// } else {\n// beginLines = newLines.slice(0, offerVideoIndex)\n// audioLines = newLines.slice(offerAudioIndex, (newLines.length - 1))\n// videoLines = newLines.slice(offerVideoIndex, offerAudioIndex)\n// }\n// const newAudioLines = audioLines.filter((line: string) => {\n// return !(line.includes(extensionsToFilter[0]) || line.includes(extensionsToFilter[1]) || line.includes(extensionsToFilter[2]))\n// })\n// return [...beginLines, ...newAudioLines, ...videoLines, ''].join(endOfLine)\n// }\n// const sdpAudioRemoveRidMidExtHack = (sdp: string): string => {\n// const extensionsToFilter = [\n// 'urn:ietf:params:rtp-hdrext:sdes:mid',\n// 'urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id',\n// 'urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id',\n// ]\n// return sdpAudioRemoveRTPExtensions(sdp, extensionsToFilter)\n// }\n/**\n * Check for srflx, prflx or relay candidates\n * TODO: improve the logic check private/public IP for typ host\n *\n * @param sdp string\n * @returns boolean\n */\nexport const sdpHasValidCandidates = (sdp) => {\n try {\n const regex = /typ (?:srflx|prflx|relay)/;\n const sections = SDPUtils.getMediaSections(sdp);\n for (const section of sections) {\n const lines = SDPUtils.splitLines(section);\n const valid = lines.some((line) => {\n return line.indexOf('a=candidate') === 0 && regex.test(line);\n });\n if (!valid) {\n return false;\n }\n }\n return true;\n }\n catch (error) {\n getLogger().error('Error checking SDP', error);\n return false;\n }\n};\n/**\n * Remove \"a=candidate\" lines with local candidates\n * https://bloggeek.me/psa-mdns-and-local-ice-candidates-are-coming/\n */\nexport const sdpRemoveLocalCandidates = (sdp) => {\n const pattern = /^a=candidate.*.local\\ .*/;\n const endOfLine = '\\r\\n';\n return sdp\n .split(endOfLine)\n .filter((line) => !pattern.test(line))\n .join(endOfLine);\n};\n//# sourceMappingURL=sdpHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport { getUserMedia as _getUserMedia } from './getUserMedia';\nimport { assureDeviceId } from './deviceHelpers';\nimport { hasMediaSection } from './sdpHelpers';\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};\nconst _shouldNegotiateVideo = (options) => {\n var _a;\n return (((_a = options.negotiateVideo) !== null && _a !== void 0 ? _a : true) &&\n (!options.remoteSdp ||\n hasMediaSection(options.remoteSdp, 'video')));\n};\nconst _shouldNegotiateAudio = (options) => {\n var _a;\n return (((_a = options.negotiateAudio) !== null && _a !== void 0 ? _a : true) &&\n (!options.remoteSdp ||\n hasMediaSection(options.remoteSdp, 'audio')));\n};\nconst _getVideoConstraints = (options) => {\n var _a;\n return _shouldNegotiateVideo(options) ? (_a = options.video) !== null && _a !== void 0 ? _a : !!options.camId\n : false;\n};\nconst _getAudioConstraints = (options) => {\n var _a;\n return _shouldNegotiateAudio(options) ? (_a = options.audio) !== null && _a !== void 0 ? _a : true\n : false;\n};\nexport const getMediaConstraints = async (options) => {\n let audio = _getAudioConstraints(options);\n const { micLabel = '', micId } = options;\n if (micId && audio) {\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 = _getVideoConstraints(options);\n const { camLabel = '', camId } = options;\n if (camId && video) {\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};\nexport const filterIceServers = (servers, options) => {\n const { disableUdpIceServers = false } = options;\n const filterOutUdpUrls = (urls) => {\n const transportParam = 'transport=udp';\n if (Array.isArray(urls)) {\n return urls.filter((url) => !url.includes(transportParam));\n }\n return urls.includes(transportParam) ? '' : urls;\n };\n return servers.map((server) => (Object.assign(Object.assign({}, server), { urls: disableUdpIceServers ? filterOutUdpUrls(server.urls) : server.urls })));\n};\n//# sourceMappingURL=helpers.js.map","import { getLogger, uuid } from '@signalwire/core';\nimport { getUserMedia, getMediaConstraints, filterIceServers, } from './utils/helpers';\nimport { sdpStereoHack, sdpBitrateHack, sdpMediaOrderHack, sdpHasValidCandidates, } from './utils/sdpHelpers';\nimport { sdpToJsonHack, RTCPeerConnection, streamIsValid, stopTrack, } from './utils';\nimport { watchRTCPeerMediaPackets } from './utils/watchRTCPeerMediaPackets';\nconst RESUME_TIMEOUT = 12000;\nexport default class RTCPeer {\n get logger() {\n return getLogger();\n }\n constructor(call, type) {\n this.call = call;\n this.type = type;\n this.uuid = uuid();\n this._negotiating = false;\n this._processingRemoteSDP = false;\n this._restartingIce = false;\n this.logger.debug('New Peer with type:', this.type, 'Options:', this.options);\n this._onIce = this._onIce.bind(this);\n this._onEndedTrackHandler = this._onEndedTrackHandler.bind(this);\n if (this.options.prevCallId) {\n this.uuid = this.options.prevCallId;\n }\n this.options.prevCallId = undefined;\n if (this.options.localStream && streamIsValid(this.options.localStream)) {\n this._localStream = this.options.localStream;\n }\n this.rtcConfigPolyfill = this.config;\n }\n get options() {\n return this.call.options;\n }\n get watchMediaPacketsTimeout() {\n var _a;\n return (_a = this.options.watchMediaPacketsTimeout) !== null && _a !== void 0 ? _a : 2000;\n }\n get localStream() {\n return this._localStream;\n }\n set localStream(stream) {\n this._localStream = stream;\n }\n get remoteStream() {\n return this._remoteStream;\n }\n get isOffer() {\n return this.type === 'offer';\n }\n get isAnswer() {\n return this.type === 'answer';\n }\n get isSimulcast() {\n return this.options.simulcast === true;\n }\n get isSfu() {\n return this.options.sfu === true;\n }\n get localVideoTrack() {\n const videoSender = this._getSenderByKind('video');\n return (videoSender === null || videoSender === void 0 ? void 0 : videoSender.track) || null;\n }\n get localAudioTrack() {\n const audioSender = this._getSenderByKind('audio');\n return (audioSender === null || audioSender === void 0 ? void 0 : audioSender.track) || null;\n }\n get remoteVideoTrack() {\n const videoReceiver = this._getReceiverByKind('video');\n return (videoReceiver === null || videoReceiver === void 0 ? void 0 : videoReceiver.track) || null;\n }\n get remoteAudioTrack() {\n const audioReceiver = this._getReceiverByKind('audio');\n return (audioReceiver === null || audioReceiver === void 0 ? void 0 : audioReceiver.track) || null;\n }\n get hasAudioSender() {\n return this._getSenderByKind('audio') ? true : false;\n }\n get hasVideoSender() {\n return this._getSenderByKind('video') ? true : false;\n }\n get hasAudioReceiver() {\n return this._getReceiverByKind('audio') ? true : false;\n }\n get hasVideoReceiver() {\n return this._getReceiverByKind('video') ? true : false;\n }\n get config() {\n const { rtcPeerConfig = {} } = this.options;\n const config = Object.assign({ bundlePolicy: 'max-compat', iceServers: filterIceServers(this.call.iceServers, {\n disableUdpIceServers: this.options.disableUdpIceServers,\n }), \n // @ts-ignore\n sdpSemantics: 'unified-plan' }, rtcPeerConfig);\n this.logger.debug('RTC config', config);\n return config;\n }\n get localSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.localDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get remoteSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.remoteDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get hasIceServers() {\n if (this.instance) {\n const { iceServers = [] } = this.getConfiguration();\n return Boolean(iceServers === null || iceServers === void 0 ? void 0 : iceServers.length);\n }\n return false;\n }\n stopTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to stop.`);\n }\n if (sender.track) {\n stopTrack(sender.track);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(sender.track);\n }\n }\n catch (error) {\n this.logger.error('RTCPeer stopTrackSender error', kind, error);\n }\n }\n async restoreTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to restore.`);\n }\n if (sender.track && sender.track.readyState !== 'ended') {\n return this.logger.info(`There is already an active ${kind} track.`);\n }\n const constraints = await getMediaConstraints(this.options);\n // @ts-ignore\n const stream = await getUserMedia({ [kind]: constraints[kind] });\n if (stream && streamIsValid(stream)) {\n const newTrack = stream.getTracks().find((t) => t.kind === kind);\n if (newTrack) {\n await sender.replaceTrack(newTrack);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.addTrack(newTrack);\n }\n }\n }\n catch (error) {\n this.logger.error('RTCPeer restoreTrackSender error', kind, error);\n }\n }\n getDeviceId(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n const { deviceId = null } = sender.track.getSettings();\n return deviceId;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceId error', kind, error);\n return null;\n }\n }\n getTrackSettings(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.getSettings();\n }\n catch (error) {\n this.logger.error('RTCPeer getTrackSettings error', kind, error);\n return null;\n }\n }\n getDeviceLabel(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.label;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceLabel error', kind, error);\n return null;\n }\n }\n restartIceWithRelayOnly() {\n try {\n if (this.isAnswer) {\n return this.logger.warn('Skip restartIceWithRelayOnly since we need to generate answer');\n }\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n return this.logger.warn('RTCPeer already with iceTransportPolicy relay only');\n }\n const newConfig = Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' });\n this.setConfiguration(newConfig);\n this.restartIce();\n }\n catch (error) {\n this.logger.error('restartIceWithRelayOnly', error);\n }\n }\n restartIce() {\n if (this._negotiating || this._restartingIce) {\n return this.logger.warn('Skip restartIce');\n }\n this._restartingIce = true;\n this.logger.debug('Restart ICE');\n // Type must be Offer to send reinvite.\n this.type = 'offer';\n // @ts-ignore\n this.instance.restartIce();\n }\n triggerResume() {\n this.logger.info('Probably half-open so force close from client');\n if (this._resumeTimer) {\n this.logger.info('[skipped] Already in \"resume\" state');\n return;\n }\n this.call.emit('media.disconnected');\n this.call.emit('media.reconnecting');\n this.clearTimers();\n this._resumeTimer = setTimeout(() => {\n this.logger.warn('Disconnecting due to RECONNECTION_ATTEMPT_TIMEOUT');\n this.call.emit('media.disconnected');\n this.call.leaveReason = 'RECONNECTION_ATTEMPT_TIMEOUT';\n this.call.setState('hangup');\n }, RESUME_TIMEOUT); // TODO: read from call verto.invite response\n this.call._closeWSConnection();\n }\n resetNeedResume() {\n this.clearResumeTimer();\n if (this.options.watchMediaPackets) {\n this.startWatchMediaPackets();\n }\n }\n stopWatchMediaPackets() {\n if (this._mediaWatcher) {\n this._mediaWatcher.stop();\n }\n }\n startWatchMediaPackets() {\n var _a;\n this.stopWatchMediaPackets();\n this._mediaWatcher = watchRTCPeerMediaPackets(this);\n (_a = this._mediaWatcher) === null || _a === void 0 ? void 0 : _a.start();\n }\n async applyMediaConstraints(kind, constraints) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return this.logger.info('No sender to apply constraints', kind, constraints);\n }\n if (sender.track.readyState === 'live') {\n const newConstraints = Object.assign(Object.assign({}, sender.track.getConstraints()), constraints);\n const deviceId = this.getDeviceId(kind);\n if (deviceId && !this.options.screenShare) {\n newConstraints.deviceId = { exact: deviceId };\n }\n this.logger.info(`Apply ${kind} constraints`, this.call.id, newConstraints);\n await sender.track.applyConstraints(newConstraints);\n }\n }\n catch (error) {\n this.logger.error('Error applying constraints', kind, constraints);\n }\n }\n _getSenderByKind(kind) {\n var _a;\n if (!((_a = this.instance) === null || _a === void 0 ? void 0 : _a.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 var _a;\n if (!((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getReceivers)) {\n this.logger.warn('RTCPeerConnection.getReceivers() not available.');\n return null;\n }\n return this.instance\n .getReceivers()\n .find(({ track }) => track && track.kind === kind);\n }\n async startNegotiation(force = false) {\n var _a, _b;\n if (this._negotiating) {\n return this.logger.warn('Skip twice onnegotiationneeded!');\n }\n this._negotiating = true;\n try {\n /**\n * additionalDevice and screenShare are `sendonly`\n */\n if (this.options.additionalDevice || this.options.screenShare) {\n (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === null || _b === void 0 ? void 0 : _b.call(_a).forEach((tr) => {\n tr.direction = 'sendonly';\n });\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n this.instance.addEventListener('icecandidate', this._onIce);\n if (this.isOffer) {\n this.logger.debug('Trying to generate offer');\n const offerOptions = {\n /**\n * While this property is deprected, on Browsers where this\n * is still supported this avoids conflicting with the VAD\n * server-side\n */\n // @ts-ignore\n voiceActivityDetection: false,\n };\n if (!this._supportsAddTransceiver()) {\n offerOptions.offerToReceiveAudio = this.options.negotiateAudio;\n offerOptions.offerToReceiveVideo = this.options.negotiateVideo;\n }\n const offer = await this.instance.createOffer(offerOptions);\n await this._setLocalDescription(offer);\n }\n if (this.isAnswer) {\n this.logger.debug('Trying to generate answer');\n await this._setRemoteDescription({\n sdp: this.options.remoteSdp,\n type: 'offer',\n });\n const answer = await this.instance.createAnswer({\n // Same as above.\n // @ts-ignore\n voiceActivityDetection: false,\n });\n await this._setLocalDescription(answer);\n }\n /**\n * ReactNative Workaround\n */\n if (force) {\n this._sdpReady();\n }\n this.logger.info('iceGatheringState', this.instance.iceGatheringState);\n if (this.instance.iceGatheringState === 'gathering') {\n this._iceTimeout = setTimeout(() => {\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n }\n catch (error) {\n this.logger.error(`Error creating ${this.type}:`, error);\n }\n }\n onRemoteBye({ code, message }) {\n var _a;\n // It could be a negotiation/signaling error so reject the \"startMethod\"\n (_a = this._rejectStartMethod) === null || _a === void 0 ? void 0 : _a.call(this, {\n code,\n message,\n });\n this.stop();\n }\n async onRemoteSdp(sdp) {\n if (this._processingRemoteSDP ||\n (this.remoteSdp && this.remoteSdp === sdp)) {\n this.logger.warn('Ignore same remote SDP', sdp);\n return;\n }\n try {\n this._processingRemoteSDP = true;\n const type = this.isOffer ? 'answer' : 'offer';\n await this._setRemoteDescription({ sdp, type });\n this._processingRemoteSDP = false;\n /**\n * Resolve the start() method only for Offer because for Answer\n * we need to reply to the server and wait for the signaling.\n */\n if (this.isOffer) {\n this._resolveStartMethod();\n }\n this.resetNeedResume();\n }\n catch (error) {\n this.logger.error(`Error handling remote SDP on call ${this.call.id}:`, error);\n this.call.hangup();\n this._rejectStartMethod(error);\n }\n }\n _setupRTCPeerConnection() {\n if (!this.instance) {\n this.instance = RTCPeerConnection(this.config);\n this._attachListeners();\n }\n }\n async start() {\n return new Promise(async (resolve, reject) => {\n this._resolveStartMethod = resolve;\n this._rejectStartMethod = reject;\n try {\n this._localStream = await this._retrieveLocalStream();\n }\n catch (error) {\n this._rejectStartMethod(error);\n return this.call.setState('hangup');\n }\n /**\n * We need to defer the creation of RTCPeerConnection\n * until we gain gUM access otherwise it will have\n * private IP addresses in ICE host candidates\n * replaced by an mDNS hostname\n * @see https://groups.google.com/g/discuss-webrtc/c/6stQXi72BEU?pli=1\n */\n this._setupRTCPeerConnection();\n let hasLocalTracks = false;\n if (this._localStream && streamIsValid(this._localStream)) {\n const audioTracks = this._localStream.getAudioTracks();\n this.logger.debug('Local audio tracks: ', audioTracks);\n const videoTracks = this._localStream.getVideoTracks();\n this.logger.debug('Local video tracks: ', videoTracks);\n hasLocalTracks = Boolean(audioTracks.length || videoTracks.length);\n // TODO: use transceivers way only for offer - when answer gotta match mid from the ones from SRD\n if (this.isOffer &&\n typeof this.instance.addTransceiver === 'function') {\n const audioTransceiverParams = {\n direction: this.options.negotiateAudio ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n this.logger.debug('Applying audioTransceiverParams', audioTransceiverParams);\n audioTracks.forEach((track) => {\n this.instance.addTransceiver(track, audioTransceiverParams);\n });\n const videoTransceiverParams = {\n direction: this.options.negotiateVideo ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n if (this.isSimulcast) {\n const rids = ['0', '1', '2'];\n videoTransceiverParams.sendEncodings = rids.map((rid) => ({\n active: true,\n rid: rid,\n scaleResolutionDownBy: Number(rid) * 6 || 1.0,\n }));\n }\n this.logger.debug('Applying videoTransceiverParams', videoTransceiverParams);\n videoTracks.forEach((track) => {\n this.instance.addTransceiver(track, videoTransceiverParams);\n });\n if (this.isSfu) {\n const { msStreamsNumber = 5 } = this.options;\n this.logger.debug('Add ', msStreamsNumber, 'recvonly MS Streams');\n videoTransceiverParams.direction = 'recvonly';\n for (let i = 0; i < Number(msStreamsNumber); i++) {\n this.instance.addTransceiver('video', videoTransceiverParams);\n }\n }\n }\n else if (typeof this.instance.addTrack === 'function') {\n // Use addTrack\n // To avoid TS complains in forEach\n const stream = this._localStream;\n audioTracks.forEach((track) => this.instance.addTrack(track, stream));\n videoTracks.forEach((track) => this.instance.addTrack(track, stream));\n }\n else {\n // Fallback to legacy addStream ..\n // @ts-ignore\n this.instance.addStream(this._localStream);\n }\n }\n if (this.isOffer) {\n if (this.options.negotiateAudio) {\n this._checkMediaToNegotiate('audio');\n }\n if (this.options.negotiateVideo) {\n this._checkMediaToNegotiate('video');\n }\n /**\n * If it does not support unified-plan stuff (senders/receivers/transceivers)\n * invoke manually startNegotiation and use the RTCOfferOptions\n */\n if (!this._supportsAddTransceiver() && !hasLocalTracks) {\n this.startNegotiation();\n }\n }\n else {\n this.startNegotiation();\n }\n });\n }\n detachAndStop() {\n var _a;\n if (typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === 'function') {\n this.instance.getTransceivers().forEach((transceiver) => {\n // Do not use `stopTrack` util to not dispatch the `ended` event\n if (transceiver.sender.track) {\n transceiver.sender.track.stop();\n }\n if (transceiver.receiver.track) {\n transceiver.receiver.track.stop();\n }\n });\n }\n this.stop();\n }\n stop() {\n var _a, _b, _c;\n // Do not use `stopTrack` util to not dispatch the `ended` event\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());\n (_b = this._remoteStream) === null || _b === void 0 ? void 0 : _b.getTracks().forEach((track) => track.stop());\n (_c = this.instance) === null || _c === void 0 ? void 0 : _c.close();\n this.stopWatchMediaPackets();\n }\n _supportsAddTransceiver() {\n return typeof this.instance.addTransceiver === 'function';\n }\n _checkMediaToNegotiate(kind) {\n // addTransceiver of 'kind' if not present\n const sender = this._getSenderByKind(kind);\n if (!sender && this._supportsAddTransceiver()) {\n const transceiver = this.instance.addTransceiver(kind, {\n direction: 'recvonly',\n });\n this.logger.debug('Add transceiver', kind, transceiver);\n }\n }\n async _sdpReady() {\n clearTimeout(this._iceTimeout);\n if (!this.instance.localDescription) {\n this.logger.error('Missing localDescription', this.instance);\n return;\n }\n const { sdp } = this.instance.localDescription;\n if (sdp.indexOf('candidate') === -1) {\n this.logger.debug('No candidate - retry \\n');\n this.startNegotiation(true);\n return;\n }\n if (!this._sdpIsValid()) {\n this.logger.info('SDP ready but not valid');\n this._onIceTimeout();\n return;\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n try {\n await this.call.onLocalSDPReady(this);\n if (this.isAnswer) {\n this._resolveStartMethod();\n }\n }\n catch (error) {\n this._rejectStartMethod(error);\n }\n }\n _sdpIsValid() {\n if (this.localSdp && this.hasIceServers) {\n return sdpHasValidCandidates(this.localSdp);\n }\n return Boolean(this.localSdp);\n }\n _forceNegotiation() {\n this.logger.info('Force negotiation again');\n this._negotiating = false;\n this.startNegotiation();\n }\n _onIceTimeout() {\n if (this._sdpIsValid()) {\n this._sdpReady();\n return;\n }\n this.logger.info('ICE gathering timeout');\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n this.logger.info('RTCPeer already with \"iceTransportPolicy: relay\"');\n this._rejectStartMethod({\n code: 'ICE_GATHERING_FAILED',\n message: 'Ice gathering timeout',\n });\n this.call.setState('destroy');\n return;\n }\n this.setConfiguration(Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' }));\n this._forceNegotiation();\n }\n _onIce(event) {\n /**\n * Clear _iceTimeout on each single candidate\n */\n if (this._iceTimeout) {\n clearTimeout(this._iceTimeout);\n }\n /**\n * Following spec: no candidate means the gathering is completed.\n */\n if (!event.candidate) {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n return;\n }\n this.logger.debug('RTCPeer Candidate:', event.candidate);\n if (event.candidate.type === 'host') {\n /**\n * With `host` candidate set timeout to\n * maxIceGatheringTimeout and then invoke\n * _onIceTimeout to check if the SDP is valid\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n else {\n /**\n * With `srflx`, `prflx` or `relay` candidates\n * set timeout to iceGatheringTimeout and then invoke\n * _sdpReady since at least one candidate is valid.\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n }, this.options.iceGatheringTimeout);\n }\n }\n _setLocalDescription(localDescription) {\n const { useStereo, googleMaxBitrate, googleMinBitrate, googleStartBitrate, } = this.options;\n if (localDescription.sdp && useStereo) {\n localDescription.sdp = sdpStereoHack(localDescription.sdp);\n }\n if (localDescription.sdp &&\n googleMaxBitrate &&\n googleMinBitrate &&\n googleStartBitrate) {\n localDescription.sdp = sdpBitrateHack(localDescription.sdp, googleMaxBitrate, googleMinBitrate, googleStartBitrate);\n }\n // this.logger.debug(\n // 'LOCAL SDP \\n',\n // `Type: ${localDescription.type}`,\n // '\\n\\n',\n // localDescription.sdp\n // )\n return this.instance.setLocalDescription(localDescription);\n }\n _setRemoteDescription(remoteDescription) {\n if (remoteDescription.sdp && this.options.useStereo) {\n remoteDescription.sdp = sdpStereoHack(remoteDescription.sdp);\n }\n if (remoteDescription.sdp && this.instance.localDescription) {\n remoteDescription.sdp = sdpMediaOrderHack(remoteDescription.sdp, this.instance.localDescription.sdp);\n }\n const sessionDescr = sdpToJsonHack(remoteDescription);\n this.logger.debug('REMOTE SDP \\n', `Type: ${remoteDescription.type}`, '\\n\\n', remoteDescription.sdp);\n return this.instance.setRemoteDescription(sessionDescr);\n }\n async _retrieveLocalStream() {\n if (streamIsValid(this.options.localStream)) {\n return this.options.localStream;\n }\n const constraints = await getMediaConstraints(this.options);\n return getUserMedia(constraints);\n }\n _attachListeners() {\n this.instance.addEventListener('signalingstatechange', () => {\n this.logger.debug('signalingState:', this.instance.signalingState);\n switch (this.instance.signalingState) {\n case 'stable':\n // Workaround to skip nested negotiations\n // Chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=740501\n this._negotiating = false;\n this._restartingIce = false;\n this.resetNeedResume();\n if (this.instance.connectionState === 'connected') {\n // An ice restart won't change the connectionState so we emit the same event in here\n // since the signalingState is \"stable\" again.\n this.emitMediaConnected();\n }\n break;\n case 'have-local-offer': {\n if (this.instance.iceGatheringState === 'complete') {\n this._sdpReady();\n }\n break;\n }\n // case 'have-remote-offer': {}\n case 'closed':\n // @ts-ignore\n delete this.instance;\n break;\n default:\n this._negotiating = true;\n }\n });\n this.instance.addEventListener('connectionstatechange', () => {\n this.logger.debug('connectionState:', this.instance.connectionState);\n switch (this.instance.connectionState) {\n // case 'new':\n // break\n case 'connecting':\n this._connectionStateTimer = setTimeout(() => {\n this.logger.warn('connectionState timed out');\n this.restartIceWithRelayOnly();\n }, this.options.maxConnectionStateTimeout);\n break;\n case 'connected':\n this.clearConnectionStateTimer();\n this.emitMediaConnected();\n break;\n // case 'closed':\n // break\n case 'disconnected':\n this.logger.debug('[test] Prevent reattach!');\n break;\n case 'failed': {\n this.triggerResume();\n break;\n }\n }\n });\n this.instance.addEventListener('negotiationneeded', () => {\n this.logger.debug('Negotiation needed event');\n this.startNegotiation();\n });\n this.instance.addEventListener('iceconnectionstatechange', () => {\n this.logger.debug('iceConnectionState:', this.instance.iceConnectionState);\n });\n this.instance.addEventListener('icegatheringstatechange', () => {\n this.logger.debug('iceGatheringState:', this.instance.iceGatheringState);\n });\n // this.instance.addEventListener('icecandidateerror', (event) => {\n // this.logger.warn('IceCandidate Error:', event)\n // })\n this.instance.addEventListener('track', (event) => {\n // @ts-expect-error\n this.call.emit('track', event);\n if (this.isSfu) {\n // const notification = { type: 'trackAdd', event }\n // this.call._dispatchNotification(notification)\n }\n this._remoteStream = event.streams[0];\n });\n // @ts-ignore\n this.instance.addEventListener('addstream', (event) => {\n if (event.stream) {\n this._remoteStream = event.stream;\n }\n });\n this._attachAudioTrackListener();\n this._attachVideoTrackListener();\n }\n clearTimers() {\n this.clearResumeTimer();\n this.clearWatchMediaPacketsTimer();\n this.clearConnectionStateTimer();\n }\n clearConnectionStateTimer() {\n clearTimeout(this._connectionStateTimer);\n }\n clearWatchMediaPacketsTimer() {\n clearTimeout(this._watchMediaPacketsTimer);\n }\n clearResumeTimer() {\n clearTimeout(this._resumeTimer);\n this._resumeTimer = undefined;\n }\n emitMediaConnected() {\n this.call.emit('media.connected');\n }\n _onEndedTrackHandler(event) {\n const mediaTrack = event.target;\n const evt = mediaTrack.kind === 'audio' ? 'microphone' : 'camera';\n this.call.emit(`${evt}.disconnected`, {\n deviceId: mediaTrack.id,\n label: mediaTrack.label,\n });\n }\n _attachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _attachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local `rtcConfigPolyfill` object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration#parameters\n */\n setConfiguration(config) {\n var _a;\n this.rtcConfigPolyfill = config;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.setConfiguration) === 'function') {\n this.instance.setConfiguration(config);\n }\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local config object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/getConfiguration\n */\n getConfiguration() {\n var _a;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getConfiguration) === 'function') {\n return this.instance.getConfiguration();\n }\n return this.rtcConfigPolyfill || this.config;\n }\n}\n//# sourceMappingURL=RTCPeer.js.map","import { getLogger } from '@signalwire/core';\nexport const watchRTCPeerMediaPackets = (rtcPeer) => {\n if (!rtcPeer.hasAudioReceiver && !rtcPeer.hasVideoReceiver) {\n getLogger().warn(`Missing receivers to inspect media for RTCPeer \"${rtcPeer.uuid}\"`);\n return;\n }\n getLogger().debug(`Start watching media for RTCPeer \"${rtcPeer.uuid}\"`);\n let previousAudioValue = 0;\n let previousVideoValue = 0;\n let run = true;\n let timer;\n const clearTimer = () => {\n clearTimeout(timer);\n };\n const meter = async () => {\n var _a, _b;\n let audioPacketsReceived = 0;\n let videoPacketsReceived = 0;\n try {\n const stats = await rtcPeer.instance.getStats(null);\n const audioTrackId = (_a = rtcPeer.remoteAudioTrack) === null || _a === void 0 ? void 0 : _a.id;\n const videoTrackId = (_b = rtcPeer.remoteVideoTrack) === null || _b === void 0 ? void 0 : _b.id;\n stats.forEach((report) => {\n if (report.type === 'inbound-rtp' &&\n report.kind === 'audio' &&\n report.trackIdentifier === audioTrackId) {\n getLogger().trace(`audio inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n audioPacketsReceived = report.packetsReceived;\n }\n if (report.type === 'inbound-rtp' &&\n report.kind === 'video' &&\n report.trackIdentifier === videoTrackId) {\n getLogger().trace(`video inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n videoPacketsReceived = report.packetsReceived;\n }\n });\n }\n catch (error) {\n getLogger().warn('getStats error', error);\n }\n finally {\n const noAudioChanged = audioPacketsReceived && audioPacketsReceived <= previousAudioValue;\n const noVideoChanged = videoPacketsReceived && videoPacketsReceived <= previousVideoValue;\n if (noAudioChanged && noVideoChanged) {\n getLogger().warn(`audioPacketsReceived: ${audioPacketsReceived} - previousAudioValue: ${previousAudioValue}`);\n getLogger().warn(`videoPacketsReceived: ${videoPacketsReceived} - previousVideoValue: ${previousVideoValue}`);\n rtcPeer.triggerResume();\n }\n else {\n previousAudioValue = audioPacketsReceived !== null && audioPacketsReceived !== void 0 ? audioPacketsReceived : previousAudioValue;\n previousVideoValue = videoPacketsReceived !== null && videoPacketsReceived !== void 0 ? videoPacketsReceived : previousVideoValue;\n clearTimer();\n if (run && rtcPeer.instance.connectionState !== 'closed') {\n timer = setTimeout(() => meter(), rtcPeer.watchMediaPacketsTimeout);\n }\n }\n }\n };\n return {\n start: () => {\n clearTimer();\n meter();\n },\n stop: () => {\n run = false;\n clearTimer();\n },\n };\n};\n//# sourceMappingURL=watchRTCPeerMediaPackets.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { __rest } from \"tslib\";\nimport { getLogger, sagaEffects, VertoResult, VertoPong, isWebrtcEventType, sagaHelpers, componentActions, } from '@signalwire/core';\nconst isWebrtcAction = (action) => {\n return isWebrtcEventType(action.type);\n};\nexport const vertoEventWorker = function* (options) {\n getLogger().debug('vertoEventWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const worker = function* (action) {\n var _a, _b;\n const { id: jsonrpcId, method, params = {} } = action.payload;\n const { callID, nodeId } = params;\n const peer = instance.getRTCPeerById(callID);\n if (!peer) {\n getLogger().warn(`RTCPeer '${callID}' not found for method: '${method}'`, params);\n return;\n }\n const activeRTCPeer = instance.peer;\n // getLogger().warn('vertoEventWorker', method, params)\n switch (method) {\n case 'verto.media':\n case 'verto.answer': {\n /**\n * verto.media and verto.answer share the same logic\n *\n * Always invoke peer.onRemoteSdp(params.sdp) on the proper RTCPeer\n * If the `params.callID` is the current ACTIVE peer, set the BaseConnection state to 'early' | 'active'\n * If the `params.callID` is NOT the current peer just setup the media (ie: promote/demote)\n */\n if (peer.uuid === (activeRTCPeer === null || activeRTCPeer === void 0 ? void 0 : activeRTCPeer.uuid)) {\n const state = method === 'verto.media' ? 'early' : 'active';\n instance.setState(state);\n }\n if (params === null || params === void 0 ? void 0 : params.sdp) {\n peer.onRemoteSdp(params.sdp);\n }\n yield sagaEffects.put(componentActions.upsert({\n id: (_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID,\n nodeId: (_b = action.payload.params) === null || _b === void 0 ? void 0 : _b.nodeId,\n }));\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.bye': {\n /**\n * If the `params.callID` is the current ACTIVE peer, stop everything and destroy the BaseConnection\n * If the `params.callID` is NOT the current peer, but is there from promote/demote process stop/destroy just the peer\n */\n yield sagaEffects.call([instance, instance.onVertoBye], {\n rtcPeerId: callID,\n byeCause: params === null || params === void 0 ? void 0 : params.cause,\n byeCauseCode: params === null || params === void 0 ? void 0 : params.causeCode,\n redirectDestination: params === null || params === void 0 ? void 0 : params.redirectDestination,\n });\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.ping': {\n // Remove nodeId from params\n const { nodeId } = params, pongParams = __rest(params, [\"nodeId\"]);\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoPong(pongParams),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.mediaParams': {\n if (!callID || !params.mediaParams) {\n getLogger().warn(`Invalid mediaParams event`, params);\n break;\n }\n const { audio, video } = params.mediaParams;\n if (peer && video) {\n peer.applyMediaConstraints('video', video);\n }\n if (peer && audio) {\n peer.applyMediaConstraints('audio', audio);\n }\n break;\n }\n case 'verto.display': {\n /** Call is active so set the RTCPeer */\n instance.setActiveRTCPeer(rtcPeerId);\n instance.emit('verto.display', action.payload.params);\n break;\n }\n default:\n return getLogger().warn(`Unknown Verto method: ${method}`, params);\n }\n };\n const catchableWorker = sagaHelpers.createCatchableSaga(worker, (error) => {\n getLogger().error('Verto Error', error);\n });\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n var _a;\n if (isWebrtcAction(action)) {\n return ((_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID) === rtcPeerId;\n }\n return false;\n });\n yield sagaEffects.fork(catchableWorker, action);\n }\n getLogger().trace('vertoEventWorker ended');\n};\n//# sourceMappingURL=vertoEventWorker.js.map","import { getLogger, sagaEffects, componentActions, Rooms, } from '@signalwire/core';\nexport const roomSubscribedWorker = function* (options) {\n getLogger().debug('roomSubscribedWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.room.subscribed' ||\n action.type === 'call.joined') {\n return action.payload.call_id === rtcPeerId;\n }\n return false;\n });\n // New emitter should not change the payload by reference\n const clonedPayload = JSON.parse(JSON.stringify(action.payload));\n /**\n * In here we joined a room_session so we can swap between RTCPeers\n */\n instance.setActiveRTCPeer(rtcPeerId);\n const roomSessionId = action.payload.room_session.id ||\n action.payload.room_session.room_session_id;\n /**\n * TODO: Replace the redux action/component with properties on RTCPeer instance?\n */\n yield sagaEffects.put(componentActions.upsert({\n id: action.payload.call_id,\n roomId: action.payload.room_session.room_id,\n roomSessionId: roomSessionId,\n memberId: action.payload.member_id,\n previewUrl: action.payload.room_session.preview_url,\n }));\n instance.emit('room.subscribed', action.payload);\n instance.emit('room.joined', transformPayload.call(instance, clonedPayload));\n getLogger().debug('roomSubscribedWorker ended', rtcPeerId);\n};\nfunction transformPayload(payload) {\n const keys = ['room_session', 'room'];\n keys.forEach((key) => {\n if (payload[key] && payload[key].recordings) {\n payload[key].recordings = (payload[key].recordings || []).map((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n },\n });\n }\n else {\n recordingInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n });\n }\n this.instanceMap.set(recording.id, recordingInstance);\n return recordingInstance;\n });\n }\n if (payload[key] && payload[key].playbacks) {\n payload[key].playbacks = (payload[key].playbacks || []).map((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n },\n });\n }\n else {\n playbackInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n });\n }\n this.instanceMap.set(playback.id, playbackInstance);\n return playbackInstance;\n });\n }\n if (payload[key] && payload[key].streams) {\n payload[key].streams = (payload[key].streams || []).map((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n },\n });\n }\n else {\n streamInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n });\n }\n this.instanceMap.set(stream.id, streamInstance);\n return streamInstance;\n });\n }\n });\n return payload;\n}\n//# sourceMappingURL=roomSubscribedWorker.js.map","import { getLogger, sagaEffects, sessionActions, selectors, } from '@signalwire/core';\nexport const promoteDemoteWorker = function* (options) {\n getLogger().debug('promoteDemoteWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for promoteDemoteWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.member.promoted' ||\n action.type === 'video.member.demoted') {\n return action.payload.member_id === instance.memberId;\n }\n return false;\n });\n getLogger().debug('promoteDemoteWorker:', action.type, action.payload);\n yield sagaEffects.put(sessionActions.updateAuthState(action.payload.authorization));\n const authState = yield sagaEffects.select(selectors.getAuthState);\n if (!authState) {\n throw new Error(`Invalid authState for '${action.type}'`);\n }\n // TODO: use the new getJoinMediaParams in here\n const { audio_allowed, video_allowed } = authState;\n switch (action.type) {\n case 'video.member.promoted':\n /**\n * Promote means enable the media allowed and keep the\n * same recv settings. (do not force recv media)\n */\n instance.updateMediaOptions({\n audio: audio_allowed === 'both',\n video: video_allowed === 'both',\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n case 'video.member.demoted':\n /**\n * Demote means force recvonly and receive only the media allowed.\n */\n instance.updateMediaOptions({\n audio: false,\n video: false,\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n }\n instance._triggerNewRTCPeer();\n getLogger().debug('promoteDemoteWorker ended', rtcPeerId);\n};\n//# sourceMappingURL=promoteDemoteWorker.js.map","import { getLogger, sagaEffects, actions, } from '@signalwire/core';\nexport const sessionAuthWorker = function* (options) {\n getLogger().debug('sessionAuthWorker started');\n const { instance } = options;\n const action = yield sagaEffects.take([\n actions.authSuccessAction.type,\n actions.authErrorAction.type,\n ]);\n switch (action.type) {\n case actions.authSuccessAction.type:\n yield sagaEffects.call([instance, instance.resume]);\n break;\n case actions.authErrorAction.type:\n yield sagaEffects.call([instance, instance.setState], 'hangup');\n break;\n }\n getLogger().debug('sessionAuthWorker ended');\n};\n//# sourceMappingURL=sessionAuthWorker.js.map","export const INVITE_VERSION = 1000;\nexport const AUDIO_CONSTRAINTS = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n};\nexport const AUDIO_CONSTRAINTS_SCREENSHARE = Object.assign(Object.assign({}, AUDIO_CONSTRAINTS), { noiseSuppression: false, autoGainControl: false, \n // @ts-expect-error\n googAutoGainControl: false });\nexport const VIDEO_CONSTRAINTS = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n};\nexport const DEFAULT_CALL_OPTIONS = {\n destinationNumber: 'room',\n remoteCallerName: 'Outbound Call',\n remoteCallerNumber: '',\n callerName: '',\n callerNumber: '',\n audio: AUDIO_CONSTRAINTS,\n video: VIDEO_CONSTRAINTS,\n useStereo: false,\n attach: false,\n screenShare: false,\n additionalDevice: false,\n userVariables: {},\n requestTimeout: 10 * 1000,\n autoApplyMediaParams: true,\n iceGatheringTimeout: 2 * 1000,\n maxIceGatheringTimeout: 5 * 1000,\n maxConnectionStateTimeout: 3 * 1000,\n watchMediaPackets: true,\n watchMediaPacketsTimeout: 2 * 1000,\n};\n//# sourceMappingURL=constants.js.map","import { VertoBye, VertoInfo, VertoInvite, BaseComponent, selectors, VertoModify, componentSelectors, actions, isSATAuth, \n// VertoAttach,\nVertoAnswer, } from '@signalwire/core';\nimport RTCPeer from './RTCPeer';\nimport { stopTrack, getUserMedia, streamIsValid } from './utils';\nimport { sdpRemoveLocalCandidates } from './utils/sdpHelpers';\nimport * as workers from './workers';\nimport { AUDIO_CONSTRAINTS, AUDIO_CONSTRAINTS_SCREENSHARE, DEFAULT_CALL_OPTIONS, INVITE_VERSION, VIDEO_CONSTRAINTS, } from './utils/constants';\nexport class BaseConnection extends BaseComponent {\n constructor(options) {\n super(options);\n /** @internal */\n this.leaveReason = undefined;\n /** @internal */\n this.gotEarly = false;\n /** @internal */\n this.doReinvite = false;\n this.state = 'new';\n this.prevState = 'new';\n this.rtcPeerMap = new Map();\n this.resuming = false;\n /** @internal */\n this.onVertoBye = (params) => {\n this.logger.debug('onVertoBye', params);\n const { rtcPeerId, byeCause = 'NORMAL_CLEARING', byeCauseCode = '16', redirectDestination, } = params;\n this.cause = String(byeCause);\n this.causeCode = String(byeCauseCode);\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer) {\n return this.logger.warn('Invalid RTCPeer to hangup', params);\n }\n if (redirectDestination && rtcPeer.localSdp) {\n this.logger.debug('Redirect Destination to:', redirectDestination, 'for RTCPeer:', rtcPeer.uuid);\n // Force nodeId to redirectDestination\n this.executeInvite(rtcPeer.localSdp, rtcPeer.uuid, redirectDestination);\n return;\n }\n // Notify RTCPeer for the bad signaling error\n rtcPeer.onRemoteBye({ code: this.causeCode, message: this.cause });\n // Set state to hangup only if the rtcPeer is the current one\n if (this.activeRTCPeerId === (rtcPeer === null || rtcPeer === void 0 ? void 0 : rtcPeer.uuid)) {\n this.logger.debug('onVertoBye go hangup');\n this.setState('hangup');\n }\n };\n this.options = Object.assign(Object.assign({}, DEFAULT_CALL_OPTIONS), options);\n this._checkDefaultMediaConstraints();\n this.setState('new');\n this.logger.trace('New Call with Options:', this.options);\n this._initPeer();\n }\n get id() {\n return this.__uuid;\n }\n get active() {\n return this.state === 'active';\n }\n get trying() {\n return this.state === 'trying';\n }\n get memberId() {\n // @ts-expect-error\n return this.component.memberId;\n }\n get previewUrl() {\n // @ts-expect-error\n return this.component.previewUrl;\n }\n get roomId() {\n // @ts-expect-error\n return this.component.roomId;\n }\n get roomSessionId() {\n // @ts-expect-error\n return this.component.roomSessionId;\n }\n get nodeId() {\n // @ts-expect-error\n return this.component.nodeId || this.options.nodeId;\n }\n get callId() {\n var _a;\n return ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.uuid) || '';\n }\n get localStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.localStream;\n }\n set localStream(stream) {\n if (this.peer) {\n this.peer.localStream = stream;\n }\n }\n get remoteStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.remoteStream;\n }\n get iceServers() {\n var _a, _b;\n return (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.iceServers) !== null && _b !== void 0 ? _b : this.select(selectors.getIceServers);\n }\n get component() {\n return (this.select((state) => componentSelectors.getComponent(state, this.callId)) || {});\n }\n 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 get withAudio() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasAudioReceiver);\n }\n get withVideo() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasVideoReceiver);\n }\n get localAudioTrack() {\n return this.peer ? this.peer.localAudioTrack : null;\n }\n get localVideoTrack() {\n return this.peer ? this.peer.localVideoTrack : null;\n }\n get peer() {\n return this.getRTCPeerById(this.activeRTCPeerId);\n }\n set peer(rtcPeer) {\n if (!rtcPeer) {\n this.logger.warn('Invalid RTCPeer', rtcPeer);\n return;\n }\n this.logger.debug('Set RTCPeer', rtcPeer.uuid, rtcPeer);\n this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n if (this.peer && this.peer.instance && this.callId !== rtcPeer.uuid) {\n const oldPeerId = this.peer.uuid;\n this.logger.debug('>>> Stop old RTCPeer', oldPeerId);\n // Hangup the previous RTCPeer\n this.hangup(oldPeerId).catch(console.error);\n this.peer.detachAndStop();\n // Remove RTCPeer from local cache to stop answering to ping/pong\n // this.rtcPeerMap.delete(oldPeerId)\n }\n this.logger.debug('>>> Replace RTCPeer with', rtcPeer.uuid);\n this.activeRTCPeerId = rtcPeer.uuid;\n }\n // Implementation for the overloaded emit\n emit(event, ...args) {\n return super.emit(event, ...args);\n }\n /** @internal */\n dialogParams(rtcPeerId) {\n const { destinationNumber, attach, callerName, callerNumber, remoteCallerName, remoteCallerNumber, userVariables, screenShare, additionalDevice, pingSupported = true, } = this.options;\n return {\n dialogParams: {\n id: rtcPeerId,\n destinationNumber,\n attach,\n reattaching: attach,\n callerName,\n callerNumber,\n remoteCallerName,\n remoteCallerNumber,\n userVariables,\n screenShare,\n additionalDevice,\n pingSupported,\n version: INVITE_VERSION,\n },\n };\n }\n getRTCPeerById(rtcPeerId) {\n return this.rtcPeerMap.get(rtcPeerId);\n }\n appendRTCPeer(rtcPeer) {\n return this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n }\n setActiveRTCPeer(rtcPeerId) {\n this.peer = this.getRTCPeerById(rtcPeerId);\n }\n setLocalStream(stream) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.peer || !this.localStream) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!streamIsValid(stream)) {\n return reject(new Error('Invalid stream provided.'));\n }\n const prevAudioTracks = this.localStream.getAudioTracks();\n const newAudioTracks = stream.getAudioTracks();\n if (newAudioTracks.length <= 0) {\n this.logger.info('No audio track found in the stream provided. Audio will be unaffected.');\n }\n else {\n prevAudioTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newAudioTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n const prevVideoTracks = this.localStream.getVideoTracks();\n const newVideoTracks = stream.getVideoTracks();\n if (newVideoTracks.length <= 0) {\n this.logger.info('No video track found in the stream provided. Video will be unaffected.');\n }\n else {\n prevVideoTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newVideoTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n await this.updateStream(this.localStream);\n this.logger.debug('setLocalStream done');\n resolve(this.localStream);\n }\n catch (error) {\n this.logger.error('setLocalStream', error);\n reject(error);\n }\n });\n }\n /**\n * @internal\n * Verto messages have to be wrapped into an execute\n * request and sent using the proper RPC WebRTCMethod.\n */\n vertoExecute(params) {\n return this.execute({\n method: this._getRPCMethod(),\n params,\n });\n }\n /** @internal */\n _getRPCMethod() {\n const authState = this.select(selectors.getAuthState);\n if (authState && isSATAuth(authState)) {\n return 'webrtc.verto';\n }\n return 'video.message';\n }\n /** @internal */\n async _triggerNewRTCPeer() {\n this.logger.debug('_triggerNewRTCPeer Start');\n try {\n this.logger.debug('Build a new RTCPeer');\n const rtcPeer = this._buildPeer('offer');\n this.logger.debug('Trigger start for the new RTCPeer!');\n await rtcPeer.start();\n }\n catch (error) {\n this.logger.error('Error building new RTCPeer to promote/demote', error);\n }\n }\n updateCamera(constraints) {\n return this.updateConstraints({\n video: Object.assign({ aspectRatio: 16 / 9 }, constraints),\n });\n }\n updateMicrophone(constraints) {\n return this.updateConstraints({\n audio: constraints,\n });\n }\n /** @internal */\n manageSendersWithConstraints(constraints) {\n if (constraints.audio === false) {\n this.logger.info('Switching off the microphone');\n this.stopOutboundAudio();\n }\n if (constraints.video === false) {\n this.logger.info('Switching off the camera');\n this.stopOutboundVideo();\n }\n return constraints.audio || constraints.video;\n }\n /**\n * @internal\n */\n updateConstraints(constraints, { attempt = 0 } = {}) {\n if (attempt > 1) {\n return Promise.reject(new Error('Failed to update constraints'));\n }\n return new Promise(async (resolve, reject) => {\n var _a, _b, _c;\n try {\n if (!this.peer) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!Object.keys(constraints).length) {\n return reject(new Error('Invalid audio/video constraints.'));\n }\n this.logger.debug('updateConstraints trying constraints', this.__uuid, constraints);\n const shouldContinueWithUpdate = this.manageSendersWithConstraints(constraints);\n if (!shouldContinueWithUpdate) {\n this.logger.debug('Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped');\n return resolve();\n }\n /**\n * On some devices/browsers you cannot open more than one MediaStream at\n * a time, per process. When this happens we'll try to do the following:\n * 1. Stop the current media tracks\n * 2. Try to get new media tracks with the new constraints\n * 3. If we get an error: restore the media tracks using the previous\n * constraints.\n * @see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1238038\n *\n * Instead of just replace the track, force-stop the current one to free\n * up the device\n */\n let oldConstraints = {};\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => {\n var _a;\n /**\n * We'll keep a reference of the original constraints so if something\n * fails we should be able to restore them.\n */\n // @ts-expect-error\n oldConstraints[track.kind] = track.getConstraints();\n // @ts-expect-error\n if (constraints[track.kind] !== undefined) {\n this.logger.debug('updateConstraints stop old tracks first?');\n this.logger.debug('Track readyState:', track.kind, track.readyState);\n stopTrack(track);\n track.stop();\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n let newStream;\n try {\n this.logger.info('updateConstraints with', constraints);\n newStream = await getUserMedia(constraints);\n }\n catch (error) {\n this.logger.error('Error updating device constraints:', error.name, error.message, error);\n this.logger.info('Restoring previous constraints', oldConstraints);\n await this.updateConstraints(oldConstraints, {\n attempt: attempt + 1,\n });\n return reject(error);\n }\n await this.updateStream(newStream);\n this.logger.debug('updateConstraints done');\n resolve();\n }\n catch (error) {\n this.logger.error('updateConstraints', error);\n reject(error);\n }\n finally {\n (_b = this.peer) === null || _b === void 0 ? void 0 : _b._attachAudioTrackListener();\n (_c = this.peer) === null || _c === void 0 ? void 0 : _c._attachVideoTrackListener();\n }\n });\n }\n async updateStream(stream) {\n if (!this.peer) {\n throw new Error('Invalid RTCPeerConnection.');\n }\n // Store the previous tracks for device.updated event\n const prevVideoTrack = this.localVideoTrack;\n const prevAudioTrack = this.localAudioTrack;\n // Detach listeners because updateStream will trigger the track ended event\n this.peer._detachAudioTrackListener();\n this.peer._detachVideoTrackListener();\n this.logger.debug('updateStream got stream', stream);\n if (!this.localStream) {\n this.localStream = new MediaStream();\n }\n const { instance } = this.peer;\n const tracks = stream.getTracks();\n this.logger.debug(`updateStream got ${tracks.length} tracks`);\n for (let i = 0; i < tracks.length; i++) {\n const newTrack = tracks[i];\n this.logger.debug('updateStream apply track: ', newTrack);\n const transceiver = instance\n .getTransceivers()\n .find(({ mid, sender, receiver }) => {\n if (sender.track && sender.track.kind === newTrack.kind) {\n this.logger.debug('Found transceiver by sender');\n return true;\n }\n if (receiver.track && receiver.track.kind === newTrack.kind) {\n this.logger.debug('Found transceiver by receiver');\n return true;\n }\n if (mid === null) {\n this.logger.debug('Found disassociated transceiver');\n return true;\n }\n return false;\n });\n if (transceiver && transceiver.sender) {\n this.logger.debug('updateStream got transceiver', transceiver.currentDirection, transceiver.mid);\n await transceiver.sender.replaceTrack(newTrack);\n this.logger.debug('updateStream replaceTrack');\n transceiver.direction = 'sendrecv';\n this.logger.debug('updateStream set to sendrecv');\n this.localStream.getTracks().forEach((track) => {\n var _a;\n if (track.kind === newTrack.kind && track.id !== newTrack.id) {\n this.logger.debug('updateStream stop old track and apply new one - ');\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n this.localStream.addTrack(newTrack);\n }\n else {\n this.logger.debug('updateStream no transceiver found. addTrack and start dancing!');\n this.peer.type = 'offer';\n this.doReinvite = true;\n this.localStream.addTrack(newTrack);\n instance.addTrack(newTrack, this.localStream);\n }\n this.logger.debug('updateStream simply update mic/cam');\n if (newTrack.kind === 'audio') {\n this.emit('microphone.updated', {\n previous: {\n deviceId: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.id,\n label: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.label,\n },\n current: {\n deviceId: newTrack === null || newTrack === void 0 ? void 0 : newTrack.id,\n label: newTrack === null || newTrack === void 0 ? void 0 : newTrack.label,\n },\n });\n this.options.micId = newTrack.getSettings().deviceId;\n }\n else if (newTrack.kind === 'video') {\n this.emit('camera.updated', {\n previous: {\n deviceId: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.id,\n label: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.label,\n },\n current: {\n deviceId: newTrack === null || newTrack === void 0 ? void 0 : newTrack.id,\n label: newTrack === null || newTrack === void 0 ? void 0 : newTrack.label,\n },\n });\n this.options.camId = newTrack.getSettings().deviceId;\n }\n }\n this.logger.debug('updateStream done');\n }\n runRTCPeerWorkers(rtcPeerId) {\n this.runWorker('vertoEventWorker', {\n worker: workers.vertoEventWorker,\n initialState: { rtcPeerId },\n });\n const main = !(this.options.additionalDevice || this.options.screenShare);\n if (main) {\n this.runWorker('roomSubscribedWorker', {\n worker: workers.roomSubscribedWorker,\n initialState: { rtcPeerId },\n });\n this.runWorker('promoteDemoteWorker', {\n worker: workers.promoteDemoteWorker,\n initialState: { rtcPeerId },\n });\n }\n }\n /** @internal */\n invite() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'outbound';\n this.peer = this._buildPeer('offer');\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Invite error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n answer() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'inbound';\n if (!this.peer) {\n this.peer = this._buildPeer('answer');\n }\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Answer error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n onLocalSDPReady(rtcPeer) {\n if (!rtcPeer.instance.localDescription) {\n this.logger.error('Missing localDescription', rtcPeer);\n throw new Error('Invalid RTCPeerConnection localDescription');\n }\n const { type, sdp } = rtcPeer.instance.localDescription;\n const mungedSDP = this._mungeSDP(sdp);\n this.logger.debug('LOCAL SDP \\n', `Type: ${type}`, '\\n\\n', mungedSDP);\n switch (type) {\n case 'offer':\n this._watchSessionAuth();\n // If we have a remoteDescription already, send reinvite\n if (!this.resuming && rtcPeer.instance.remoteDescription) {\n return this.executeUpdateMedia(mungedSDP, rtcPeer.uuid);\n }\n else {\n return this.executeInvite(mungedSDP, rtcPeer.uuid);\n }\n case 'answer':\n return this.executeAnswer(mungedSDP, rtcPeer.uuid);\n default:\n return this.logger.error(`Unknown SDP type: '${type}' on call ${this.id}`);\n }\n }\n /** @internal */\n _closeWSConnection() {\n this._watchSessionAuth();\n this.store.dispatch(actions.sessionForceCloseAction());\n }\n _watchSessionAuth() {\n if (this.sessionAuthTask) {\n this.sessionAuthTask.cancel();\n }\n this.sessionAuthTask = this.runWorker('sessionAuthWorker', {\n worker: workers.sessionAuthWorker,\n });\n }\n /** @internal */\n async resume() {\n var _a;\n this.logger.warn(`[resume] Call ${this.id}`);\n if ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.instance) {\n const { connectionState } = this.peer.instance;\n this.logger.debug(`[resume] connectionState for ${this.id} is '${connectionState}'`);\n if (connectionState !== 'closed') {\n this.resuming = true;\n this.peer.restartIce();\n }\n }\n }\n /**\n * Send the `verto.invite` only if the state is either `new` or `requesting`\n * - new: the first time we send out the offer.\n * - requesting: we received a redirectDestination so need to send it again\n * specifying nodeId.\n *\n * @internal\n */\n async executeInvite(sdp, rtcPeerId, nodeId) {\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer || (rtcPeer.instance.remoteDescription && !this.resuming)) {\n throw new Error(`RTCPeer '${rtcPeerId}' already has a remoteDescription. Invalid invite.`);\n }\n // Set state to `requesting` only when `new`, otherwise keep it as `requesting`.\n if (this.state === 'new') {\n this.setState('requesting');\n }\n try {\n const ssOpts = this.options.screenShare\n ? {\n layout: this.options.layout,\n positions: this.options.positions,\n }\n : {};\n const message = VertoInvite(Object.assign(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), ssOpts), { sdp }));\n let subscribe = [];\n if (this.options.screenShare) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.screenshare'];\n }\n else if (this.options.additionalDevice) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.additionaldevice'];\n }\n else {\n subscribe = this.getSubscriptions();\n }\n this.logger.debug('Subscribing to', subscribe);\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe,\n });\n this.logger.debug('Invite response', response);\n this.resuming = false;\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /**\n * Send the `verto.answer` only if the state is `new`\n * - new: the first time we send out the answer.\n * @internal\n */\n async executeAnswer(sdp, rtcPeerId, nodeId) {\n // Set state to `answering` only when `new`, otherwise keep it as `answering`.\n if (this.state === 'new') {\n this.setState('answering');\n }\n try {\n const message = VertoAnswer(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe: this.getSubscriptions(),\n });\n this.logger.debug('Answer response', response);\n this.resuming = false;\n /** Call is active so set the RTCPeer */\n this.setActiveRTCPeer(rtcPeerId);\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /** @internal */\n async executeUpdateMedia(sdp, rtcPeerId) {\n try {\n const message = VertoModify(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp, action: 'updateMedia' }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n if (!response.sdp) {\n this.logger.error('UpdateMedia invalid SDP answer', response);\n }\n this.logger.debug('UpdateMedia response', response);\n if (!this.peer) {\n return this.logger.error('Invalid RTCPeer to updateMedia');\n }\n await this.peer.onRemoteSdp(response.sdp);\n }\n catch (error) {\n this.logger.error('UpdateMedia error', error);\n // this.setState('hangup')\n throw error;\n }\n }\n async hangup(id) {\n const rtcPeerId = id !== null && id !== void 0 ? id : this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(this.dialogParams(rtcPeerId));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('Hangup error:', error);\n }\n finally {\n if (rtcPeerId !== this.callId) {\n return this.logger.warn('Prevent setState hangup', rtcPeerId, this.callId);\n }\n this.setState('hangup');\n }\n }\n async hangupAll() {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(Object.assign({ cause: 'REJECT_ALL', causeCode: '825' }, this.dialogParams(rtcPeerId)));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('HangupAll error:', error);\n }\n finally {\n this.setState('hangup');\n }\n }\n async sendDigits(dtmf) {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to send DTMF');\n }\n const message = VertoInfo(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { dtmf }));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n /** @internal */\n doReinviteWithRelayOnly() {\n if (this.peer && this.active) {\n this.peer.restartIceWithRelayOnly();\n }\n }\n /** @internal */\n stopOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('audio');\n }\n }\n /** @internal */\n restoreOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('audio');\n }\n }\n /** @internal */\n stopOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('video');\n }\n }\n /** @internal */\n restoreOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('video');\n }\n }\n /** @internal */\n setState(state) {\n this.prevState = this.state;\n this.state = state;\n this.logger.trace(`Call ${this.id} state change from ${this.prevState} to ${this.state}`);\n 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.logger.debug('updateMediaOptions', Object.assign({}, options));\n this.options = Object.assign(Object.assign({}, this.options), options);\n this._checkDefaultMediaConstraints();\n }\n /**\n * Allow to define logic to munge the SDP\n *\n * @internal\n * */\n _mungeSDP(sdp) {\n return sdpRemoveLocalCandidates(sdp);\n }\n /**\n * Always use VIDEO_CONSTRAINTS if video: true\n * Always use AUDIO_CONSTRAINTS (or the SS one) if audio: true\n *\n * @internal\n */\n _checkDefaultMediaConstraints() {\n if (this.options.video === true) {\n this.options.video = VIDEO_CONSTRAINTS;\n }\n if (this.options.audio === true) {\n this.options.audio = this.options.screenShare\n ? AUDIO_CONSTRAINTS_SCREENSHARE\n : AUDIO_CONSTRAINTS;\n }\n }\n _initPeer() {\n // Build only for answer to be able to reject\n if (this.options.remoteSdp) {\n this.peer = this._buildPeer('answer');\n }\n }\n _buildPeer(type) {\n const rtcPeer = new RTCPeer(this, type);\n this.appendRTCPeer(rtcPeer);\n this.runRTCPeerWorkers(rtcPeer.uuid);\n return rtcPeer;\n }\n /** @internal */\n _finalize() {\n this.rtcPeerMap.forEach((rtcPeer) => {\n rtcPeer.stop();\n });\n this.rtcPeerMap.clear();\n }\n}\n//# sourceMappingURL=BaseConnection.js.map","const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n","import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n","import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport { VideoRoomSessionConnection } from '../../video/VideoRoomSession'\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<VideoRoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = room.getAudioEl()\n let audioTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'audio': {\n audioTask = runSaga(audioElementSetupWorker, {\n track: event.track,\n element: audioEl,\n speakerId,\n room,\n })\n break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the audioEl with the new track.\n */\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n audioTask?.cancel()\n })\n } catch (error) {\n getLogger().error('audioElementSaga', error)\n }\n }\n}\n\nfunction* audioElementActionsWatcher({\n element,\n room,\n}: {\n element: HTMLAudioElement\n room: VideoRoomSessionConnection\n}): SagaIterator {\n // TODO: For now we're handling individual actions but in the future\n // we might want to have a single action per custom saga and use it\n // in a similar fashion to `executeAction`\n const setSpeakerActionType = actions.getCustomSagaActionType(\n room.__uuid,\n audioSetSpeakerAction\n )\n\n while (true) {\n const action = yield sagaEffects.take([setSpeakerActionType])\n\n try {\n switch (action.type) {\n case setSpeakerActionType:\n const response = yield sagaEffects.call(\n setMediaElementSinkId,\n element,\n action.payload\n )\n\n room.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n action.payload\n )\n\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: response,\n kind: 'resolve',\n })\n break\n }\n } catch (error) {\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: error,\n kind: 'reject',\n })\n getLogger().error(error)\n }\n }\n}\n\nfunction* audioElementSetupWorker({\n track,\n element,\n speakerId,\n room,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n speakerId?: string\n room: VideoRoomSessionConnection\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","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomsSubscribedEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomsWorker = function* (\n options: VideoManagerWorkerParams<\n MapToPubSubShape<VideoManagerRoomsSubscribedEvent>\n >\n): SagaIterator {\n getLogger().trace('videoManagerRoomsWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n const modPayload = {\n rooms: payload.rooms.map((row) => toExternalJSON(row)),\n }\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n // @ts-expect-error\n modPayload\n )\n\n getLogger().trace('videoManagerRoomsWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomWorker = function* (\n options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>\n): SagaIterator {\n getLogger().trace('videoManagerRoomWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n toExternalJSON(payload)\n )\n\n getLogger().trace('videoManagerRoomWorker ended')\n}\n","import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n SDKWorkerParams,\n} from '@signalwire/core'\nimport type { VideoManager } from '../VideoManager'\nimport { videoManagerRoomsWorker } from './videoManagerRoomsWorker'\nimport { videoManagerRoomWorker } from './videoManagerRoomWorker'\n\nexport type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {\n action: T\n}\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const {\n channels: { swEventChannel },\n } = options\n\n function* worker(action: MapToPubSubShape<VideoManagerEvent>) {\n const { type } = action\n\n switch (type) {\n case 'video-manager.rooms.subscribed':\n yield sagaEffects.fork(videoManagerRoomsWorker, {\n action,\n ...options,\n })\n break\n case 'video-manager.room.added':\n case 'video-manager.room.deleted':\n case 'video-manager.room.ended':\n case 'video-manager.room.started':\n case 'video-manager.room.updated':\n yield sagaEffects.fork(videoManagerRoomWorker, {\n action,\n ...options,\n })\n break\n default:\n getLogger().warn(`Unknown video-manager event: \"${type}\"`)\n break\n }\n }\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoManagerWorker ended')\n}\n","import {\n BaseComponentOptions,\n VideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n validateEventsToSubscribe,\n EventEmitter,\n BaseConsumer,\n ToExternalJSONResult,\n VideoManagerRoomEventParams,\n InternalVideoManagerRoomEntity,\n RoomsSubscribed,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: ToExternalJSONResult<VideoManagerRoomEventParams>) => void\n> &\n Record<\n RoomsSubscribed,\n (room: {\n rooms: ToExternalJSONResult<InternalVideoManagerRoomEntity>[]\n }) => void\n >\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n constructor(options: BaseComponentOptions) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video-manager.${event}`\n ) as EventEmitter.EventNames<VideoManagerEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const createVideoManagerObject = (params: BaseComponentOptions) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n","export const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n","import { getLogger } from '@signalwire/core'\nimport type { VideoAuthorization } from '@signalwire/core'\nimport type { BaseRoomSessionJoinParams } from './interfaces'\n\ntype GetJoinMediaParamsOptions = BaseRoomSessionJoinParams & {\n authState: VideoAuthorization\n}\n/**\n * getJoinMediaParams returns whether the Join method must send/recv\n * audio and video.\n * Based on values on the Auth block (media allowed and join_as type)\n * it matches the user's preferences and return an object that tells\n * if the negotiation has to include sendrecv/sendonly or recvonly\n * for audio and video.\n */\nexport const getJoinMediaParams = (options: GetJoinMediaParamsOptions) => {\n const {\n authState,\n audio = true,\n video = true,\n sendAudio,\n sendVideo,\n receiveAudio,\n receiveVideo,\n } = options\n getLogger().debug('getJoinMediaParams options', { ...options })\n const { audio_allowed, video_allowed, join_as } = authState\n // Fallback to 'member' in case of null/undefined\n const joinAs = join_as ?? 'member'\n const canSend = joinAs === 'member'\n\n const canSendAudio = canSend && audio_allowed === 'both'\n const canSendVideo = canSend && video_allowed === 'both'\n const canReceiveAudio = audio_allowed !== 'none'\n const canReceiveVideo = video_allowed !== 'none'\n\n const reqToSendAudio = Boolean(sendAudio ?? audio)\n const reqToSendVideo = Boolean(sendVideo ?? video)\n const reqToReceiveAudio = Boolean(receiveAudio ?? audio)\n const reqToReceiveVideo = Boolean(receiveVideo ?? video)\n\n if (!canSendAudio && reqToSendAudio) {\n getLogger().info(\n 'Not allowed to send audio on this room. Default values will be used.'\n )\n }\n if (!canSendVideo && reqToSendVideo) {\n getLogger().info(\n 'Not allowed to send video on this room. Default values will be used.'\n )\n }\n if (!canReceiveAudio && reqToReceiveAudio) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n if (!canReceiveVideo && reqToReceiveVideo) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n return {\n mustSendAudio: canSendAudio && reqToSendAudio,\n mustSendVideo: canSendVideo && reqToSendVideo,\n mustRecvAudio: canReceiveAudio && reqToReceiveAudio,\n mustRecvVideo: canReceiveVideo && reqToReceiveVideo,\n }\n}\n\nexport const checkMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport const SDK_PREFIX = 'sw-sdk-'\nexport const addSDKPrefix = (id: string) => {\n return `${SDK_PREFIX}${id}`\n}\n\nexport const OVERLAY_PREFIX = 'sw-overlay-'\nexport const addOverlayPrefix = (id: string) => {\n return `${OVERLAY_PREFIX}${id}`\n}\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\ntype RoomSessionScreenShareEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionScreenShare) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionScreenShareEvents = {\n [k in keyof RoomSessionScreenShareEventsHandlerMap]: RoomSessionScreenShareEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<RoomSessionScreenShareEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionScreenShareEvents>['runWorker']\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<RoomSessionScreenShareEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * Represents a screen sharing.\n */\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n SwEventChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { VideoMemberListUpdatedParams } from '../../utils/interfaces'\nimport { VideoRoomSession } from '../VideoRoomSession'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(EXTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: VideoRoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n swEventChannel,\n instance,\n}: {\n swEventChannel: SwEventChannel\n instance: any\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n swEventChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<VideoRoomSession> =\n function* membersChangedWorker({\n channels: { swEventChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n swEventChannel,\n instance,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n VideoMemberJoinedEvent,\n componentSelectors,\n componentActions,\n type ReduxComponent,\n} from '@signalwire/core'\n\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype ChildMemberJoinedWorkerOnDone = () => void\ntype ChildMemberJoinedWorkerOnFail = (args: { error: Error }) => void\n\nexport type ChildMemberJoinedWorkerHooks = SDKWorkerHooks<\n ChildMemberJoinedWorkerOnDone,\n ChildMemberJoinedWorkerOnFail\n>\n\nexport const childMemberJoinedWorker: SDKWorker<\n BaseConnection<any>,\n ChildMemberJoinedWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().trace('childMemberJoinedWorker started')\n const { channels, instance, initialState, onDone, onFail } = options\n const { swEventChannel } = channels\n const { parentId } = initialState\n if (!parentId) {\n throw new Error('Missing parentId for childMemberJoinedWorker')\n }\n\n const action: MapToPubSubShape<VideoMemberJoinedEvent> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'video.member.joined') {\n return action.payload.member.parent_id === parentId\n }\n return false\n })\n\n /**\n * On video.member.joined with a parent_id, check if we are the\n * owner of the object comparing parent_id in the state.\n * If so update the state with the room values to update the\n * object.\n */\n const { member } = action.payload\n if (member?.parent_id) {\n const byId: Record<string, ReduxComponent> = yield sagaEffects.select(\n componentSelectors.getComponentsById\n )\n const parent = Object.values(byId).find((row) => {\n return 'memberId' in row && row.memberId === member.parent_id\n })\n if (parent) {\n yield sagaEffects.put(\n componentActions.upsert({\n id: instance.callId,\n roomId: action.payload.room_id,\n roomSessionId: action.payload.room_session_id,\n memberId: member.id,\n })\n )\n\n onDone?.()\n } else {\n onFail?.({ error: new Error('Unknown parent_id') })\n }\n }\n getLogger().trace('childMemberJoinedWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoStreamEvent,\n RoomSessionStream,\n Rooms,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoStreamWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>\n): SagaIterator {\n getLogger().trace('videoStreamWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let streamInstance = get<RoomSessionStream>(payload.stream.id)\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: roomSession.store,\n payload,\n })\n } else {\n streamInstance.setPayload(payload)\n }\n set<RoomSessionStream>(payload.stream.id, streamInstance)\n\n switch (type) {\n case 'video.stream.started':\n roomSession.emit('stream.started', streamInstance)\n break\n case 'video.stream.ended':\n roomSession.emit('stream.ended', streamInstance)\n remove<RoomSessionStream>(payload.stream.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoStreamWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionRecording,\n Rooms,\n VideoRecordingEvent,\n VideoRecordingEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoRecordWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>\n): SagaIterator {\n getLogger().trace('videoRecordWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let recordingInstance = get<RoomSessionRecording>(payload.recording.id)\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: roomSession.store,\n payload,\n })\n } else {\n recordingInstance.setPayload(payload)\n }\n set<RoomSessionRecording>(payload.recording.id, recordingInstance)\n\n const event = stripNamespacePrefix(type) as VideoRecordingEventNames\n\n switch (type) {\n case 'video.recording.started':\n case 'video.recording.updated': {\n roomSession.emit(event, recordingInstance)\n break\n }\n case 'video.recording.ended':\n roomSession.emit(event, recordingInstance)\n remove<RoomSessionRecording>(payload.recording.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoRecordWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionPlayback,\n Rooms,\n VideoPlaybackEvent,\n VideoPlaybackEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoPlaybackWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>\n): SagaIterator {\n getLogger().trace('videoPlaybackWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: roomSession.store,\n payload,\n })\n } else {\n playbackInstance.setPayload(payload)\n }\n set<RoomSessionPlayback>(payload.playback.id, playbackInstance)\n\n const event = stripNamespacePrefix(type) as VideoPlaybackEventNames\n\n switch (type) {\n case 'video.playback.started':\n case 'video.playback.updated': {\n roomSession.emit(event, playbackInstance)\n break\n }\n case 'video.playback.ended':\n roomSession.emit(event, playbackInstance)\n remove<RoomSessionPlayback>(payload.playback.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoPlaybackWorker ended')\n}\n","import {\n SDKActions,\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n MemberPosition,\n stripNamespacePrefix,\n VideoAction,\n VideoRoomDeviceEventNames,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { videoStreamWorker } from './videoStreamWorker'\nimport { videoRecordWorker } from './videoRecordWorker'\nimport { videoPlaybackWorker } from './videoPlaybackWorker'\nimport { VideoRoomSessionConnection } from '../VideoRoomSession'\nimport { MediaEventNames } from '@signalwire/webrtc'\n\nexport type VideoWorkerParams<T> =\n SDKWorkerParams<VideoRoomSessionConnection> & {\n action: T\n }\n\nexport const videoWorker: SDKWorker<VideoRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoWorker started')\n\n const { channels, instance: roomSession } = options\n const { swEventChannel } = channels\n\n function* worker(action: VideoAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'video.room.subscribed':\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n instance: roomSession,\n initialState: payload,\n })\n return\n case 'video.playback.started':\n case 'video.playback.updated':\n case 'video.playback.ended':\n yield sagaEffects.fork(videoPlaybackWorker, {\n action,\n ...options,\n })\n return // Return since we don't need to handle the raw event for this\n case 'video.recording.started':\n case 'video.recording.updated':\n case 'video.recording.ended':\n yield sagaEffects.fork(videoRecordWorker, {\n action,\n ...options,\n })\n return\n case 'video.stream.ended':\n case 'video.stream.started':\n yield sagaEffects.fork(videoStreamWorker, {\n action,\n ...options,\n })\n return\n case 'video.room.audience_count': {\n roomSession.emit('room.audienceCount', payload)\n return\n }\n case 'video.member.talking': {\n const { member } = payload\n if ('talking' in member) {\n const suffix = member.talking ? 'started' : 'ended'\n roomSession.emit(`member.talking.${suffix}`, payload)\n\n // Keep for backwards compat.\n const deprecatedSuffix = member.talking ? 'start' : 'stop'\n roomSession.emit(`member.talking.${deprecatedSuffix}`, payload)\n }\n break // Break here since we do need the raw event sent to the client\n }\n case 'video.layout.changed': {\n // Upsert the layout event which is needed for buildVideoElement\n roomSession.currentLayoutEvent = action.payload\n break\n }\n default:\n break\n }\n\n const event = stripNamespacePrefix(type, 'video') as\n | VideoRoomDeviceEventNames\n | MediaEventNames\n | BaseConnectionState\n roomSession.emit(event, payload)\n }\n\n const isVideoEvent = (action: SDKActions) => {\n return action.type.startsWith('video.')\n }\n\n while (true) {\n const action: VideoAction = yield sagaEffects.take(\n swEventChannel,\n isVideoEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoWorker ended')\n}\n","import {\n BaseComponentContract,\n BaseConnectionState,\n connect,\n EventEmitter,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionOptions,\n createSpeakerDeviceWatcher,\n getDisplayMedia,\n getSpeakerById,\n supportsMediaOutput,\n MediaEventNames,\n} from '@signalwire/webrtc'\nimport { LocalVideoOverlay, OverlayMap } from './VideoOverlays'\nimport {\n AudioElement,\n BaseRoomSessionContract,\n StartScreenShareOptions,\n} from './utils/interfaces'\nimport { SCREENSHARE_AUDIO_CONSTRAINTS } from './utils/constants'\nimport { addOverlayPrefix } from './utils/roomSession'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShare,\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShareEvents,\n} from './RoomSessionScreenShare'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n> extends BaseRoomSessionContract,\n BaseConnection<EventTypes>,\n BaseComponentContract {}\n\nexport interface BaseRoomSessionOptions extends BaseConnectionOptions {}\n\nexport class BaseRoomSessionConnection<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n >\n extends BaseConnection<EventTypes>\n implements BaseRoomSessionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _audioEl: AudioElement\n private _overlayMap: OverlayMap\n private _localVideoOverlay: LocalVideoOverlay\n\n get audioEl() {\n return this._audioEl\n }\n\n set overlayMap(map: OverlayMap) {\n this._overlayMap = map\n }\n\n get overlayMap() {\n return this._overlayMap\n }\n\n set localVideoOverlay(overlay: LocalVideoOverlay) {\n this._localVideoOverlay = overlay\n }\n\n get localVideoOverlay() {\n return this._localVideoOverlay\n }\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n private _attachSpeakerTrackListener() {\n if (!supportsMediaOutput()) return\n\n // @TODO: Stop the watcher when user leave/disconnects\n createSpeakerDeviceWatcher().then((deviceWatcher) => {\n deviceWatcher.on('removed', async (data) => {\n const sinkId = this._audioEl.sinkId\n const disconnectedSpeaker = data.changes.find((device) => {\n const payloadDeviceId = device.payload.deviceId\n\n return (\n payloadDeviceId === sinkId ||\n (payloadDeviceId === '' && sinkId === 'default') ||\n (payloadDeviceId === 'default' && sinkId === '')\n )\n })\n if (disconnectedSpeaker) {\n this.emit('speaker.disconnected', {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n })\n\n /**\n * In case the currently in-use speaker disconnects, OS by default fallbacks to the default speaker\n * Set the sink id here to make the SDK consistent with the OS\n */\n await this._audioEl.setSinkId?.('')\n\n const defaultSpeakers = await getSpeakerById('default')\n\n if (!defaultSpeakers?.deviceId) return\n\n // Emit the speaker.updated event since the OS will fallback to the default speaker\n this.emit('speaker.updated', {\n previous: {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n },\n current: {\n deviceId: defaultSpeakers.deviceId,\n label: defaultSpeakers.label,\n },\n })\n }\n })\n })\n }\n\n /** @internal */\n protected override _finalize() {\n this._screenShareList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n\n return super.hangup(id)\n }\n\n leave() {\n return this.hangup()\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 attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /** @internal */\n getAudioEl() {\n if (this._audioEl) return this._audioEl\n this._audioEl = new Audio()\n this._attachSpeakerTrackListener()\n return this._audioEl\n }\n\n getMemberOverlay(memberId: string) {\n return this.overlayMap.get(addOverlayPrefix(memberId))\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n return new Promise<RoomSessionScreenShare>(async (resolve, reject) => {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n try {\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n RoomSessionScreenShareEvents,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.once('destroy', () => {\n screenShare.emit('room.left')\n this._screenShareList.delete(screenShare)\n })\n\n screenShare.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(screenShare),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n return await screenShare.join()\n }\n return resolve(screenShare)\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n reject(error)\n }\n })\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n const prevId = this.audioEl.sinkId as string\n this.once(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n async (newId: string) => {\n const prevSpeaker = await getSpeakerById(prevId)\n const newSpeaker = await getSpeakerById(newId)\n\n const isSame = newSpeaker?.deviceId === prevSpeaker?.deviceId\n if (!newSpeaker?.deviceId || isSame) return\n\n this.emit('speaker.updated', {\n previous: {\n deviceId: prevSpeaker?.deviceId,\n label: prevSpeaker?.label,\n },\n current: {\n deviceId: newSpeaker.deviceId,\n label: newSpeaker.label,\n },\n })\n }\n )\n\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n}\n\ntype BaseRoomSessionEventsHandlerMap = Record<\n BaseConnectionState,\n (params: BaseRoomSession<BaseRoomSessionEvents>) => void\n> &\n Record<MediaEventNames, () => void>\n\nexport type BaseRoomSessionEvents = {\n [k in keyof BaseRoomSessionEventsHandlerMap]: BaseRoomSessionEventsHandlerMap[k]\n}\n\n/** @internal */\nexport const createBaseRoomSessionObject = (\n params: BaseRoomSessionOptions\n): BaseRoomSession<BaseRoomSessionEvents> => {\n const room = connect<\n BaseRoomSessionEvents,\n BaseRoomSessionConnection<BaseRoomSessionEvents>,\n BaseRoomSession<BaseRoomSessionEvents>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: BaseRoomSessionConnection,\n })(params)\n\n return room\n}\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\ntype RoomSessionDeviceEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionDevice) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionDeviceEvents = {\n [k in keyof RoomSessionDeviceEventsHandlerMap]: RoomSessionDeviceEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<RoomSessionDeviceEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionDeviceEvents>['runWorker']\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<RoomSessionDeviceEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n BaseComponentContract,\n BaseConnectionContract,\n connect,\n EventEmitter,\n extendComponent,\n Rooms,\n validateEventsToSubscribe,\n VideoAuthorization,\n VideoLayoutChangedEventParams,\n} from '@signalwire/core'\nimport { BaseConnectionOptions } from '@signalwire/webrtc'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n RoomSessionDevice,\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDeviceEvents,\n} from '../RoomSessionDevice'\nimport * as workers from './workers'\nimport {\n AddCameraOptions,\n AddDeviceOptions,\n AddMicrophoneOptions,\n CreateScreenShareObjectOptions,\n VideoRoomSessionMethods,\n VideoRoomSessionEvents,\n VideoRoomSessionContract,\n BaseRoomSessionContract,\n} from '../utils/interfaces'\n\nexport interface VideoRoomSession\n extends VideoRoomSessionContract,\n VideoRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<VideoRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface VideoRoomSessionOptions extends BaseRoomSessionOptions {}\n\nexport class VideoRoomSessionConnection\n extends BaseRoomSessionConnection<VideoRoomSessionEvents>\n implements VideoRoomSessionContract\n{\n private _deviceList = new Set<RoomSessionDevice>()\n private _currentLayoutEvent: VideoLayoutChangedEventParams\n\n constructor(options: VideoRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n set currentLayoutEvent(event: VideoLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n get interactivityMode() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.join_as ?? ''\n })\n }\n\n get permissions() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.room?.scopes ?? []\n })\n }\n\n private initWorker() {\n this.runWorker('videoWorker', {\n worker: workers.videoWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => {\n return `video.${String(event)}`\n })\n return validateEventsToSubscribe(\n eventNamesWithPrefix\n ) as EventEmitter.EventNames<{}>[]\n }\n\n /** @internal */\n protected _finalize() {\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup(id)\n }\n\n join() {\n return super.invite<VideoRoomSession>()\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 /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n return new Promise<RoomSessionDevice>(async (resolve, reject) => {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n RoomSessionDeviceEvents,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n })(options)\n\n roomDevice.once('destroy', () => {\n roomDevice.emit('room.left')\n this._deviceList.delete(roomDevice)\n })\n\n try {\n roomDevice.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(roomDevice),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n return await roomDevice.join()\n }\n return resolve(roomDevice)\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n reject(error)\n }\n })\n }\n}\n\nexport const VideoRoomSessionAPI = extendComponent<\n VideoRoomSessionConnection,\n VideoRoomSessionMethods\n>(VideoRoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n getMeta: Rooms.getMeta,\n setMeta: Rooms.setMeta,\n updateMeta: Rooms.updateMeta,\n deleteMeta: Rooms.deleteMeta,\n getMemberMeta: Rooms.getMemberMeta,\n setMemberMeta: Rooms.setMemberMeta,\n updateMemberMeta: Rooms.updateMemberMeta,\n deleteMemberMeta: Rooms.deleteMemberMeta,\n promote: Rooms.promote,\n demote: Rooms.demote,\n getStreams: Rooms.getStreams,\n startStream: Rooms.startStream,\n lock: Rooms.lock,\n unlock: Rooms.unlock,\n setRaisedHand: Rooms.setRaisedHand,\n setPrioritizeHandraise: Rooms.setPrioritizeHandraise,\n})\n\nexport const isVideoRoomSession = (room: unknown): room is VideoRoomSession => {\n return room instanceof VideoRoomSessionConnection\n}\n\n/** @internal */\nexport const createVideoRoomSessionObject = (\n params: VideoRoomSessionOptions\n): VideoRoomSession => {\n const room = connect<\n VideoRoomSessionEvents,\n VideoRoomSessionConnection,\n VideoRoomSession\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: VideoRoomSessionAPI,\n })(params)\n\n return room\n}\n","function e(e){this.message=e}e.prototype=new Error,e.prototype.name=\"InvalidCharacterError\";var r=\"undefined\"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,\"\");if(t.length%4==1)throw new e(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var n,o,a=0,i=0,c=\"\";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(o);return c};function t(e){var t=e.replace(/-/g,\"+\").replace(/_/g,\"/\");switch(t.length%4){case 0:break;case 2:t+=\"==\";break;case 3:t+=\"=\";break;default:throw\"Illegal base64url string!\"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t=\"0\"+t),\"%\"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if(\"string\"!=typeof e)throw new n(\"Invalid token specified\");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(\".\")[o]))}catch(e){throw new n(\"Invalid token specified: \"+e.message)}}n.prototype=new Error,n.prototype.name=\"InvalidTokenError\";export default o;export{n as InvalidTokenError};\n//# sourceMappingURL=jwt-decode.esm.js.map\n","import jwtDecode from 'jwt-decode'\nimport { getLogger } from '@signalwire/core'\n\n/**\n * Note: ready to support RN with a \"storage.native.ts\" file.\n */\nexport const getStorage = () => {\n if (window && window.sessionStorage) {\n return window.sessionStorage\n }\n return undefined\n}\n\nexport const sessionStorageManager = (token: string) => {\n let roomName: string = ''\n try {\n const jwtPayload = jwtDecode<{ r: string; ja: string }>(token)\n roomName = jwtPayload?.r ?? ''\n } catch (e) {\n try {\n const jwtPayload = jwtDecode<{ typ: string}>(token, {header: true})\n roomName = jwtPayload.typ || ''\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[sessionStorageManager] error decoding JWT', token)\n }\n roomName = ''\n }\n }\n\n const valid = Boolean(roomName)\n return {\n authStateKey: valid && `as-${roomName}`,\n protocolKey: valid && `pt-${roomName}`,\n callIdKey: valid && `ci-${roomName}`,\n }\n}\n","export const PREVIOUS_CALLID_STORAGE_KEY = 'ci-SAT';","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n WebRTCMessageParams,\n} from '@signalwire/core'\nimport { WSClient } from '../WSClient'\n\ntype WSClientWorkerOnDone = () => void\ntype WSClientWorkerOnFail = (args: { error: Error }) => void\n\nexport type WSClientWorkerHooks = SDKWorkerHooks<\n WSClientWorkerOnDone,\n WSClientWorkerOnFail\n>\n\nexport const wsClientWorker: SDKWorker<WSClient, WSClientWorkerHooks> =\n function* (options): SagaIterator {\n getLogger().debug('wsClientWorker started')\n const { channels, initialState } = options\n const { swEventChannel } = channels\n const { handleIncomingInvite } = initialState\n\n try {\n while (true) {\n const action: MapToPubSubShape<WebRTCMessageParams> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'webrtc.message') {\n return action.payload.method === 'verto.invite'\n }\n return false\n })\n getLogger().debug('Receiving a new call over WebSocket', action)\n\n // Invoke WSClient function to build and answer the invite\n handleIncomingInvite(action.payload.params)\n }\n } finally {\n getLogger().trace('wsClientWorker ended')\n }\n }\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n ConversationEvent,\n} from '@signalwire/core'\nimport { Conversation } from '../Conversation'\nimport { WSClient } from '../WSClient'\n\ninterface ConversationWorkerInitialState {\n conversation: Conversation\n}\n\nexport const conversationWorker: SDKWorker<WSClient> = function* (\n options\n): SagaIterator {\n getLogger().debug('conversationWorker started')\n const {\n channels: { swEventChannel },\n initialState,\n } = options\n\n const { conversation } = initialState as ConversationWorkerInitialState\n\n const isConversationEvent = (action: SDKActions) => {\n return action.type.startsWith('conversation.')\n }\n\n while (true) {\n const action: MapToPubSubShape<ConversationEvent> = yield sagaEffects.take(\n swEventChannel,\n isConversationEvent\n )\n conversation.handleEvent(action.payload)\n }\n\n getLogger().trace('conversationWorker ended')\n}\n","import {\n FabricMemberEventNames,\n FabricMemberEventParams,\n FabricMemberEventParamsExcludeTalking,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEventParams,\n FabricMemberContract,\n connect,\n MemberJoined,\n MemberLeft,\n MemberTalking,\n MemberUpdated,\n BaseComponentOptionsWithPayload,\n BaseComponent,\n} from '@signalwire/core'\n\nexport interface FabricRoomSessionMember extends FabricMemberContract {\n /** Unique id of this member. */\n id: string\n setPayload(payload: FabricMemberEventParams): void\n}\n\n// TODO: Fabric Room Session Member instance does not emit any events yet\nexport type FabricRoomSessionMemberEventsHandlerMap = Record<\n MemberJoined,\n (params: FabricMemberJoinedEventParams) => void\n> &\n Record<MemberUpdated, (params: FabricMemberUpdatedEventParams) => void> &\n Record<MemberLeft, (params: FabricMemberLeftEventParams) => void> &\n Record<MemberTalking, (params: FabricMemberTalkingEventParams) => void> &\n Record<\n Exclude<FabricMemberEventNames, MemberJoined | MemberLeft | MemberTalking>,\n (params: FabricMemberUpdatedEventParams) => void\n >\n\nexport type FabricRoomSessionMemberEvents = {\n [k in keyof FabricRoomSessionMemberEventsHandlerMap]: FabricRoomSessionMemberEventsHandlerMap[k]\n}\n\nexport interface FabricRoomSessionMemberOptions\n extends BaseComponentOptionsWithPayload<FabricMemberEventParamsExcludeTalking> {}\n\nexport class FabricRoomSessionMemberAPI\n extends BaseComponent<FabricRoomSessionMemberEvents>\n implements FabricMemberContract\n{\n private _payload: FabricMemberEventParamsExcludeTalking\n\n constructor(options: FabricRoomSessionMemberOptions) {\n super(options)\n this._payload = options.payload\n }\n\n get id() {\n return this._payload.member.member_id\n }\n\n get callId() {\n return this._payload.member.call_id\n }\n\n get nodeId() {\n return this._payload.member.node_id\n }\n\n get memberId() {\n return this.id\n }\n\n get roomSessionId() {\n return this._payload.room_session_id\n }\n\n get roomId() {\n return this._payload.room_id\n }\n\n get parentId() {\n return this._payload.member.parent_id\n }\n\n get name() {\n return this._payload.member.name\n }\n\n get type() {\n return this._payload.member.type\n }\n\n get requestedPosition() {\n return this._payload.member.requested_position\n }\n\n get currentPosition() {\n return this._payload.member.current_position\n }\n\n get meta() {\n return this._payload.member.meta\n }\n\n get handraised() {\n return this._payload.member.handraised\n }\n\n get talking() {\n return this._payload.member.talking\n }\n\n get audioMuted() {\n return this._payload.member.audio_muted\n }\n\n get videoMuted() {\n return this._payload.member.video_muted\n }\n\n get deaf() {\n return this._payload.member.deaf\n }\n\n get visible() {\n return this._payload.member.visible\n }\n\n get inputVolume() {\n return this._payload.member.input_volume\n }\n\n get outputVolume() {\n return this._payload.member.output_volume\n }\n\n get inputSensitivity() {\n return this._payload.member.input_sensitivity\n }\n\n get subscriberData() {\n return this._payload.member.subscriber_data\n }\n\n /** @internal */\n setPayload(payload: FabricMemberEventParams) {\n // Reshape the payload since the `member.talking` event does not return all the parameters of a member\n const newPayload = {\n ...this._payload,\n ...payload,\n member: {\n ...this._payload.member,\n ...payload.member,\n },\n }\n this._payload = newPayload\n }\n}\n\nexport const createFabricRoomSessionMemberObject = (\n params: FabricRoomSessionMemberOptions\n): FabricRoomSessionMember => {\n const member = connect<\n FabricRoomSessionMemberEventsHandlerMap,\n FabricRoomSessionMemberAPI,\n FabricRoomSessionMember\n >({\n store: params.store,\n Component: FabricRoomSessionMemberAPI,\n })(params)\n\n return member\n}\n","import { getLogger, SagaIterator, CallLeftEvent } from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { FabricRoomSessionMemberAPI } from '../FabricRoomSessionMember'\n\nexport const callLeftWorker = function* (\n options: FabricWorkerParams<CallLeftEvent>\n): SagaIterator {\n getLogger().trace('callLeftWorker started')\n\n const {\n action: { payload },\n instance: cfRoomSession,\n instanceMap,\n } = options\n\n const { room_session_id } = payload\n\n // Remove all the member instance where roomSessionId matches\n instanceMap.getAll().forEach(([key, obj]) => {\n if (\n obj instanceof FabricRoomSessionMemberAPI &&\n obj.roomSessionId === room_session_id\n ) {\n instanceMap.remove(key)\n }\n })\n\n cfRoomSession.emit('call.left', payload)\n cfRoomSession.emit('room.left', payload)\n\n getLogger().trace('callLeftWorker ended')\n}\n","import {\n FabricMemberEvent,\n FabricMemberUpdatedEventParams,\n MemberUpdatedEventNames,\n SagaIterator,\n fromSnakeToCamelCase,\n getLogger,\n} from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\n\nexport const fabricMemberWorker = function* (\n options: FabricWorkerParams<FabricMemberEvent>\n): SagaIterator {\n getLogger().trace('fabricMemberWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n const memberId = payload.member.member_id\n let memberInstance = get<FabricRoomSessionMember>(memberId)\n if (!memberInstance && type !== 'member.talking') {\n memberInstance = createFabricRoomSessionMemberObject({\n store: roomSession.store,\n payload: payload,\n })\n }\n if (memberInstance) {\n memberInstance.setPayload(payload)\n }\n set<FabricRoomSessionMember>(memberId, memberInstance)\n\n if (type.startsWith('member.updated.')) {\n const clientType = fromSnakeToCamelCase(type) as MemberUpdatedEventNames\n roomSession.emit(clientType, payload as FabricMemberUpdatedEventParams)\n }\n\n switch (type) {\n case 'member.joined':\n roomSession.emit(type, payload)\n break\n case 'member.updated':\n roomSession.emit(type, payload)\n break\n case 'member.left':\n roomSession.emit(type, payload)\n remove<FabricRoomSessionMember>(memberId)\n break\n case 'member.talking':\n roomSession.emit(type, payload)\n break\n default:\n break\n }\n\n getLogger().trace('fabricMemberWorker ended')\n}\n","import {\n CallJoinedEvent,\n CallJoinedEventParams,\n CallUpdatedEvent,\n CallUpdatedEventParams,\n FabricLayoutChangedEvent,\n FabricMemberJoinedEvent,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEvent,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEvent,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEvent,\n FabricMemberUpdatedEventParams,\n InternalFabricMemberEntity,\n InternalFabricMemberEntityUpdated,\n InternalFabricRoomSessionEntity,\n InternalVideoMemberEntity,\n InternalVideoMemberEntityUpdated,\n InternalVideoRoomEntity,\n InternalVideoRoomSessionEntity,\n MapToPubSubShape,\n VideoLayoutChangedEvent,\n VideoMemberJoinedEvent,\n VideoMemberJoinedEventParams,\n VideoMemberLeftEvent,\n VideoMemberLeftEventParams,\n VideoMemberTalkingEvent,\n VideoMemberTalkingEventParams,\n VideoMemberUpdatedEvent,\n VideoMemberUpdatedEventParams,\n VideoRoomSubscribedEvent,\n VideoRoomSubscribedEventParams,\n VideoRoomUpdatedEvent,\n VideoRoomUpdatedEventParams,\n} from '@signalwire/core'\n\n/**\n * Map the InternalFabricMemberEntity to InternalVideoMemberEntity\n */\nexport const mapInternalFabricMemberToInternalVideoMemberEntity = (\n params: InternalFabricMemberEntity\n): InternalVideoMemberEntity => {\n return {\n id: params.member_id,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n name: params.name,\n type: params.type,\n handraised: params.handraised,\n visible: params.visible,\n audio_muted: params.audio_muted,\n video_muted: params.video_muted,\n deaf: params.deaf,\n input_volume: params.input_volume,\n output_volume: params.output_volume,\n input_sensitivity: params.input_sensitivity,\n meta: params.meta,\n talking: params.talking,\n current_position: params.current_position,\n requested_position: params.requested_position,\n parent_id: params.parent_id,\n }\n}\n\n/**\n * Map the InternalFabricMemberEntityUpdated to InternalVideoMemberEntityUpdated\n */\nexport const mapInternalFabricMemberToInternalVideoMemberUpdatedEntity = (\n params: InternalFabricMemberEntityUpdated\n): InternalVideoMemberEntityUpdated => {\n return {\n ...mapInternalFabricMemberToInternalVideoMemberEntity(params),\n updated: params.updated.map((key) =>\n key === 'member_id' ? 'id' : (key as keyof InternalVideoMemberEntity)\n ),\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomEntity => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n recordings: params.recordings,\n playbacks: params.playbacks,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomSessionEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomSessionEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomSessionEntity => {\n return {\n id: params.id,\n display_name: params.display_name,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n recordings: params.recordings,\n playbacks: params.playbacks,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n layout_name: params.layout_name,\n locked: params.locked,\n meta: params.meta,\n members: params.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n streaming: params.streaming,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n updated: params.updated,\n }\n}\n\n/**\n * Map the \"call.joined\" event params to \"video.room.subscribed\" event params\n */\nexport const mapCallJoinedToRoomSubscribedEventParams = (\n params: CallJoinedEventParams\n): VideoRoomSubscribedEventParams => {\n return {\n call_id: params.call_id,\n member_id: params.member_id,\n room: {\n ...mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n room_session: {\n ...mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n }\n}\n\n/**\n * Map the \"call.joined\" action to \"video.room.subscribed\" action\n */\nexport const mapCallJoinedToRoomSubscribedAction = (\n action: MapToPubSubShape<CallJoinedEvent>\n): MapToPubSubShape<VideoRoomSubscribedEvent> => {\n return {\n type: `video.room.subscribed`,\n payload: mapCallJoinedToRoomSubscribedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"call.updated\" event params to \"video.room.updated\" event params\n */\nexport const mapCallUpdatedToRoomUpdatedEventParams = (\n params: CallUpdatedEventParams\n): VideoRoomUpdatedEventParams => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n room: mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n room_session: mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n }\n}\n\n/**\n * Map the \"call.updated\" action to \"video.room.updated\" action\n */\nexport const mapCallUpdatedToRoomUpdatedEventAction = (\n action: MapToPubSubShape<CallUpdatedEvent>\n): MapToPubSubShape<VideoRoomUpdatedEvent> => {\n return {\n type: `video.room.updated`,\n payload: mapCallUpdatedToRoomUpdatedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" event params\n * to \"video.member.joined\" and \"video.member.left\" event params\n */\nexport const mapFabricMemberToVideoMemberJoinAndLeftEventParams = (\n params: FabricMemberJoinedEventParams | FabricMemberLeftEventParams\n): VideoMemberJoinedEventParams | VideoMemberLeftEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberEntity(params.member),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" actions\n * to \"video.member.joined\" and \"video.member.left\" actions\n */\nexport const mapFabricMemberActionToVideoMemberJoinAndLeftAction = (\n action: MapToPubSubShape<FabricMemberJoinedEvent | FabricMemberLeftEvent>\n): MapToPubSubShape<VideoMemberJoinedEvent | VideoMemberLeftEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberJoinAndLeftEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.updated\" event params to \"video.member.updated\" event params\n */\nexport const mapFabricMemberEventToVideoMemberUpdatedEventParams = (\n params: FabricMemberUpdatedEventParams\n): VideoMemberUpdatedEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberUpdatedEntity(\n params.member\n ),\n }\n}\n\n/**\n * Map the \"member.updated\" action to \"video.member.updated\" action\n */\nexport const mapFabricMemberActionToVideoMemberUpdatedAction = (\n action: MapToPubSubShape<FabricMemberUpdatedEvent>\n): MapToPubSubShape<VideoMemberUpdatedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberEventToVideoMemberUpdatedEventParams(\n action.payload\n ),\n }\n}\n\n/**\n * Map the \"member.talking\" event params to \"video.member.talking\" event params\n */\nexport const mapFabricMemberToVideoMemberTalkingEventParams = (\n params: FabricMemberTalkingEventParams\n): VideoMemberTalkingEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: {\n id: params.member.member_id,\n talking: params.member.talking,\n },\n }\n}\n\n/**\n * Map the \"member.talking\" action to \"video.member.talking\" action\n */\nexport const mapFabricMemberActionToVideoMemberTalkingAction = (\n action: MapToPubSubShape<FabricMemberTalkingEvent>\n): MapToPubSubShape<VideoMemberTalkingEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberTalkingEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"layout.changed\" action to \"video.layout.changed\" action\n */\nexport const mapFabricLayoutActionToVideoLayoutAction = (\n action: MapToPubSubShape<FabricLayoutChangedEvent>\n): MapToPubSubShape<VideoLayoutChangedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: action.payload,\n }\n}\n","import {\n getLogger,\n SagaIterator,\n CallJoinedEvent,\n sagaEffects,\n MemberPosition,\n mapCapabilityPayload,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { fabricMemberWorker } from './fabricMemberWorker'\nimport { mapCallJoinedToRoomSubscribedEventParams } from '../utils/helpers'\n\nexport const callJoinWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n getLogger().trace('callJoinWorker started')\n const { action, instanceMap, instance: cfRoomSession } = options\n const { payload } = action\n const { get, set } = instanceMap\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n /**\n * The {@link memberPositionWorker} worker understands only the Video SDK events.\n * So, we need to map CF SDK event to Video SDK event.\n * Similar to what we do in the {@link callSegmentWorker}, for member events.\n */\n initialState: mapCallJoinedToRoomSubscribedEventParams(payload),\n dispatcher: function* (subType, subPayload) {\n /**\n * The {@link memberPositionWorker} dispatches the Video SDK events.\n * We need to convert it back to CF SDK event before emitting to the user.\n */\n const fabricType = stripNamespacePrefix(subType, 'video') as any\n const fabricPaylod = {\n ...subPayload,\n member: {\n ...subPayload.member,\n member_id: subPayload.member.id,\n },\n }\n\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action: { type: fabricType, payload: fabricPaylod },\n })\n },\n })\n\n payload.room_session.members?.forEach((member: any) => {\n let memberInstance = get<FabricRoomSessionMember>(member.member_id!)\n if (!memberInstance) {\n memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n },\n })\n } else {\n memberInstance.setPayload({\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n })\n }\n set<FabricRoomSessionMember>(member.member_id, memberInstance)\n })\n\n cfRoomSession.member = get<FabricRoomSessionMember>(payload.member_id)\n cfRoomSession.capabilities = mapCapabilityPayload(payload.capabilities || [])\n\n // FIXME: Capabilities type is incompatible.\n // @ts-expect-error\n cfRoomSession.emit('call.joined', {\n ...payload,\n capabilities: cfRoomSession.capabilities,\n })\n\n getLogger().trace('callJoinWorker ended')\n}\n","import {\n FabricAction,\n CallJoinedEvent,\n SDKActions,\n SagaIterator,\n getLogger,\n sagaEffects,\n} from '@signalwire/core'\nimport { callLeftWorker } from './callLeftWorker'\nimport { callJoinWorker } from './callJoinWorker'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n mapFabricLayoutActionToVideoLayoutAction,\n mapFabricMemberActionToVideoMemberJoinAndLeftAction,\n mapFabricMemberActionToVideoMemberUpdatedAction,\n} from '../utils/helpers'\nimport { fabricMemberWorker } from './fabricMemberWorker'\n\nexport const callSegmentWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n const {\n action,\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n const segmentCallId = action.payload.call_id\n const segmentRooSessionId = action.payload.room_session_id\n\n getLogger().debug(\n `callSegmentWorker started for: callId ${segmentCallId}, roomSessionId ${segmentRooSessionId}`\n )\n\n // Handles the `call.joined` event before the worker loop\n yield sagaEffects.fork(callJoinWorker, {\n ...options,\n action,\n })\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined':\n /** NOOP since this event is handled by the {@link fabricWorker} */\n break\n case 'call.left':\n // Wait for the `callLeftWorker` to finish and then stop this particular segment worker\n yield sagaEffects.call(callLeftWorker, {\n ...options,\n action,\n })\n return true\n case 'call.updated':\n cfRoomSession.emit(type, payload)\n cfRoomSession.emit('room.updated', payload)\n break\n case 'call.play':\n cfRoomSession.emit(type, payload)\n break\n case 'call.connect':\n cfRoomSession.emit(type, payload)\n break\n case 'call.room':\n cfRoomSession.emit(type, payload)\n break\n\n /**\n * The Core module includes a generic worker, {@link memberPositionWorker},\n * which listens for member & layout events to add a \"current_position\" parameter\n * and handle member \"updated\" parameter.\n * This worker in CF SDK is initialized by the {@link callJoinWorker} worker.\n *\n * To ensure compatibility, we map these events to Video SDK events and\n * re-publish them on the channel so that they can be processed by the\n * generic worker. Note that the generic worker only dispatches \"member.updated\"\n * and \"member.updated.*\" events.\n *\n * Additionally, the \"member.joined\" event is monitored by another worker,\n * {@link childMemberJoinedWorker}, specifically for the screen share API.\n */\n case 'member.joined':\n case 'member.left': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n const videoAction =\n mapFabricMemberActionToVideoMemberJoinAndLeftAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.updated': {\n const videoAction =\n mapFabricMemberActionToVideoMemberUpdatedAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'layout.changed': {\n // We need to update the layout event which is needed for rootElement.\n cfRoomSession.currentLayoutEvent = action.payload\n cfRoomSession.emit(type, payload)\n const videoAction = mapFabricLayoutActionToVideoLayoutAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.talking': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n break\n }\n default: {\n getLogger().warn('Got an unknown fabric event', action)\n }\n }\n\n return false\n }\n\n const isSegmentEvent = (action: SDKActions) => {\n const { type, payload } = action as FabricAction\n const shouldWatch =\n type.startsWith('call.') ||\n type.startsWith('member.') ||\n type.startsWith('layout.')\n const hasSegmentCallId =\n 'call_id' in payload && segmentCallId === payload.call_id\n const hasSegmentRoomSessionId =\n segmentRooSessionId === payload.room_session_id\n\n if (shouldWatch && (hasSegmentCallId || hasSegmentRoomSessionId)) {\n return true\n }\n\n return false\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isSegmentEvent\n )\n const task = yield sagaEffects.fork(worker, action)\n\n /**\n * Wait for `worker` to finish and get its return value\n * Stop the `callSegmentWorker' if the returned value is true\n */\n const shouldStop = yield sagaEffects.join(task)\n if (shouldStop) return\n }\n}\n","import {\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n SDKActions,\n FabricAction,\n} from '@signalwire/core'\nimport { FabricRoomSessionConnection } from '../FabricRoomSession'\nimport { createFabricRoomSessionMemberObject } from '../FabricRoomSessionMember'\nimport { callSegmentWorker } from './callSegmentWorker'\nimport { MapToPubSubShape } from 'packages/core/dist/core/src'\n\nexport type FabricWorkerParams<T> =\n SDKWorkerParams<FabricRoomSessionConnection> & {\n action: MapToPubSubShape<T>\n }\n\nexport const fabricWorker: SDKWorker<FabricRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('fabricWorker started')\n const {\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined': {\n // since we depend on `cfRoomSession.selfMember` on the take logic\n // we need to make sure we update the `cfRoomSession.selfMember`\n // in this worker or have a race condition.\n if (!cfRoomSession.selfMember) {\n const memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: action.payload.room_session.members.find(\n (m) => m.member_id === action.payload.member_id\n )!,\n room_id: action.payload.room_id,\n room_session_id: action.payload.room_session_id,\n },\n })\n cfRoomSession.selfMember = memberInstance\n }\n\n // Segment worker for each call_id\n yield sagaEffects.fork(callSegmentWorker, {\n ...options,\n instance: cfRoomSession,\n action,\n })\n break\n }\n case 'call.state':\n cfRoomSession.emit(type, payload)\n break\n }\n }\n\n let firstCallJoinedReceived = false\n const isFirstCallJoinedorCallStateEvent = (action: SDKActions) => {\n if (action.type === 'call.state') {\n return true\n }\n\n if (action.type !== 'call.joined') {\n return false\n }\n\n // If this is the first call.joined event, verify the call origin ID\n if (!firstCallJoinedReceived) {\n const callId = action.payload.call_id\n const originCallId = action.payload.origin_call_id\n if (callId === originCallId) {\n firstCallJoinedReceived = true\n return true\n }\n return false // Discard all the call.joined event until the first call.joined is received\n }\n\n // If first call.joined event already received, only check the action type\n return true\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isFirstCallJoinedorCallStateEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('fabricWorker ended')\n}\n","import {\n connect,\n BaseComponentContract,\n BaseRPCResult,\n CallCapabilities,\n FabricLayoutChangedEventParams,\n ExecuteExtendedOptions,\n Rooms,\n VideoMemberEntity,\n VideoPosition,\n BaseConnectionContract,\n FabricRoomSessionMethods,\n MemberCommandParams,\n} from '@signalwire/core'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n BaseRoomSessionContract,\n ExecuteMemberActionParams,\n FabricRoomSessionContract,\n FabricRoomSessionEvents,\n MemberCommandWithValueParams,\n MemberCommandWithVolumeParams,\n RequestMemberParams,\n} from '../utils/interfaces'\nimport { getStorage } from '../utils/storage'\nimport { PREVIOUS_CALLID_STORAGE_KEY } from './utils/constants'\nimport { fabricWorker } from './workers'\nimport { FabricRoomSessionMember } from './FabricRoomSessionMember'\nimport { makeAudioElementSaga } from '../features/mediaElements/mediaElementsSagas'\n\nexport interface FabricRoomSession\n extends FabricRoomSessionContract,\n FabricRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<FabricRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface FabricRoomSessionOptions\n extends Omit<BaseRoomSessionOptions, 'customSagas'> {}\n\nexport class FabricRoomSessionConnection\n extends BaseRoomSessionConnection<FabricRoomSessionEvents>\n implements FabricRoomSessionContract\n{\n // this is \"self\" parameter required by the RPC, and is always \"the member\" on the 1st call segment\n private _self?: FabricRoomSessionMember\n // this is \"the member\" on the last/active call segment\n private _member?: FabricRoomSessionMember\n private _currentLayoutEvent: FabricLayoutChangedEventParams\n //describes what are methods are allow for the user in a call segment\n private _capabilities: CallCapabilities = {}\n\n constructor(options: FabricRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n override get memberId() {\n return this._member?.memberId\n }\n\n set currentLayoutEvent(event: FabricLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get capabilities(): CallCapabilities {\n return this._capabilities\n }\n\n set capabilities(capabilities: CallCapabilities) {\n this._capabilities = capabilities\n }\n\n get selfMember(): FabricRoomSessionMember | undefined {\n return this._self\n }\n\n set selfMember(member: FabricRoomSessionMember | undefined) {\n this._self = member\n }\n\n set member(member: FabricRoomSessionMember) {\n this._member = member\n }\n\n get member(): FabricRoomSessionMember {\n return this._member!\n }\n\n private initWorker() {\n this.runWorker('fabricWorker', {\n worker: fabricWorker,\n })\n\n /**\n * By default the SDK attaches the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n this.runWorker('makeAudioElement', {\n worker: makeAudioElementSaga({\n speakerId: this.options.speakerId,\n }),\n })\n }\n\n private async join() {\n if (this.options.attach) {\n this.options.prevCallId =\n getStorage()?.getItem(PREVIOUS_CALLID_STORAGE_KEY) ?? undefined\n }\n this.logger.debug(\n `Tying to reattach to previuos call? ${!!this.options\n .prevCallId} - prevCallId: ${this.options.prevCallId}`\n )\n\n return super.invite<FabricRoomSession>()\n }\n\n private executeAction<\n InputType,\n OutputType = InputType,\n ParamsType extends MemberCommandParams = MemberCommandParams\n >(\n params: ExecuteMemberActionParams,\n options: ExecuteExtendedOptions<InputType, OutputType, ParamsType> = {}\n ) {\n const { method, channel, memberId, extraParams = {} } = params\n\n const targetMember = memberId\n ? this.instanceMap.get<FabricRoomSessionMember>(memberId)\n : this.member\n if (!targetMember) throw new Error('No target param found to execute')\n\n return this.execute<InputType, OutputType, ParamsType>(\n {\n method,\n params: {\n ...(channel && { channels: [channel] }),\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId,\n node_id: targetMember.nodeId,\n },\n ...extraParams,\n },\n },\n options\n )\n }\n\n /** @internal */\n public override async resume() {\n this.logger.warn(`[resume] Call ${this.id}`)\n if (this.peer?.instance) {\n const { connectionState } = this.peer.instance\n this.logger.debug(\n `[resume] connectionState for ${this.id} is '${connectionState}'`\n )\n if (['closed', 'failed', 'disconnected'].includes(connectionState)) {\n this.resuming = true\n this.peer.restartIce()\n }\n }\n }\n\n public async start() {\n return new Promise<void>(async (resolve, reject) => {\n try {\n this.once('room.subscribed', (params) => {\n getStorage()?.setItem(PREVIOUS_CALLID_STORAGE_KEY, params.call_id)\n resolve()\n })\n\n this.once('destroy', () => {\n getStorage()?.removeItem(PREVIOUS_CALLID_STORAGE_KEY)\n })\n\n await this.join()\n } catch (error) {\n this.logger.error('WSClient call start', error)\n reject(error)\n }\n })\n }\n\n public async audioMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteAudio?.off\n : !this.capabilities.member?.muteAudio?.off\n ) {\n throw Error('Missing audio mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async audioUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteAudio?.on\n : !this.capabilities.member?.muteAudio?.on\n ) {\n throw Error('Missing audio unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async videoMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteVideo?.off\n : !this.capabilities.member?.muteVideo?.on\n ) {\n throw Error('Missing video mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async videoUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.muteVideo?.on\n : !this.capabilities.member?.muteVideo?.on\n ) {\n throw Error('Missing video unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async deaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.deaf?.on\n : !this.capabilities.member?.deaf?.on\n ) {\n throw Error('Missing deaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.deaf',\n memberId: params?.memberId,\n })\n }\n\n public async undeaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.deaf?.off\n : !this.capabilities.member?.deaf?.off\n ) {\n throw Error('Missing undeaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.undeaf',\n memberId: params?.memberId,\n })\n }\n\n public async getLayouts() {\n return this.executeAction<{ layouts: string[] }>(\n {\n method: 'call.layout.list',\n },\n {\n transformResolve: (payload) => ({\n layouts: payload.layouts,\n }),\n }\n )\n }\n\n public async getMembers() {\n return this.executeAction<{ members: VideoMemberEntity[] }>(\n {\n method: 'call.member.list',\n },\n {\n transformResolve: (payload) => ({\n members: payload.members,\n }),\n }\n )\n }\n\n public async removeMember(params: Required<MemberCommandParams>) {\n if (!this.capabilities.member?.remove) {\n throw Error('Missing setLayout capability')\n }\n if (!params?.memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.member.remove',\n memberId: params.memberId,\n })\n }\n\n public async setRaisedHand(params?: Rooms.SetRaisedHandRoomParams) {\n const { raised = true, memberId } = params || {}\n if (\n memberId == this.member.id && raised\n ? !this.capabilities.self?.raisehand?.on\n : !this.capabilities.member?.raisehand?.on\n ) {\n throw Error('Missing raisehand capability')\n }\n if (\n memberId == this.member.id && !raised\n ? !this.capabilities.self?.raisehand?.off\n : !this.capabilities.member?.raisehand?.off\n ) {\n throw Error('Missing lowerhand capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: raised ? 'call.raisehand' : 'call.lowerhand',\n memberId,\n })\n }\n\n public async setLayout(params: Rooms.SetLayoutParams) {\n if (!this.capabilities.setLayout) {\n throw Error('Missing setLayout capability')\n }\n const extraParams = {\n layout: params.name,\n positions: params.positions,\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.layout.set',\n extraParams,\n })\n }\n\n public async setInputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.microphoneVolume\n : !this.capabilities.member?.microphoneVolume\n ) {\n throw Error('Missing setInputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.volume.set',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setOutputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.speakerVolume\n : !this.capabilities.member?.speakerVolume\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'video.member.set_output_volume',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setInputSensitivity(params: MemberCommandWithValueParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities.self?.microphoneSensitivity\n : !this.capabilities.member?.microphoneSensitivity\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.sensitivity.set',\n memberId: params?.memberId,\n extraParams: {\n value: params?.value,\n },\n })\n }\n\n public async setPositions(params: Rooms.SetPositionsParams) {\n const positions = params.positions\n\n if (positions && !Object.keys(positions).length) {\n throw new Error('Invalid positions')\n }\n\n if (\n Object.keys(positions).some((p) =>\n ['self', `${this.memberId}`].includes(p)\n )\n ? !this.capabilities.self?.position\n : !this.capabilities.member?.position\n ) {\n throw Error('Missing setPositions capability')\n }\n\n const targets: {\n target: RequestMemberParams\n position: VideoPosition\n }[] = []\n\n Object.entries(positions).forEach(([key, value]) => {\n const targetMember =\n key === 'self'\n ? this.member\n : this.instanceMap.get<FabricRoomSessionMember>(key)\n\n if (targetMember) {\n targets.push({\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId!,\n node_id: targetMember.nodeId!,\n },\n position: value,\n })\n }\n })\n\n if (!targets.length) {\n throw new Error('Invalid targets')\n }\n\n return this.execute({\n method: 'call.member.position.set',\n params: {\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n targets,\n },\n })\n }\n\n public async lock() {\n if (!this.capabilities.lock?.on) {\n throw Error('Missing lock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.lock',\n })\n }\n\n public async unlock() {\n if (!this.capabilities.lock?.off) {\n throw Error('Missing unlock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unlock',\n })\n }\n}\n\nexport const isFabricRoomSession = (\n room: unknown\n): room is FabricRoomSession => {\n return room instanceof FabricRoomSessionConnection\n}\n\n/** @internal */\nexport const createFabricRoomSessionObject = (\n params: FabricRoomSessionOptions\n): FabricRoomSession => {\n const room = connect<\n FabricRoomSessionEvents,\n FabricRoomSessionConnection,\n FabricRoomSession\n >({\n store: params.store,\n Component: FabricRoomSessionConnection,\n })(params)\n\n return room\n}\n","import { FabricMemberUpdatedEventParams, getLogger } from '@signalwire/core'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoMemberUpdatedHandlerParams } from './utils/interfaces'\nimport { OVERLAY_PREFIX, SDK_PREFIX } from './utils/roomSession'\n\nexport type OverlayMap = Map<string, UserOverlay>\n\ninterface UserOverlayOptions {\n id: string\n}\n\nexport type OverlayStatus = 'hidden' | 'visible'\n\nexport class UserOverlay {\n public id: string\n private _domElement: HTMLDivElement | undefined\n private _status: OverlayStatus\n\n constructor(options: UserOverlayOptions) {\n this.id = options.id\n this._status = 'hidden'\n }\n\n get userId() {\n return this.id.split(OVERLAY_PREFIX)[1]\n }\n\n get domElement() {\n return this._domElement\n }\n\n set domElement(element: HTMLDivElement | undefined) {\n getLogger().debug('Setting domElement for ', this.id)\n this._domElement = element\n }\n\n get status() {\n return this._status\n }\n\n set status(status: OverlayStatus) {\n this._status = status\n }\n\n public hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to hide')\n }\n this.domElement.style.opacity = '0'\n this.status = 'hidden'\n }\n\n public show() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to show')\n }\n this.domElement.style.opacity = '1'\n this.status = 'visible'\n }\n}\n\ninterface LocalVideoOverlayOptions {\n id: string\n mirrorLocalVideoOverlay: boolean\n room: FabricRoomSession | VideoRoomSession\n}\n\nexport class LocalVideoOverlay extends UserOverlay {\n private _mirrored: boolean\n private _room: FabricRoomSession | VideoRoomSession\n\n constructor(options: LocalVideoOverlayOptions) {\n super(options)\n this._mirrored = options.mirrorLocalVideoOverlay\n this._room = options.room\n\n // Bind the handler to preserve context\n this.fabricMemberVideoMutedHandler =\n this.fabricMemberVideoMutedHandler.bind(this)\n this.videoMemberVideoMutedHandler =\n this.videoMemberVideoMutedHandler.bind(this)\n\n this.attachListeners()\n }\n\n get userId() {\n return this.id.split(SDK_PREFIX)[1]\n }\n\n get mirrored() {\n return this._mirrored\n }\n\n private attachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n /** @internal */\n public detachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n private memberVideoMutedHandler(memberId: string, videoMuted: boolean) {\n try {\n if (memberId === this._room.memberId) {\n videoMuted ? this.hide() : this.show()\n }\n } catch (error) {\n getLogger().error('Error handling videoMuted in LocalVideoOverlay', error)\n }\n }\n\n private fabricMemberVideoMutedHandler(\n params: FabricMemberUpdatedEventParams\n ) {\n this.memberVideoMutedHandler(\n params.member.member_id,\n params.member.video_muted\n )\n }\n\n private videoMemberVideoMutedHandler(\n params: VideoMemberUpdatedHandlerParams\n ) {\n this.memberVideoMutedHandler(params.member.id, params.member.video_muted)\n }\n\n public setMediaStream(stream: MediaStream) {\n if (!this.domElement) {\n return getLogger().warn('Missing local overlay to set the stream')\n }\n const localVideo = this.domElement.querySelector('video')\n if (localVideo) {\n localVideo.srcObject = stream\n }\n }\n\n public setMirror(mirror: boolean = this._mirrored) {\n if (!this.domElement || !this.domElement.firstChild) {\n return getLogger().warn('Missing local overlay to set the mirror')\n }\n const videoEl = this.domElement.firstChild as HTMLVideoElement\n videoEl.style.transform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n videoEl.style.webkitTransform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n this._mirrored = mirror\n }\n}\n","import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n debounce,\n uuid,\n} from '@signalwire/core'\nimport { OverlayMap, LocalVideoOverlay, UserOverlay } from '../VideoOverlays'\nimport { addOverlayPrefix } from './roomSession'\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 Remote 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\nconst _updateLayer = ({\n location,\n element,\n}: {\n location: InternalVideoLayoutLayer\n element: HTMLElement\n}) => {\n const { top, left, width, height } = _getLocationStyles(location)\n element.style.top = top\n element.style.left = left\n element.style.width = width\n element.style.height = height\n\n return element\n}\n\ninterface MakeLayoutChangedHandlerParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n mirrorLocalVideoOverlay?: boolean\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n memberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler = (params: MakeLayoutChangedHandlerParams) => {\n const {\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n } = params\n\n return async (params: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layout, memberId, localStream } = params\n const { layers = [] } = layout\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n\n // To handle the DOM updates in batch\n const fragment = document.createDocumentFragment()\n const currentOverlayIds = new Set()\n\n // Make local video overlay for the self member\n if (applyLocalVideoOverlay) {\n const location = layers.find(({ member_id }) => member_id === memberId)\n const overlayId = localVideoOverlay.id // LocalVideoOverlay ID is already unique\n let myLayerEl = localVideoOverlay.domElement\n currentOverlayIds.add(overlayId)\n\n if (!location) {\n getLogger().warn('Local video overlay location not found')\n localVideoOverlay.status = 'hidden'\n if (myLayerEl) {\n // Should we remove it from the DOM and the OverlayMap?\n localVideoOverlay.hide()\n }\n } else {\n if (myLayerEl) {\n getLogger().debug('Update local video overlay')\n _updateLayer({ location, element: myLayerEl })\n } else {\n getLogger().debug('Build local video overlay')\n myLayerEl = _buildLayer({ location })\n myLayerEl.id = overlayId\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.disablePictureInPicture = true\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n localVideo.style.pointerEvents = 'none'\n localVideo.style.objectFit = 'cover'\n\n myLayerEl.appendChild(localVideo)\n localVideoOverlay.domElement = myLayerEl\n\n // Mirror the local video if user has requested it\n if (mirrorLocalVideoOverlay) {\n localVideoOverlay.setMirror()\n }\n }\n\n // Show local overlay element only if the localStream has a valid video track\n const hasVideo =\n localStream\n .getVideoTracks()\n .filter((t) => t.enabled && t.readyState === 'live').length > 0\n if (hasVideo && location.visible) {\n localVideoOverlay.setMediaStream(localStream)\n localVideoOverlay.show()\n } else {\n localVideoOverlay.hide()\n }\n\n // Append the local video overlay to the fragment\n fragment.appendChild(myLayerEl)\n }\n }\n\n // Make overlay for all members (including a self member)\n if (applyMemberOverlay) {\n layers.forEach((location) => {\n const memberIdInLocation = location.member_id\n if (!memberIdInLocation) return\n\n const overlayId = addOverlayPrefix(memberIdInLocation)\n currentOverlayIds.add(overlayId)\n\n let overlay = overlayMap.get(overlayId)\n\n if (overlay && overlay.domElement) {\n // If the overlay already exists, modify its styles\n getLogger().debug('Update an overlay for ', memberIdInLocation)\n _updateLayer({ location, element: overlay.domElement })\n } else {\n // If the overlay doesn't exist, create a new overlay\n getLogger().debug('Build an overlay for ', memberIdInLocation)\n overlay = new UserOverlay({ id: overlayId })\n overlayMap.set(overlayId, overlay)\n\n const newLayer = _buildLayer({ location })\n newLayer.id = `${overlayId}-${uuid()}` // Unique DOM ID since user is allowed to build multiple video elements\n\n overlay.domElement = newLayer\n }\n\n if (!location.visible) {\n overlay.hide()\n } else {\n overlay.show()\n }\n\n // Append the overlay element to the fragment\n fragment.appendChild(overlay.domElement)\n })\n }\n\n // Remove overlays that are no longer present\n overlayMap.forEach((overlay, overlayId) => {\n if (!currentOverlayIds.has(overlayId)) {\n if (overlay.domElement && overlay.domElement.parentNode) {\n overlay.domElement.parentNode.removeChild(overlay.domElement)\n }\n overlayMap.delete(overlayId)\n }\n })\n\n // Replace mcuLayers content in batch with the fragment\n if (mcuLayers) {\n mcuLayers.innerHTML = ''\n mcuLayers.appendChild(fragment)\n }\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\n }\n }\n}\n\nconst cleanupElement = (rootElement: HTMLElement) => {\n while (rootElement.firstChild) {\n rootElement.removeChild(rootElement.firstChild)\n }\n}\n\nconst setVideoMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLVideoElement\n}) => {\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n}\n\nconst createRootElementResizeObserver = ({\n video,\n rootElement,\n paddingWrapper,\n}: {\n video: HTMLVideoElement\n rootElement: HTMLElement\n paddingWrapper: HTMLDivElement\n}) => {\n const computePaddingWrapperWidth = (width: number, height: number) => {\n const nativeVideoRatio = video.videoWidth / video.videoHeight\n const rootElementRatio = width / height\n if (nativeVideoRatio > rootElementRatio) {\n return '100%'\n } else {\n return `${height * nativeVideoRatio}px`\n }\n }\n\n // Debounce to avoid multiple calls\n const update = debounce(\n ({ width, height }: { width: number; height: number }) => {\n const maxPaddingBottom = (video.videoHeight / video.videoWidth) * 100\n if (paddingWrapper) {\n const pb = (height / width) * 100\n paddingWrapper.style.paddingBottom = `${\n pb > maxPaddingBottom ? maxPaddingBottom : pb\n }%`\n paddingWrapper.style.width = computePaddingWrapperWidth(width, height)\n }\n },\n 100\n )\n\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n // Firefox implements `contentBoxSize` as a single content rect, rather than an array\n const { inlineSize, blockSize } = Array.isArray(entry.contentBoxSize)\n ? entry.contentBoxSize[0]\n : entry.contentBoxSize\n update({ width: inlineSize, height: blockSize })\n } else if (entry.contentRect) {\n update({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n }\n })\n })\n\n /**\n * When the intrinsic dimensions of the video changes, the root element resize may or may not trigger.\n * For example; remote stream from the server changes dimensions from 16/9 (Landscape) to 9/16 (Portrait) mode.\n * For this reason we need to listen for the 'resize' event on the video element.\n */\n const onVideoResize = () => {\n const width = rootElement.clientWidth\n const height = rootElement.clientHeight\n update({ width, height })\n }\n\n return {\n start: () => {\n observer.observe(rootElement)\n video.addEventListener('resize', onVideoResize)\n },\n stop: () => {\n observer.disconnect()\n video.removeEventListener('resize', onVideoResize)\n },\n }\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n createRootElementResizeObserver,\n LocalVideoOverlay,\n}\n","import {\n FabricLayoutChangedEventParams,\n VideoLayoutChangedEventParams,\n getLogger,\n uuid,\n} from '@signalwire/core'\nimport {\n buildVideo,\n cleanupElement,\n createRootElementResizeObserver,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n} from './utils/videoElement'\nimport { addSDKPrefix } from './utils/roomSession'\nimport { OverlayMap, LocalVideoOverlay } from './VideoOverlays'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\n\nexport interface BuildVideoElementParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n mirrorLocalVideoOverlay?: boolean\n room: FabricRoomSession | VideoRoomSession\n rootElement?: HTMLElement\n}\n\nexport interface BuildVideoElementReturnType {\n element: HTMLElement\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n unsubscribe(): void\n}\n\nexport const buildVideoElement = async (\n params: BuildVideoElementParams\n): Promise<BuildVideoElementReturnType> => {\n try {\n const {\n room,\n rootElement: element,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n } = params\n\n let hasVideoTrack = false\n const overlayMap: OverlayMap = new Map()\n const id = uuid()\n\n let rootElement: HTMLElement\n if (element) {\n rootElement = element\n } else {\n rootElement = document.createElement('div')\n rootElement.id = `rootElement-${id}`\n }\n\n /**\n * We used this `LocalVideoOverlay` class to interact with the localVideo\n * overlay DOM element in here and in the `makeLayoutChangedHandler`.\n */\n const overlayId = addSDKPrefix(id)\n const localVideoOverlay = new LocalVideoOverlay({\n id: overlayId,\n mirrorLocalVideoOverlay,\n room,\n })\n if (applyLocalVideoOverlay) {\n overlayMap.set(overlayId, localVideoOverlay)\n }\n\n const makeLayout = makeLayoutChangedHandler({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n })\n\n const processLayoutChanged = (params: any) => {\n // @ts-expect-error\n if (room.peer?.hasVideoSender && room.localStream) {\n makeLayout({\n layout: params.layout,\n localStream: room.localStream,\n memberId: room.memberId,\n })\n } else {\n localVideoOverlay.hide()\n }\n }\n\n const layoutChangedHandler = (\n params: FabricLayoutChangedEventParams | VideoLayoutChangedEventParams\n ) => {\n getLogger().debug('Received layout.changed - videoTrack', hasVideoTrack)\n if (hasVideoTrack) {\n processLayoutChanged(params)\n return\n }\n }\n\n const processVideoTrack = async (track: MediaStreamTrack) => {\n hasVideoTrack = true\n\n await videoElementSetup({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n rootElement,\n track,\n })\n\n const roomCurrentLayoutEvent = room.currentLayoutEvent\n // If the `layout.changed` has already been received, process the layout\n if (roomCurrentLayoutEvent) {\n processLayoutChanged(roomCurrentLayoutEvent)\n }\n }\n\n // If the remote video already exist, inject the remote stream to the video element\n // @ts-expect-error\n const videoTrack = room.peer?.remoteVideoTrack as MediaStreamTrack | null\n if (videoTrack) {\n await processVideoTrack(videoTrack)\n }\n\n // Handle the RTCPeer `track` event\n const trackHandler = async function (event: RTCTrackEvent) {\n if (event.track.kind === 'video') {\n await processVideoTrack(event.track)\n }\n }\n\n const unsubscribe = () => {\n cleanupElement(rootElement)\n overlayMap.clear() // Use \"delete\" rather than \"clear\" if we want to update the reference\n room.overlayMap = overlayMap\n if (isFabricRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n }\n localVideoOverlay.detachListeners()\n }\n\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the videoEl with the new track.\n */\n if (isFabricRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n }\n\n /**\n * The room object is only being used to listen for events.\n * The \"buildVideoElement\" function does not directly manipulate the room object in order to maintain immutability.\n * Currently, we are overriding the following room properties in case the user calls \"buildVideoElement\" more than once.\n * However, this can be moved out of here easily if we prefer not to override.\n */\n room.overlayMap = overlayMap\n room.localVideoOverlay = localVideoOverlay\n\n return { element: rootElement, overlayMap, localVideoOverlay, unsubscribe }\n } catch (error) {\n getLogger().error('Unable to build the video element')\n throw error\n }\n}\n\ninterface VideoElementSetupWorkerParams {\n rootElement: HTMLElement\n track: MediaStreamTrack\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n}\n\nconst videoElementSetup = async (options: VideoElementSetupWorkerParams) => {\n try {\n const { applyLocalVideoOverlay, applyMemberOverlay, track, rootElement } =\n options\n\n // Create a video element\n const videoElement = buildVideo()\n\n setVideoMediaTrack({ element: videoElement, track })\n\n videoElement.style.width = '100%'\n videoElement.style.maxHeight = '100%'\n\n if (rootElement.querySelector('.mcuContent')) {\n getLogger().debug('MCU Content already there')\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(videoElement)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.classList.add('paddingWrapper')\n paddingWrapper.style.paddingBottom = '56.25%' // (9 / 16) * 100\n paddingWrapper.style.position = 'relative'\n paddingWrapper.style.width = '100%'\n paddingWrapper.appendChild(mcuWrapper)\n\n let layersWrapper: HTMLDivElement | null = null\n\n // If the both flags are false, no need to create the MCU\n if (applyLocalVideoOverlay || applyMemberOverlay) {\n layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n }\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.classList.add('mcuContent')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.height = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.style.display = 'flex'\n relativeWrapper.style.alignItems = 'center'\n relativeWrapper.style.justifyContent = 'center'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.width = '100%'\n rootElement.style.height = '100%'\n rootElement.appendChild(relativeWrapper)\n\n getLogger().debug('MCU readyState 1 >>', videoElement.readyState)\n if (videoElement.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element: videoElement })\n }\n getLogger().debug('MCU is ready..')\n\n /**\n * Listen for the rootElement and the videoElement size changes and update the paddingWrapper.\n * The ResizeObserver and the video \"resize\" event make sure:\n * - The video should always maintain the aspect ratio.\n * - The video should not overflow the user passed rootElement.\n * - The video should not be cropped.\n */\n const rootElementResizeObserver = createRootElementResizeObserver({\n rootElement,\n video: videoElement,\n paddingWrapper,\n })\n rootElementResizeObserver.start()\n\n track.addEventListener('ended', () => {\n if (rootElementResizeObserver) {\n rootElementResizeObserver.stop()\n }\n })\n\n if (layersWrapper) {\n layersWrapper.style.display = 'block'\n }\n } catch (error) {\n getLogger().error('Handle video track error', error)\n }\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 { makeAudioElementSaga } from './features/mediaElements/mediaElementsSagas'\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 './video/RoomSession'\nimport { buildVideoElement } from './buildVideoElement'\nimport {\n createVideoRoomSessionObject,\n VideoRoomSessionConnection,\n} from './video/VideoRoomSession'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI['rooms']\n chat: ClientAPI['chat']\n pubSub: ClientAPI['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 apply an overlay on top of each member. Default: `true`. */\n applyMemberOverlay?: boolean\n /** Whether to mirror the local video overlay. Default: `false`. */\n mirrorLocalVideoOverlay?: boolean\n /** Whether to stop the camera when the member is muted. Default: `true`. */\n stopCameraWhileMuted?: boolean\n /** Whether to stop the microphone when the member is muted. Default: `true`. */\n stopMicrophoneWhileMuted?: boolean\n /** Local media stream to override the local video and audio stream tracks */\n localStream?: MediaStream\n}\n\nexport class ClientAPI 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 applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n // TODO: This might not be needed here. We can initiate these sagas in the BaseRoomSession constructor.\n const customSagas: Array<CustomSaga<VideoRoomSessionConnection>> = []\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 const room = createVideoRoomSessionObject({\n ...options,\n store: this.store,\n customSagas,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\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.on('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\n })\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audio_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'audio_muted' in member) {\n member.audio_muted\n ? room.stopOutboundAudio()\n : room.restoreOutboundAudio()\n }\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n })\n }\n\n /**\n * Stop and Restore outbound video on video_muted event\n */\n if (stopCameraWhileMuted) {\n room.on('member.updated.video_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted\n ? room.stopOutboundVideo()\n : room.restoreOutboundVideo()\n }\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n })\n }\n\n return room\n },\n }\n }\n\n get chat() {\n if (!this._chat) {\n this._chat = ChatNamespace.createBaseChatObject<ChatClient>({\n store: this.store,\n })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n","import { SWCloseEvent as CoreCloseEvent } from '@signalwire/core'\n\nconst SwCloseEvent =\n typeof CloseEvent === 'function' ? CloseEvent : CoreCloseEvent\n\nexport { SwCloseEvent }\n","import jwtDecode from 'jwt-decode'\nimport {\n BaseJWTSession,\n getLogger,\n SessionOptions,\n SwAuthorizationState,\n type SWCloseEvent,\n} from '@signalwire/core'\nimport { getStorage, sessionStorageManager } from './utils/storage'\nimport { SwCloseEvent } from './utils/CloseEvent'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public CloseEventConstructor = SwCloseEvent\n public agent = process.env.SDK_PKG_AGENT!\n\n private tokenTyp: string\n\n constructor(public options: SessionOptions) {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<{ ch?: string; typ: string }>(options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n this.tokenTyp = decodedJwt.typ ?? 'VRT'\n }\n\n get allowReattach() {\n // @ts-expect-error\n return this.options?.reattach !== false && (this.isVRT() || this.isSAT())\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowReattach) {\n return ''\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Search protocol for', protocolKey)\n return getStorage()?.getItem(protocolKey) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowReattach) {\n return\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Persist protocol', protocolKey, this.relayProtocol)\n getStorage()?.setItem(protocolKey, this.relayProtocol)\n }\n }\n\n protected override async retrieveSwAuthorizationState() {\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n return getStorage()?.getItem(authStateKey) ?? ''\n }\n return ''\n }\n\n protected override async persistSwAuthorizationState(\n state: SwAuthorizationState\n ) {\n if (!this.allowReattach) {\n return\n }\n\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n this.logger.trace('Persist auth state', authStateKey, state)\n getStorage()?.setItem(authStateKey, state)\n }\n }\n\n protected override _onSocketClose(event: SWCloseEvent) {\n if (this.status === 'unknown' || this.status === 'disconnected') {\n const { protocolKey, authStateKey, callIdKey } = sessionStorageManager(\n this.options.token\n )\n this.logger.debug('Cleaning up storage')\n if (protocolKey) {\n this.logger.debug('Remove protocolKey', protocolKey)\n getStorage()?.removeItem(protocolKey)\n }\n if (authStateKey) {\n this.logger.debug('Remove authStateKey', authStateKey)\n getStorage()?.removeItem(authStateKey)\n }\n if (callIdKey) {\n this.logger.debug('Remove callIdKey', callIdKey)\n getStorage()?.removeItem(callIdKey)\n }\n }\n\n super._onSocketClose(event)\n }\n\n private isVRT() {\n return this.tokenTyp === 'VRT'\n }\n\n private isSAT() {\n return this.tokenTyp === 'SAT'\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<ClientEvents, ClientAPI, Client<RoomSessionType>>({\n store,\n Component: ClientAPI,\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/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'getAllowedChannels',\n 'setMemberState',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { Chat } from '@signalwire/js'\n *\n * const chatClient = new Chat.Client({\n * token: '<your_chat_token>', // get this from the REST APIs\n * })\n *\n * await chatClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * chatClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await chatClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a chat\n * Client object.\n */\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n","import type {\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends PubSubNamespace.BasePubSubApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'getAllowedChannels',\n 'subscribe',\n 'publish',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n","import { PubSub } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\n\nexport {\n PubSubMessage,\n PagingCursor\n}\n","import { AuthError, HttpError } from '@signalwire/core'\n\ninterface InternalHttpResponse<T> extends Response {\n parsedBody?: T\n}\n\nasync function http<T>(\n input: string,\n init: RequestInit | undefined\n): Promise<InternalHttpResponse<T>> {\n const response: InternalHttpResponse<T> = await fetch(input, init)\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError(response.status, 'Unauthorized')\n }\n\n let errorResponse\n try {\n errorResponse = await response.json()\n } catch (e) {}\n\n const errorMessage = errorResponse?.errors\n ? JSON.stringify(errorResponse.errors)\n : 'Not Found'\n\n throw new HttpError(response.status, errorMessage, errorResponse)\n }\n\n try {\n // might throw if body is empty\n response.parsedBody = await response.json()\n } catch (e) {}\n\n return response\n}\n\ninterface CreateHttpClientOptions extends RequestInit {\n baseUrl: string\n /**\n * Timeout in milliseconds\n */\n timeout?: number\n}\n\ninterface HttpClientRequestInit extends Omit<RequestInit, 'body'> {\n body?: Record<string, unknown>\n searchParams?: Record<string, any>\n}\n\nexport type CreateHttpClient = ReturnType<typeof createHttpClient>\n\nexport const createHttpClient = (\n { baseUrl, timeout = 30000, ...globalOptions }: CreateHttpClientOptions,\n fetcher = http\n) => {\n const apiClient = async <T>(\n path: string,\n options?: HttpClientRequestInit\n ): Promise<{ body: T }> => {\n const headers = {\n ...(options?.body ? { 'Content-Type': 'application/json' } : {}),\n ...globalOptions.headers,\n ...options?.headers,\n }\n\n const reqInit = getRequestInit({\n ...globalOptions,\n ...options,\n headers,\n })\n // reqInit.mode = 'no-cors'\n // reqInit.credentials = 'include'\n\n let timerId\n if (timeout) {\n const controller = new AbortController()\n const signal = controller.signal\n\n reqInit.signal = signal\n\n timerId = setTimeout(() => {\n controller.abort()\n }, timeout)\n }\n\n try {\n const response = await fetcher<T>(\n getUrl({\n path,\n baseUrl,\n searchParams: options?.searchParams,\n }),\n reqInit\n )\n\n return { body: response.parsedBody as T }\n } catch (e) {\n throw e\n } finally {\n timerId && clearTimeout(timerId)\n }\n }\n\n return apiClient\n}\n\nconst getBody = (body: unknown) => {\n return typeof body === 'string' ? body : JSON.stringify(body)\n}\n\nconst getRequestInit = (options: any): RequestInit => {\n return Object.entries(options).reduce((reducer, [key, value]) => {\n if (key === 'body') {\n return {\n ...reducer,\n body: getBody(value),\n }\n } else if (value != undefined) {\n return {\n ...reducer,\n [key]: value,\n }\n }\n\n return reducer\n }, {} as RequestInit)\n}\n\nconst getUrl = ({\n path,\n baseUrl,\n searchParams,\n}: {\n baseUrl: string\n path: string\n searchParams?: Record<string, any>\n}) => {\n const url = new URL(path, baseUrl)\n\n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value != undefined) {\n url.searchParams.append(key, value)\n }\n })\n }\n return url.toString()\n}\n","import { PaginatedResponse } from '../fabric/interfaces'\nimport { CreateHttpClient } from '../fabric/createHttpClient'\n\nexport function buildPaginatedResult<T>(\n body: PaginatedResponse<T>,\n client: CreateHttpClient\n) {\n const anotherPage = async (url?: string) => {\n if (!url) return Promise.resolve(undefined)\n const { body } = await client<PaginatedResponse<T>>(url)\n return buildPaginatedResult<T>(body, client)\n }\n\n return {\n data: body.data,\n self: async () => {\n const { self } = body.links\n return anotherPage(self)\n },\n nextPage: async () => {\n const { next } = body.links\n return anotherPage(next)\n },\n prevPage: async () => {\n const { prev } = body.links\n return anotherPage(prev)\n },\n firstPage: async () => {\n const { first } = body.links\n return anotherPage(first)\n },\n hasNext: Boolean(body.links.next),\n hasPrev: Boolean(body.links.prev),\n }\n}\n","/**\n * Constructs a URL with query parameters.\n *\n * @param path The base path of the URL.\n * @param queryParams An instance of URLSearchParams containing all query parameters.\n * @returns The constructed URL with query parameters.\n */\nexport function makeQueryParamsUrls(\n path: string,\n queryParams: URLSearchParams\n): string {\n const queryString = queryParams.toString()\n return queryString ? `${path}?${queryString}` : path\n}\n","import jwtDecode from 'jwt-decode'\nimport { getLogger, HttpError, type UserOptions } from '@signalwire/core'\nimport type {\n GetAddressResponse,\n GetAddressesParams,\n RegisterDeviceParams,\n UnregisterDeviceParams,\n RegisterDeviceResponse,\n GetAddressParams,\n GetAddressResult,\n GetAddressesResponse,\n GetAddressesResult,\n RegisterDeviceResult,\n GetSubscriberInfoResponse,\n GetSubscriberInfoResult,\n} from './interfaces'\nimport { CreateHttpClient, createHttpClient } from './createHttpClient'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport {\n isGetAddressByIdParams,\n isGetAddressByNameParams,\n isGetAddressesResponse,\n} from './utils/typeGuard'\nimport { HTTPClientContract } from './interfaces/httpClient'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\n// TODO: extends from a Base class to share from core\nexport class HTTPClient implements HTTPClientContract {\n private httpClient: CreateHttpClient\n\n constructor(public options: UserOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n })\n }\n\n get fetch(): CreateHttpClient {\n return this.httpClient\n }\n\n get httpHost() {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<JWTHeader>(this.options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n // Shouldn't this be other way around?\n const host = this.options.host || decodedJwt?.ch\n if (!host) {\n return 'fabric.signalwire.com'\n }\n return `fabric.${host.split('.').splice(1).join('.')}`\n }\n\n public async getAddress(params: GetAddressParams): Promise<GetAddressResult> {\n let path = '/api/fabric/addresses'\n if (isGetAddressByNameParams(params)) {\n path = `${path}?name=${params.name}`\n } else if (isGetAddressByIdParams(params)) {\n path = `${path}/${params.id}`\n }\n\n const { body } = await this.httpClient<\n GetAddressResponse | GetAddressesResponse\n >(path)\n if (isGetAddressesResponse(body)) {\n // FIXME until the server handles a index lookup by name we need to handle it as a search result\n if (!body.data[0]) throw new HttpError(404, 'Not Found')\n return body.data[0]\n }\n return body\n }\n\n public async getAddresses(\n params?: GetAddressesParams\n ): Promise<GetAddressesResult> {\n const { type, displayName, pageSize, sortBy, sortOrder } = params || {}\n\n let path = '/api/fabric/addresses'\n\n const queryParams = new URLSearchParams()\n if (type) {\n queryParams.append('type', type)\n }\n if (displayName) {\n queryParams.append('display_name', displayName)\n }\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n if (sortBy) {\n queryParams.append('sort_by', sortBy)\n }\n\n if (sortOrder) {\n queryParams.append('sort_order', sortOrder)\n }\n\n const queryUrl = makeQueryParamsUrls(path, queryParams)\n getLogger().debug(`[getAddresses] query URL ${queryUrl}`)\n const { body } = await this.httpClient<GetAddressesResponse>(queryUrl)\n\n return buildPaginatedResult(body, this.httpClient)\n }\n\n public async registerDevice(\n params: RegisterDeviceParams\n ): Promise<RegisterDeviceResult> {\n const { deviceType, deviceToken } = params\n\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<RegisterDeviceResponse>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n public async unregisterDevice(params: UnregisterDeviceParams) {\n const { id } = params\n\n const path = `/subscriber/devices/${id}` as const\n await this.httpClient<void>(path, {\n method: 'DELETE',\n })\n }\n\n public async getSubscriberInfo(): Promise<GetSubscriberInfoResult> {\n let path = '/api/fabric/subscriber/info'\n\n const { body } = await this.httpClient<GetSubscriberInfoResponse>(path)\n\n return body\n }\n}\n","import {\n GetAddressParams,\n GetAddressByNameParams,\n GetAddressByIdParams,\n GetAddressResponse,\n GetAddressesResponse,\n} from '../interfaces'\n\nexport const isGetAddressByNameParams = (\n obj: GetAddressParams\n): obj is GetAddressByNameParams => {\n return obj && 'name' in obj\n}\n\nexport const isGetAddressByIdParams = (\n obj: GetAddressParams\n): obj is GetAddressByIdParams => {\n return obj && 'id' in obj\n}\n\nexport const isGetAddressResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressResponse => {\n return obj && 'id' in obj && 'name' in obj\n}\n\nexport const isGetAddressesResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressesResponse => {\n return obj && 'data' in obj\n}\n","import { Conversation } from './Conversation'\nimport {\n ConversationAPIGetMessagesParams,\n ConversationAPISendMessageParams,\n ConversationContract,\n ConversationResponse,\n} from './interfaces'\n\nexport class ConversationAPI implements ConversationContract {\n constructor(\n private conversation: Conversation,\n private payload: ConversationResponse\n ) {}\n\n get id() {\n return this.payload.id\n }\n\n get addressId() {\n return this.payload.address_id\n }\n\n get createdAt() {\n return this.payload.created_at\n }\n\n get lastMessageAt() {\n return this.payload.last_message_at\n }\n\n get metadata() {\n return this.payload.metadata\n }\n\n get name() {\n return this.payload.name\n }\n\n sendMessage(params: ConversationAPISendMessageParams) {\n return this.conversation.sendMessage({\n addressId: this.id,\n text: params.text,\n })\n }\n\n getMessages(params?: ConversationAPIGetMessagesParams) {\n return this.conversation.getConversationMessages({\n addressId: this.id,\n ...params,\n })\n }\n}\n","import { type ConversationEventParams } from '@signalwire/core'\nimport { HTTPClient } from './HTTPClient'\nimport { WSClient } from './WSClient'\nimport type {\n GetConversationsResponse,\n GetMessagesParams,\n GetConversationsParams,\n GetConversationMessagesParams,\n GetConversationMessagesResponse,\n ConversationMessage,\n SendConversationMessageParams,\n SendConversationMessageResponse,\n ConversationChatMessage,\n GetMessagesResult,\n GetConversationMessagesResult,\n SendConversationMessageResult,\n GetConversationChatMessageParams,\n GetConversationsResult,\n CoversationSubscribeCallback,\n ConversationChatMessagesSubscribeParams,\n ConversationChatMessagesSubscribeResult,\n GetConversationChatMessageResult,\n JoinConversationParams,\n JoinConversationResponse,\n JoinConversationResult,\n CoversationSubscribeResult,\n} from './interfaces'\nimport { conversationWorker } from './workers'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport { ConversationAPI } from './ConversationAPI'\n\nconst DEFAULT_CHAT_MESSAGES_PAGE_SIZE = 10\n\ninterface ConversationOptions {\n httpClient: HTTPClient\n wsClient: WSClient\n}\n\nexport class Conversation {\n private httpClient: HTTPClient\n private wsClient: WSClient\n private callbacks = new Set<CoversationSubscribeCallback>()\n private chatSubscriptions: Record<string, Set<CoversationSubscribeCallback>> =\n {}\n\n constructor(options: ConversationOptions) {\n this.httpClient = options.httpClient\n this.wsClient = options.wsClient\n\n this.wsClient.runWorker('conversationWorker', {\n worker: conversationWorker,\n initialState: {\n conversation: this,\n },\n })\n }\n\n /** @internal */\n handleEvent(event: ConversationEventParams) {\n if (event.subtype === 'chat') {\n const chatCallbacks = this.chatSubscriptions[event.conversation_id]\n if (chatCallbacks?.size) {\n chatCallbacks.forEach((cb) => cb(event))\n }\n }\n\n if (this.callbacks.size) {\n this.callbacks.forEach((callback) => {\n callback(event)\n })\n }\n }\n\n public async sendMessage(\n params: SendConversationMessageParams\n ): Promise<SendConversationMessageResult> {\n try {\n const { addressId, text } = params\n const path = '/api/fabric/messages'\n const { body } =\n await this.httpClient.fetch<SendConversationMessageResponse>(path, {\n method: 'POST',\n body: {\n conversation_id: addressId,\n text,\n },\n })\n return body\n } catch (error) {\n throw new Error('Error sending message to conversation!', error)\n }\n }\n\n public async getConversations(\n params?: GetConversationsParams\n ): Promise<GetConversationsResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/conversations'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } = await this.httpClient.fetch<GetConversationsResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n const self = this\n const data = body.data.map(\n (conversation) => new ConversationAPI(self, conversation)\n )\n return buildPaginatedResult({ ...body, data }, this.httpClient.fetch)\n } catch (error) {\n throw new Error('Error fetching the conversation history!', error)\n }\n }\n\n public async getMessages(\n params?: GetMessagesParams\n ): Promise<GetMessagesResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/messages'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getConversationMessages(\n params: GetConversationMessagesParams\n ): Promise<GetConversationMessagesResult> {\n try {\n const { addressId, pageSize } = params || {}\n\n const path = `/api/fabric/conversations/${addressId}/messages`\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getChatMessages(\n params: GetConversationChatMessageParams\n ): Promise<GetConversationChatMessageResult> {\n const { addressId, pageSize = DEFAULT_CHAT_MESSAGES_PAGE_SIZE } = params\n\n const fetchChatMessagesPage = async (\n fetcherFn?: () => Promise<GetConversationChatMessageResult | undefined>,\n cached: ConversationMessage[] = [],\n isDirectionNext = true\n ): Promise<GetConversationChatMessageResult> => {\n const chatMessages = [...cached]\n const isValid = (item: ConversationMessage) =>\n item.conversation_id === addressId && item.subtype === 'chat'\n\n let conversationMessages: GetConversationChatMessageResult | undefined\n conversationMessages = await fetcherFn?.()\n let chatOnlyMessages = conversationMessages?.data.filter(isValid) ?? []\n let remaining = pageSize - chatMessages.length\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n\n while (chatMessages.length < pageSize && conversationMessages?.hasNext) {\n conversationMessages = await (isDirectionNext\n ? conversationMessages?.nextPage()\n : conversationMessages?.prevPage())\n if (!conversationMessages || !conversationMessages.data.length) {\n //over caution in case of a server error, to prevent an infinite loop.\n break\n }\n\n remaining = pageSize - chatMessages.length\n chatOnlyMessages = conversationMessages.data.filter(isValid)\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n }\n\n let missingReturns: ConversationMessage[] = []\n if (remaining < chatOnlyMessages.length) {\n missingReturns = chatOnlyMessages.slice(remaining)\n }\n\n return {\n data: chatMessages as ConversationChatMessage[],\n hasNext: !!conversationMessages?.hasNext || !!cached.length,\n hasPrev: !!conversationMessages?.hasPrev,\n\n nextPage: () =>\n fetchChatMessagesPage(conversationMessages?.nextPage, missingReturns),\n prevPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.prevPage,\n missingReturns,\n false\n ),\n self: () =>\n fetchChatMessagesPage(conversationMessages?.self, missingReturns),\n firstPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.firstPage,\n missingReturns\n ),\n }\n }\n\n return fetchChatMessagesPage(\n () =>\n this.getConversationMessages({\n addressId,\n pageSize,\n }) as Promise<GetConversationChatMessageResult>\n )\n }\n\n public async subscribe(\n callback: CoversationSubscribeCallback\n ): Promise<CoversationSubscribeResult> {\n this.callbacks.add(callback)\n\n return {\n unsubscribe: () => this.callbacks.delete(callback),\n }\n }\n\n public async subscribeChatMessages(\n params: ConversationChatMessagesSubscribeParams\n ): Promise<ConversationChatMessagesSubscribeResult> {\n const { addressId, onMessage } = params\n\n if (!(addressId in this.chatSubscriptions)) {\n this.chatSubscriptions[addressId] = new Set()\n }\n\n this.chatSubscriptions[addressId].add(onMessage)\n return {\n unsubscribe: () => this.chatSubscriptions[addressId].delete(onMessage),\n }\n }\n\n public async joinConversation(\n params: JoinConversationParams\n ): Promise<JoinConversationResult> {\n try {\n const { addressId } = params\n const path = '/api/fabric/conversations/join'\n const { body } = await this.httpClient.fetch<JoinConversationResponse>(\n path,\n {\n method: 'POST',\n body: {\n conversation_id: addressId,\n },\n }\n )\n return body\n } catch (error) {\n throw new Error('Error joining a conversation!', error)\n }\n }\n}\n","import { FabricRoomSession } from './FabricRoomSession'\nimport {\n CallParams,\n IncomingCallHandlers,\n IncomingCallNotification,\n IncomingInvite,\n IncomingInviteWithSource,\n} from './interfaces'\nimport { WSClient } from './WSClient'\n\ninterface IncomingCallManagerOptions {\n client: WSClient\n buildInboundCall: WSClient['buildInboundCall']\n executeVertoBye: WSClient['executeVertoBye']\n}\n\nexport class IncomingCallManager {\n private _client: WSClient\n private _pendingInvites: Record<string, IncomingInvite> = {}\n private _handlers: IncomingCallHandlers = {}\n\n constructor(private options: IncomingCallManagerOptions) {\n this._client = options.client\n }\n\n private _buildNotification(invite: IncomingInvite): IncomingCallNotification {\n const accept = async (params: CallParams) => {\n return new Promise<FabricRoomSession>((resolve, reject) => {\n delete this._pendingInvites[invite.callID]\n try {\n const call = this.options.buildInboundCall(invite, params)\n call.answer()\n\n resolve(call)\n } catch (e) {\n reject(e)\n }\n })\n }\n\n const reject = () => {\n delete this._pendingInvites[invite.callID]\n return this.options.executeVertoBye(invite.callID, invite.nodeId)\n }\n\n return {\n invite: {\n details: invite,\n accept: (params) => accept(params),\n reject: () => reject(),\n },\n }\n }\n\n setNotificationHandlers(handlers: IncomingCallHandlers) {\n this._handlers.all = handlers.all\n if (\n (handlers.pushNotification &&\n this._handlers.all != handlers.pushNotification) ||\n !handlers.pushNotification\n ) {\n this._handlers.pushNotification = handlers.pushNotification\n }\n if (\n (handlers.websocket && this._handlers.all != handlers.websocket) ||\n !handlers.websocket\n ) {\n this._handlers.websocket = handlers.websocket\n }\n }\n\n handleIncomingInvite(incomingInvite: IncomingInviteWithSource) {\n if (incomingInvite.callID in this._pendingInvites) {\n this._client.logger.debug(\n `skiping nottification for pending invite to callID: ${incomingInvite.callID}`\n )\n return\n }\n this._pendingInvites[incomingInvite.callID] = incomingInvite\n\n if (!(this._handlers.all || this._handlers[incomingInvite.source])) {\n this._client.logger.warn('Skiping nottification due to no listeners')\n return\n }\n\n const notification = this._buildNotification(incomingInvite)\n\n this._handlers.all?.(notification)\n const handler = this._handlers[incomingInvite.source]\n handler?.(notification)\n }\n}\n","import {\n RPCReauthenticate,\n RPCReauthenticateParams,\n SATAuthorization,\n SessionOptions,\n UNIFIED_CONNECT_VERSION,\n} from '@signalwire/core'\nimport { JWTSession } from '../JWTSession'\n\n/**\n * SAT Session is for the Call Fabric SDK\n */\nexport class SATSession extends JWTSession {\n public connectVersion = UNIFIED_CONNECT_VERSION\n\n constructor(public options: SessionOptions) {\n super(options)\n }\n\n override get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult\n return (authorization as SATAuthorization).jti\n }\n return undefined\n }\n\n override async _checkTokenExpiration() {\n /**\n * noop\n *\n * The Call Fabric SDK does not attach any timer and\n * does not emit any events to inform the user about the token expiry.\n */\n }\n\n /**\n * Reauthenticate with the SignalWire Network using a newer SAT.\n * If the session has expired, this will reconnect it.\n * @return Promise<void>\n */\n override async reauthenticate() {\n this.logger.debug('Session Reauthenticate', {\n ready: this.ready,\n expired: this.expired,\n })\n if (!this.ready || this.expired) {\n return this.connect()\n }\n\n const params: RPCReauthenticateParams = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token,\n }\n\n try {\n const reauthResponse = await this.execute(RPCReauthenticate(params))\n\n this._rpcConnectResult = {\n ...this._rpcConnectResult,\n ...reauthResponse,\n }\n } catch (error) {\n throw error\n }\n }\n}\n","import {\n actions,\n BaseClient,\n CallJoinedEventParams,\n ClientEvents,\n VertoBye,\n VertoSubscribe,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { MakeRoomOptions } from '../video'\nimport { createFabricRoomSessionObject } from './FabricRoomSession'\nimport { buildVideoElement } from '../buildVideoElement'\nimport {\n CallParams,\n DialParams,\n FabricRoomSession,\n IncomingInvite,\n OnlineParams,\n HandlePushNotificationParams,\n WSClientOptions,\n HandlePushNotificationResult,\n} from './interfaces'\nimport { IncomingCallManager } from './IncomingCallManager'\nimport { wsClientWorker } from './workers'\nimport { createWSClient } from './createWSClient'\nimport { WSClientContract } from './interfaces/wsClient'\n\nexport class WSClient\n extends BaseClient<ClientEvents>\n implements WSClientContract\n{\n private _incomingCallManager: IncomingCallManager\n private _disconnected: boolean = false\n\n constructor(private wsClientOptions: WSClientOptions) {\n const client = createWSClient(wsClientOptions)\n super(client)\n\n this._incomingCallManager = new IncomingCallManager({\n client: this,\n buildInboundCall: this.buildInboundCall.bind(this),\n executeVertoBye: this.executeVertoBye.bind(this),\n })\n\n this.runWorker('wsClientWorker', {\n worker: wsClientWorker,\n initialState: {\n handleIncomingInvite: (invite: IncomingInvite) => {\n this._incomingCallManager.handleIncomingInvite({\n source: 'websocket',\n ...invite,\n })\n },\n },\n })\n }\n\n private makeFabricObject(makeRoomOptions: MakeRoomOptions) {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n mirrorLocalVideoOverlay = true,\n ...options\n } = makeRoomOptions\n\n const room = createFabricRoomSessionObject({\n ...options,\n store: this.store,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\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 const joinMutedHandler = (\n params: CallJoinedEventParams | VideoRoomSubscribedEventParams\n ) => {\n const member = params.room_session.members?.find(\n // @ts-expect-error FIXME:\n (m) => m.id === room.memberId || m.member_id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\n }\n\n room.on('room.subscribed', joinMutedHandler)\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audioMuted', ({ member }) => {\n try {\n if (member.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.videoMuted', ({ member }) => {\n try {\n if (member.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 private buildOutboundCall(params: DialParams & { attach?: boolean }) {\n const [pathname, query] = params.to.split('?')\n if (!pathname) {\n throw new Error('Invalid destination address')\n }\n\n let video = false\n let negotiateVideo = false\n\n const queryParams = new URLSearchParams(query)\n const channel = queryParams.get('channel')\n if (channel === 'video') {\n video = true\n negotiateVideo = true\n }\n\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? video,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? negotiateVideo,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n destinationNumber: pathname,\n nodeId: params.nodeId,\n attach: params.attach ?? false,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private buildInboundCall(payload: IncomingInvite, params: CallParams) {\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? true,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? true,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n nodeId: payload.nodeId,\n remoteSdp: payload.sdp,\n prevCallId: payload.callID,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private async executeVertoBye(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n message: VertoBye({\n cause: 'USER_BUSY',\n causeCode: '17',\n dialogParams: { callID: callId },\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n private async executeVertoSubscribe(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n subscribe: [],\n message: VertoSubscribe({\n sessid: callId,\n eventChannel: [],\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n public override disconnect() {\n return new Promise<void>((resolve, _reject) => {\n if (this._disconnected) {\n resolve()\n }\n\n this.session.once('session.disconnected', () => {\n this.destroy()\n resolve()\n this._disconnected = true\n })\n\n super.disconnect()\n })\n }\n\n public async dial(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall(params)\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and dial a call', error)\n reject(error)\n }\n })\n }\n\n public async reattach(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall({ ...params, attach: true })\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and reattach a call', error)\n reject(error)\n }\n })\n }\n\n public handlePushNotification(params: HandlePushNotificationParams) {\n return new Promise<HandlePushNotificationResult>(\n async (resolve, reject) => {\n const { decrypted, type } = params\n if (type !== 'call_invite') {\n this.logger.warn('Unknown notification type', params)\n reject('Unknown notification type')\n }\n this.logger.debug('handlePushNotification', params)\n const {\n params: { params: payload },\n node_id: nodeId,\n } = decrypted\n try {\n // Catch the error temporarly\n try {\n // Send verto.subscribe\n await this.executeVertoSubscribe(payload.callID, nodeId)\n } catch (error) {\n this.logger.warn('Verto Subscribe', error)\n }\n\n this._incomingCallManager.handleIncomingInvite({\n source: 'pushNotification',\n nodeId,\n ...payload,\n })\n\n resolve({ resultType: 'inboundCall' })\n } catch (error) {\n reject(error)\n }\n }\n )\n }\n\n public updateToken(token: string) {\n return new Promise<void>((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.reauthAction({ token }))\n })\n }\n\n /**\n * Mark the client as 'online' to receive calls over WebSocket\n */\n public async online({ incomingCallHandlers }: OnlineParams) {\n this._incomingCallManager.setNotificationHandlers(incomingCallHandlers)\n return this.execute<unknown, void>({\n method: 'subscriber.online',\n params: {},\n })\n }\n\n /**\n * Mark the client as 'offline' to receive calls over WebSocket\n */\n public offline() {\n this._incomingCallManager.setNotificationHandlers({})\n return this.execute<unknown, void>({\n method: 'subscriber.offline',\n params: {},\n })\n }\n}\n","import { configureStore } from '@signalwire/core'\nimport { SATSession } from './SATSession'\nimport { WSClientOptions } from './interfaces'\n\nexport const createWSClient = (options: WSClientOptions) => {\n const store = configureStore({\n userOptions: options,\n SessionConstructor: SATSession,\n })\n\n return { ...options, store }\n}\n","import { HTTPClient } from './HTTPClient'\nimport { Conversation } from './Conversation'\nimport { SignalWireClient, SignalWireClientParams } from './interfaces'\nimport { WSClient } from './WSClient'\n\nexport const SignalWire = (() => {\n let instance: Promise<SignalWireClient> | null = null\n\n return (params: SignalWireClientParams): Promise<SignalWireClient> => {\n if (!instance) {\n instance = new Promise<SignalWireClient>(async (resolve, reject) => {\n try {\n const wsClient = new WSClient(params)\n const httpClient = new HTTPClient(params)\n const conversation = new Conversation({ httpClient, wsClient })\n\n // Connect the WebSocket and authenticate the user\n await wsClient.connect()\n\n resolve({\n registerDevice: httpClient.registerDevice.bind(httpClient),\n unregisterDevice: httpClient.unregisterDevice.bind(httpClient),\n getSubscriberInfo: httpClient.getSubscriberInfo.bind(httpClient),\n disconnect: async () => {\n await wsClient.disconnect()\n instance = null // Reset the singleton instance on disconnect\n },\n online: wsClient.online.bind(wsClient),\n offline: wsClient.offline.bind(wsClient),\n dial: wsClient.dial.bind(wsClient),\n reattach: wsClient.reattach.bind(wsClient),\n handlePushNotification:\n wsClient.handlePushNotification.bind(wsClient),\n updateToken: wsClient.updateToken.bind(wsClient),\n address: {\n getAddresses: httpClient.getAddresses.bind(httpClient),\n getAddress: httpClient.getAddress.bind(httpClient),\n },\n conversation: {\n getConversations:\n conversation.getConversations.bind(conversation),\n getMessages: conversation.getMessages.bind(conversation),\n getConversationMessages:\n conversation.getConversationMessages.bind(conversation),\n subscribe: conversation.subscribe.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n chat: {\n getMessages: conversation.getChatMessages.bind(conversation),\n subscribe: conversation.subscribeChatMessages.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n // @ts-expect-error For debugging purposes\n __httpClient: httpClient,\n __wsClient: wsClient,\n })\n } catch (error) {\n reject(error)\n }\n }).catch((error) => {\n /**\n * Reset the instance to null explicitly since\n * Promises are immutable: once rejected, a Promise remains rejected forever.\n */\n instance = null\n throw error\n })\n }\n return instance\n }\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({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n roomObject.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n","import {\n UserOptions,\n getLogger,\n VideoAuthorization,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { checkMediaParams, getJoinMediaParams } from '../utils/roomSession'\nimport type { MakeRoomOptions } from '../Client'\nimport type {\n BaseRoomSessionJoinParams,\n RoomSessionObjectEvents,\n} from '../utils/interfaces'\nimport { getStorage, sessionStorageManager } from '../utils/storage'\nimport { VideoRoomSession } from './VideoRoomSession'\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'getMeta',\n 'setMeta',\n 'updateMeta',\n 'deleteMeta',\n 'getMemberMeta',\n 'setMemberMeta',\n 'updateMemberMeta',\n 'deleteMemberMeta',\n 'promote',\n 'demote',\n 'lock',\n 'unlock',\n]\n\n/**\n * List of events that the SDK must subscribe at the invite time.\n * ie. ScreenShare/AdditionaDevice are based on the member.joined logic.\n */\nconst REQUIRED_EVENTS: (keyof RoomSessionObjectEvents)[] = [\n 'member.joined',\n 'layout.changed',\n]\nconst noop = () => {}\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\nexport interface RoomSession extends VideoRoomSession {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join({ receiveAudio: true, sendVideo: false })\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio: audioFromConstructor = true,\n video: videoFromConstructor = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n mirrorLocalVideoOverlay = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n disableUdpIceServers = false,\n ...userOptions\n } = roomOptions\n\n const deprecatedParams = ['audio', 'video']\n deprecatedParams.forEach((param) => {\n if (param in roomOptions) {\n getLogger().warn(\n `The '${param}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`\n )\n }\n })\n\n // @ts-expect-error - true by default\n const allowReattach = roomOptions?.reattach !== false\n\n const { callIdKey } = sessionStorageManager(userOptions.token)\n const reattachManager = {\n joined: ({ call_id }: VideoRoomSubscribedEventParams) => {\n if (allowReattach && callIdKey) {\n getStorage()?.setItem(callIdKey, call_id)\n }\n },\n init: () => {\n if (allowReattach) {\n room.on('room.subscribed', reattachManager.joined)\n }\n room.options.prevCallId = reattachManager.getPrevCallId()\n },\n destroy: () => {\n if (!allowReattach) {\n return\n }\n\n room.off('room.subscribed', reattachManager.joined)\n if (callIdKey) {\n getStorage()?.removeItem(callIdKey)\n }\n },\n getPrevCallId: () => {\n if (!allowReattach || !callIdKey) {\n return\n }\n\n return getStorage()?.getItem(callIdKey) ?? undefined\n },\n }\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n // audio,\n // video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n mirrorLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n prevCallId: reattachManager.getPrevCallId(),\n disableUdpIceServers,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n room.emit('room.left', { reason: room.leaveReason })\n\n // Remove callId to reattach\n reattachManager.destroy()\n client.disconnect()\n })\n\n // @ts-expect-error\n client.session.once('session.disconnected', () => {\n room.destroy()\n })\n\n const join = (params?: BaseRoomSessionJoinParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n // Fallback to the constructor values for backwards compat.\n const audio = params?.audio ?? audioFromConstructor\n const video = params?.video ?? videoFromConstructor\n\n // @ts-expect-error\n const authState: VideoAuthorization = client._sessionAuthState\n getLogger().debug('getJoinMediaParams authState?', authState)\n if (authState && authState.type === 'video') {\n const mediaOptions = getJoinMediaParams({\n authState,\n // constructor values override the send\n sendAudio: Boolean(audio),\n sendVideo: Boolean(video),\n ...params,\n })\n\n if (!checkMediaParams(mediaOptions)) {\n client.disconnect()\n return reject(\n new Error(\n `Invalid arguments to join the room. The token used has join_as: '${\n authState.join_as\n }'. \\n${JSON.stringify(params, null, 2)}\\n`\n )\n )\n }\n getLogger().debug('Set mediaOptions', mediaOptions)\n\n /**\n * audio and video might be objects with MediaStreamConstraints\n * so if we must send media, we make sure to use the user's\n * preferences.\n * Note: params.sendAudio: `true` will override audio: `false` so\n * we're using `||` instead of `??` for that reason.\n */\n // @ts-expect-error\n room.updateMediaOptions({\n audio: mediaOptions.mustSendAudio ? audio || true : false,\n video: mediaOptions.mustSendVideo ? video || true : false,\n negotiateAudio: mediaOptions.mustRecvAudio,\n negotiateVideo: mediaOptions.mustRecvVideo,\n })\n }\n\n room.once('room.subscribed', () => {\n resolve(room)\n })\n\n // Hijack previous callId if present\n reattachManager.init()\n\n REQUIRED_EVENTS.forEach((event) => room.once(event, noop))\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n","import { 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","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","undefined","realMethod","Logger","name","defaultLevel","factory","currentLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","location","indexOf","encodeURIComponent","exec","slice","levels","TRACE","DEBUG","INFO","WARN","ERROR","SILENT","getLevel","setLevel","persist","toUpperCase","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","initialLevel","defaultLogger","_loggersByName","getLogger","TypeError","logger","_log","noConflict","getLoggers","module","exports","getRandomValues","rnds8","Uint8Array","rng","crypto","Error","REGEX","byteToHex","push","toString","unsafeStringify","arr","offset","toLowerCase","DNS","URL","v35","version","hashfunc","generateUUID","value","namespace","buf","_namespace","str","unescape","bytes","charCodeAt","stringToBytes","uuid","validate","v","parseInt","parse","set","err","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","a","b","s","t","num","cnt","md5ff","c","d","md5gg","md5hh","md5ii","msg","input","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","native","randomUUID","v4","options","rnds","random","f","z","ROTL","n","_typeof","Symbol","iterator","constructor","_defineProperty","key","arg","hint","prim","toPrimitive","res","String","toPropertyKey","Object","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread2","target","source","forEach","getOwnPropertyDescriptors","defineProperties","formatProdErrorMessage","code","K","H","Array","isArray","N","Math","ceil","M","j","pow","floor","W","T","$$observable","observable","randomString","substring","split","join","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","subscribe","listener","isSubscribed","index","splice","dispatch","action","proto","getPrototypeOf","isPlainObject","type","listeners","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","next","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","state","hasChanged","nextState","_i","_key","previousStateForKey","nextStateForKey","bindActionCreator","actionCreator","compose","_len","funcs","reduce","applyMiddleware","middlewares","store","_dispatch","middlewareAPI","chain","map","middleware","_objectSpread","actionCreators","boundActionCreators","createSymbol","CANCEL","CHANNEL_END_TYPE","IO","MATCH","MULTICAST","SAGA_ACTION","SELF_CANCELLATION","TASK","TASK_CANCEL","TERMINATE","SAGA_LOCATION","_extends","assign","hasOwnProperty","undef","notUndef","func","string","array","promise","p","then","it","throw","pattern","pat","symbol","every","channel","ch","take","close","stringableFunc","Boolean","multicast","kTrue","konst","identity","assignWithSymbols","flatMap","mapper","concat","remove","item","once","fn","called","kThrow","kReturn","done","makeIterator","thro","meta","return","isSagaIterator","logError","error","sagaStack","createEmptyArray","wrapSagaDispatch","shouldTerminate","shouldCancel","shouldComplete","createAllStyleChildCallbacks","shape","parentCallback","completed","totalCount","completedCount","results","childCallbacks","chCbAtKey","isErr","cancel","getMetaInfo","getLocation","instrumented","zeroBuffer","isEmpty","put","none","expanding","initialSize","limit","overflowAction","pushIndex","popIndex","flush","items","doubledLimit","ringBuffer","TAKE","PUT","ALL","CALL","FORK","JOIN","SELECT","CANCELLED","makeEffect","payload","combinator","patternOrChannel","multicastPattern","warn","channel$1","getFnCallDescriptor","fnDescriptor","args","context","fork","_len3","_key3","select","selector","_len5","_key5","cancelled","queue","semaphore","task","suspend","release","asap","immediately","shift","patterns","some","matcher","predicate","_predicate","wildcard","matcherCreator","string$1","array$1","symbol$1","END","isEnd","buffer$1","closed","takers","cb","taker","eventChannel","buffer","chan","multicastChannel","currentTakers","nextTakers","ensureCanMutateNextTakers","stdChannel","RUNNING","ABORTED","DONE","resolvePromise","cancelPromise","_effectRunnerMap","current","nextSagaId","cancelSingleTask","taskToCancel","isRunning","effectRunnerMap","env","_ref3","_ref3$channel","maybe","takeCb","resolve","result","effects","_ref11","digestEffect","effectId","_ref12","response","childCbs","_ref4","_ref5","proc","_ref6","cpsCb","_ref7","_ref8","detached","parent","taskIterator","resolved","createTaskIterator","getIteratorMetaInfo","child","addTask","isAborted","abort","taskOrTasks","_ref9","joinSingleTask","taskToJoin","joiner","joiners","_ref10","_ref13","_ref14","match","CANCELLED$1","data","_ref15","isCancelled","prop","_ref16","props","_ref17","formatLocation","fileName","lineNumber","sagaLocationAsString","sagaMeta","cancelledTasksAsString","cancelledTasks","crashedEffect","addSagaFrame","frame","clear","setCrashedEffect","effect","firstSaga","otherSagas","crashedEffectLocation","iterator$1","parentContext","parentEffectId","isRoot","cont","finalRunEffect","finalizeRunEffect","currCb","effectRunner","executingContext","mainTask","status","_task","taskResult","taskError","deferredEnd","cancelledDueToErrorTasks","create","onAbort","tasks","getTasks","cancelAll","forkQueue","end","onError","reject","id","setContext","toPromise","def","Promise","newTask","label","effectSettled","sagaMonitor","effectRejected","effectResolved","effectTriggered","effectCancelled","runSaga","saga","_ref$channel","_ref$context","effectMiddlewares","_ref$onError","rootSagaStarted","actionDispatched","runEffect","eff","sagaMiddlewareFactory","_temp","boundRunSaga","excluded","sourceKeys","_objectWithoutPropertiesLoose","sagaMiddleware","run","has","prefix","Events","EE","addListener","emitter","event","evt","_events","_eventsCount","clearEvent","EventEmitter","__proto__","eventNames","events","names","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","on","removeAllListeners","off","prefixed","__defProp","__defProps","__getOwnPropDesc","__getOwnPropDescs","__getOwnPropNames","getOwnPropertyNames","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","__spreadValues","__spreadProps","__objRest","exclude","__export","all2","get","__copyProps","to","from","except","desc","__reExport","mod","secondTarget","__publicField","LOCAL_EVENT_PREFIX","SYNTHETIC_EVENT_PREFIX","PRODUCT_PREFIX_PUBSUB","originalFactory","logLevel","rawMethod","unshift","Date","toISOString","userLogger","defaultLoggerLevel","debugOptions","getLoggerInstance","wsTraffic","logWsTraffic","shouldStringify","JSON","stringify","info","Proxy","receiver","Reflect","UPPERCASE_REGEX","WEBRTC_EVENT_TYPES","isWebrtcEventType","eventType","includes","whitelistCodeRegex","parseResponse","nodeId","node_id","nestedResult","jsonrpc","DEFAULT_OPTIONS","propsToUpdateValue","toExternalJSON","__sw_symbol","__sw_proxy","entries","fromSnakeToCamelCase","endsWith","isTimestampProperty","timestamp","date","isNaN","getTime","toDateObject","part","fc","trim","remainingChars","substr","toInternalAction","event_type","params","vertoRPC","extendComponent","klass","methods","stripNamespacePrefix","regex","RegExp","replace","capabilityStringToObjectMap","device","sendDigit","setLayout","screenshare","vmutedHide","lock","member","position","microphoneVolume","microphoneSensitivity","speakerVolume","deaf","muteAudio","muteVideo","raisehand","isObjectGuard","o","capabilityStringToObjects","capability","startsWith","_","mergeCapabilityObjects","PROTOCOL_PATTERN","timeoutPromise","time","exception","timer","race","_resolve","setTimeout","finally","clearTimeout","WITH_CUSTOM_EVENT_NAMES","CLIENT_SIDE_EVENT_NAMES","validateEventsToSubscribe","valid","internalEvent","eventParts","cleanupEventNamespace","isSyntheticEvent","isLocalEvent","isSessionEvent","find","withCustomName","Set","isSATAuth","makeRPCRequest","_a","makeRPCResponse","DEFAULT_CONNECT_VERSION","major","minor","revision","UNIFIED_CONNECT_VERSION","RPCConnect","event_acks","RPCReauthenticate","authentication","tmpMap","destinationNumber","remoteCallerName","remoteCallerNumber","callerName","callerNumber","filterVertoParams","dialogParams","buildVertoRPCMessage","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoAnswer","VertoSubscribe","VertoPong","VertoResult","actions_exports","authErrorAction","authExpiringAction","authSuccessAction","createAction","destroyAction","getCustomSagaActionType","initAction","makeCustomSagaAction","reauthAction","sessionDisconnectedAction","sessionForceCloseAction","sessionReconnectingAction","socketMessageAction","toolkit_exports","prepareAction","prepared","configureStore","redux_star","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","IS_PRODUCTION","curriedGetDefaultMiddleware","devTools","enhancers","rootReducer2","baseProto","finalMiddleware","middlewareEnhancer","finalCompose","compose2","storeEnhancers","formatCustomSagaAction","executeReducerBuilderCallback","builderCallback","actionsMap","actionMatchers","defaultCaseReducer","builder","addCase","typeOrActionCreator","addMatcher","addDefaultCase","createDestroyableSlice","initialState","extraReducers","reducerNames","sliceCaseReducersByName","sliceCaseReducersByType","buildReducer","finalCaseReducers","mapOrBuilderCallback","getInitialState","finalActionMatchers","finalDefaultCaseReducer","caseReducers","reducer2","cr","previousState","caseReducer","createReducer","_reducer","reducerName","maybeReducerWithPrepare","prepareCallback","prepare","actions","createSlice","authorizingAction","sessionSlice","protocol","iceServers","authStatus","authState","authError","authCount","connected","_b","authorization","ice_servers","updateAuthState","sessionActions","sessionReducer","SW_SYMBOL","BaseSession","Map","for","host","sessionChannel","_host","checkWebSocketHost","_sessionChannel","_onSocketOpen","_onSocketError","_onSocketClose","_onSocketMessage","execute","connect","wsOpenHandler","_a2","_socket","removeEventListener","wsCloseHandler","wsErrorHandler","rpcConnectResult","_rpcConnectResult","relayProtocol","signature","connecting","readyState","closing","_status","idle","ready","token","WebSocketConstructor","CloseEventConstructor","_clearTimers","_removeSocketListeners","destroySocket","_clearCheckPingTimer","_createSocket","_addSocketListeners","reason","addEventListener","disconnect","_checkCurrentStatus","message","_requests","rpcRequest","_send","_executeTimeoutMs","_executeTimeoutError","catch","_executeConnectionClosed","_swConnectError","_closeConnection","_addToExecuteQueue","_connectParams","agent","connectVersion","project","async","_relayProtocolIsValid","topics","contexts","forceClose","authenticate","_flushExecuteQueue","_clearPendingRequests","_reconnectTimer","size","decode","isJSONRPCRequest","isJSONRPCResponse","request","delete","parseRPCResponse","_pingHandler","_eventAcknowledgingHandler","_payload","encode","safeParseJson","persistSwAuthorizationState","send","_executeQueue","add","_checkPingTimer","_checkPingDelay","now","RPCEventAckResponse","BaseJWTSession","super","_checkTokenExpiration","reauthenticate","expiresAt","fabric_subscriber","expires_at","parsed","expiresIn","expired","_expiredDiffSeconds","jwt_token","prevProtocol","retrieveRelayProtocol","authorizationState","retrieveSwAuthorizationState","authorization_state","persistRelayProtocol","project_id","_checkTokenExpirationTimer","refreshTokenFn","onRefreshToken","_refreshTokenNotificationDiff","_checkTokenExpirationDelay","redux_exports","configureStore2","createCatchableSaga","createRestartableSaga","componentSlice","byId","upsert","cleanup","componentId","ids","componentActions","componentReducer","rootReducer","components","session","sagaHelpers_exports","_len4","_key4","spawn","defaultCatchHandler","errorHandler","isWebrtcEvent","isVideoEvent","isSwAuthorizationState","sessionChannelWatcher","swEventChannel","swEventWorker","broadcastParams","onSwAuthorizationState","sessionChannelWorkerCatchable","AuthError","setPrototypeOf","HttpError","sessionSaga","initSession","sessionEmitter","userOptions","channels","customTasks","workers","call2","all","sessionChannelTask","fork2","sessionStatusTask","sessionStatusWatcher","take2","reauthenticateWorker","put2","sessionAuthErrorSaga","sessionSelectors_exports","getAuthError","getAuthState","getAuthStatus","getIceServers","getSession","sessionListeners","Component","customSagas","sessionKeys","instance","cacheMap","storeUnsubscribe","reduxKey","cacheKey","updatedValue","fnName","taskList","destroyer","getEventEmitter","SessionConstructor","runRootSaga","createSagaMiddleware","getDefaultMiddleware","instanceMap","getAll","deleteAll","useInstanceMap","getSession2","useSession","setDebugOptions","rootSaga_default","executeActionWorker","onDone","onFail","requestId","RPCExecute","call3","SW_SYMBOL2","BaseComponent","eventEmitter","__uuid","_destroyer","eventName","sessionEventNames","getSubscriptions","destroy","detachWorkers","transformParams","transformResolve","transformReject","runWorker","worker","triggerCustomSaga","dispatchId","_customSagaTriggers","settleCustomSagaTrigger","kind","selectorFn","getStateProperty","param","_sessionAuthStatus","_sessionAuthState","_waitUntilSessionAuthorized","authStatus2","_workers","_setWorker","_attachWorker","_runningWorkers","BaseClient","BaseConsumer","resetLatestExecuteParams","_latestExecuteParams","shouldExecuteSubscribe","execParams","subscriptions","subscribeMethod","subscribeParams","event_channel","INTERNAL_MEMBER_UPDATABLE_PROPS","audio_muted","video_muted","visible","input_volume","output_volume","input_sensitivity","MEMBER_UPDATABLE_PROPS","componentSelectors_exports","getComponent","getComponentsById","getComponentsToCleanup","toCleanup","responses","errors","audioMuted","videoMuted","inputVolume","outputVolume","inputSensitivity","rooms_exports","RoomSessionPlaybackAPI","RoomSessionRecordingAPI","RoomSessionStreamAPI","audioMuteMember","audioUnmuteMember","createRoomSessionPlaybackObject","createRoomSessionRecordingObject","createRoomSessionStreamObject","deafMember","deleteMemberMeta","deleteMeta","demote","getLayouts","getMemberMeta","getMembers","getMeta","getPlaybacks","getRecordings","getStreams","hideVideoMuted","play","promote","removeAllMembers","removeMember","setDeaf","setHideVideoMuted","setInputSensitivityMember","setInputVolumeMember","setMemberMeta","setMemberPosition","setMeta","setOutputVolumeMember","setPositions","setPrioritizeHandraise","setRaisedHand","showVideoMuted","startRecording","startStream","undeafMember","unlock","updateMemberMeta","updateMeta","videoMuteMember","videoUnmuteMember","baseCodeTransform","createRoomMethod","room_session_id","roomSessionId","createRoomMemberMethod","memberId","rest","member_id","layouts","members","recordings","recordingInstances","recording","recordingInstance","setPayload","room_id","roomId","playbacks","playbackInstances","playback","playbackInstance","seekPosition","currentTimecode","seek_position","createRoomMetaMethod","streams","streamInstances","stream","streamInstance","enable","mediaAllowed","joinAudioMuted","joinVideoMuted","media_allowed","join_audio_muted","join_video_muted","raised","duration","startedAt","started_at","endedAt","ended_at","recording_id","url","volume","seekable","playback_id","timecode","abs","stream_id","chat_exports","BaseChatAPI","BaseChatConsumer","ChatMember","ChatMessage","applyCommonMethods","createBaseChatObject","getMemberState","getMembers2","getMessages","publish","setMemberState","toInternalChatChannels","list","isValidChannels","baseCodeTransform2","createChatMethod","createChatMemberMethod","messages","cursor","transformParamChannels","pubSub_exports","BasePubSubConsumer","PubSubMessage","createBasePubSubObject","pubSubWorker","client","channel3","restMessage","externalJSON","pubSubMessage","isPubSubEvent","sagaEffects.take","sagaEffects.fork","toInternalPubSubChannels","initWorker","_getChannelsParam","_channels","_setSubscribeParams","_getSubscribeParams","_getUnsubscribeParams","channelsParam","_checkMissingSubscriptions","eventNamesWithPrefix","updateToken","content","publishedAt","chatWorker","chatMessage","isChatEvent2","transformParamChannels2","baseCodeTransform3","targetClass","_client","_c","_d","memberPosition_exports","memberPositionWorker","memberUpdatedWorker","defaultDispatcher","memberPositionLayoutChangedWorker","memberList","dispatcher","processedMembers","layout","layers","layer","memberEventParams","current_position","mutateMemberCurrentPosition","currentPosition","updatedMemberEventParams","updated","memberUpdatedPayload","initializeMemberList","addToMemberList","action2","fork3","room_session","configureFullStack","configureJestStore","createMockedLogger","createSessionChannel","createSwEventChannel","rpcConnectResultVRT","wait","PROJECT_ID","TOKEN","fatal","jest","mockImplementation","ms","scopes","scope_id","resource","join_as","user_name","room","display_name","audio_allowed","video_allowed","urls","credential","credentialType","username","multicastChannel2","channel2","selectors","supportsMediaDevices","mediaDevices","getMediaDevicesApi","getSupportedConstraints","streamIsValid","MediaStream","supportsMediaOutput","HTMLMediaElement","setMediaElementSinkId","el","deviceId","setSinkId","stopStream","getTracks","stopTrack","track","stop","dispatchEvent","Event","PERMISSIONS_MAPPING","camera","microphone","speaker","_getMediaDeviceKindByName","enumerateDevices","enumerateDevicesByKind","filterByKind","devices","_error","checkPermissions","permissions","query","_legacyCheckPermissions","checkCameraPermissions","checkMicrophonePermissions","checkSpeakerPermissions","getUserMedia","constraints","audio","video","useTimeout","promises","_useTimeoutForGUM","constraint","getDisplayMedia","getDevicesWithPermissions","fullList","getDevices","_filterDevices","found","groupId","targets","checkDefault","excludeDefault","getSpeakerDevices","assureDeviceId","deviceLabel","_deviceInfoToMap","deviceInfo","TARGET_PERMISSIONS_MAP","DEFAULT_TARGETS","ALLOWED_TARGETS_MSG","CHECK_SUPPORT_MAP","createDeviceWatcher","permission","supported","unsupported","checkTargetPermissions","needPermissionsTarget","filteredTargets","unsupportedTargets","needPermissions","validateTargets","currentDevices","kinds","knownDevices","oldDevices","newDevices","changes","removals","updates","additions","newDevice","oldDevice","removed","added","_getDeviceListDiff","hasAddedDevices","hasRemovedDevices","hasUpdatedDevices","createSpeakerDeviceWatcher","isMediaStream","getSpeakerById","SDPUtils","localCName","generateIdentifier","splitLines","blob","line","splitSections","getDescription","sections","getMediaSections","matchPrefix","parseCandidate","parts","candidate","foundation","component","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","sdp","parseIceOptions","parseRtpMap","payloadType","clockRate","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","parameters","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","description","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","sessionVersion","netType","addressType","isValidSDP","_isAudioLine","_isVideoLine","hasMediaSection","sdpStereoHack","endOfLine","sdpLines","opusIndex","findIndex","opusPayload","_getCodecPayloadType","fmtpLineIndex","_getUserMedia","getMediaConstraints","negotiateAudio","remoteSdp","_shouldNegotiateAudio","_getAudioConstraints","micLabel","micId","newMicId","exact","negotiateVideo","_shouldNegotiateVideo","camId","_getVideoConstraints","camLabel","newCamId","filterIceServers","servers","disableUdpIceServers","filterOutUdpUrls","transportParam","server","RTCPeer","_negotiating","_processingRemoteSDP","_restartingIce","_onIce","_onEndedTrackHandler","prevCallId","localStream","_localStream","rtcConfigPolyfill","config","watchMediaPacketsTimeout","remoteStream","_remoteStream","isOffer","isAnswer","isSimulcast","simulcast","isSfu","sfu","localVideoTrack","videoSender","_getSenderByKind","localAudioTrack","audioSender","remoteVideoTrack","videoReceiver","_getReceiverByKind","remoteAudioTrack","audioReceiver","hasAudioSender","hasVideoSender","hasAudioReceiver","hasVideoReceiver","rtcPeerConfig","bundlePolicy","sdpSemantics","localSdp","localDescription","remoteDescription","hasIceServers","getConfiguration","stopTrackSender","sender","removeTrack","newTrack","replaceTrack","addTrack","getDeviceId","getSettings","getTrackSettings","getDeviceLabel","restartIceWithRelayOnly","iceTransportPolicy","newConfig","setConfiguration","restartIce","triggerResume","_resumeTimer","clearTimers","leaveReason","setState","_closeWSConnection","resetNeedResume","clearResumeTimer","watchMediaPackets","startWatchMediaPackets","stopWatchMediaPackets","_mediaWatcher","rtcPeer","previousAudioValue","previousVideoValue","clearTimer","meter","audioPacketsReceived","videoPacketsReceived","stats","getStats","audioTrackId","videoTrackId","report","trackIdentifier","packetsReceived","lastPacketReceivedTimestamp","connectionState","start","watchRTCPeerMediaPackets","newConstraints","getConstraints","screenShare","applyConstraints","getSenders","getReceivers","force","additionalDevice","getTransceivers","tr","offerOptions","voiceActivityDetection","_supportsAddTransceiver","offerToReceiveAudio","offerToReceiveVideo","offer","createOffer","_setLocalDescription","_setRemoteDescription","answer","createAnswer","_sdpReady","iceGatheringState","_iceTimeout","_onIceTimeout","maxIceGatheringTimeout","onRemoteBye","_rejectStartMethod","_resolveStartMethod","hangup","_setupRTCPeerConnection","RTCPeerConnection","_attachListeners","_retrieveLocalStream","hasLocalTracks","audioTracks","getAudioTracks","videoTracks","getVideoTracks","addTransceiver","audioTransceiverParams","videoTransceiverParams","sendEncodings","rid","active","scaleResolutionDownBy","Number","msStreamsNumber","addStream","_checkMediaToNegotiate","startNegotiation","detachAndStop","transceiver","_sdpIsValid","onLocalSDPReady","section","sdpHasValidCandidates","_forceNegotiation","iceGatheringTimeout","useStereo","googleMaxBitrate","googleMinBitrate","googleStartBitrate","max","min","sdpBitrateHack","setLocalDescription","localOffer","offerLines","offerAudioIndex","offerVideoIndex","answerLines","answerAudioIndex","answerVideoIndex","audioLines","videoLines","sdpMediaOrderHack","sessionDescr","setRemoteDescription","signalingState","emitMediaConnected","_connectionStateTimer","maxConnectionStateTimeout","clearConnectionStateTimer","iceConnectionState","_attachAudioTrackListener","_attachVideoTrackListener","clearWatchMediaPacketsTimer","_watchMediaPacketsTimer","mediaTrack","_detachAudioTrackListener","_detachVideoTrackListener","SuppressedError","isWebrtcAction","vertoEventWorker","rtcPeerId","catchableWorker","sagaHelpers","jsonrpcId","callID","peer","getRTCPeerById","activeRTCPeer","onRemoteSdp","sagaEffects.put","sagaEffects.call","_getRPCMethod","onVertoBye","byeCause","cause","byeCauseCode","causeCode","redirectDestination","pongParams","__rest","mediaParams","applyMediaConstraints","setActiveRTCPeer","roomSubscribedWorker","call_id","clonedPayload","previewUrl","preview_url","transformPayload","Rooms","promoteDemoteWorker","sagaEffects.select","updateMediaOptions","_triggerNewRTCPeer","sessionAuthWorker","resume","AUDIO_CONSTRAINTS","echoCancellation","noiseSuppression","autoGainControl","AUDIO_CONSTRAINTS_SCREENSHARE","googAutoGainControl","VIDEO_CONSTRAINTS","width","ideal","height","aspectRatio","DEFAULT_CALL_OPTIONS","attach","userVariables","requestTimeout","autoApplyMediaParams","BaseConnection","gotEarly","doReinvite","prevState","rtcPeerMap","resuming","executeInvite","activeRTCPeerId","_checkDefaultMediaConstraints","_initPeer","trying","callId","componentSelectors","cameraId","cameraLabel","microphoneId","microphoneLabel","withAudio","withVideo","oldPeerId","pingSupported","reattaching","appendRTCPeer","setLocalStream","prevAudioTracks","newAudioTracks","prevVideoTracks","newVideoTracks","updateStream","vertoExecute","_buildPeer","updateCamera","updateConstraints","updateMicrophone","manageSendersWithConstraints","stopOutboundAudio","stopOutboundVideo","attempt","newStream","oldConstraints","prevVideoTrack","prevAudioTrack","tracks","currentDirection","previous","runRTCPeerWorkers","workers.vertoEventWorker","workers.roomSubscribedWorker","workers.promoteDemoteWorker","invite","mungedSDP","_mungeSDP","_watchSessionAuth","executeUpdateMedia","executeAnswer","sessionAuthTask","workers.sessionAuthWorker","ssOpts","positions","dtmf","doReinviteWithRelayOnly","restoreOutboundAudio","restoreTrackSender","restoreOutboundVideo","_finalize","sdpRemoveLocalCandidates","setAudioMediaTrack","element","autoplay","playsinline","srcObject","audioSetSpeakerAction","makeAudioElementSaga","speakerId","Audio","audioEl","getAudioEl","audioTask","audioElementSetupWorker","audioElementActionsWatcher","setSpeakerActionType","videoManagerRoomsWorker","modPayload","rooms","row","videoManagerRoomWorker","videoManagerWorker","VideoManagerAPI","SCREENSHARE_AUDIO_CONSTRAINTS","SDK_PREFIX","OVERLAY_PREFIX","addOverlayPrefix","RoomSessionScreenShareAPI","leave","audioMute","audioUnmute","videoMute","videoUnmute","setMicrophoneVolume","setInputVolume","setInputSensitivity","EXTERNAL_MEMBER_LIST_UPDATED_EVENT","SYNTHETIC_MEMBER_LIST_UPDATED_EVENT","toSyntheticEvent","letter","fromCamelToSnakeCase","getNamespacedEvent","toInternalEventName","MEMBER_LIST_EVENTS","isMemberListEvent","getUpdatedMembers","actionMembers","getMembersFromAction","values","membersListUpdatedWatcher","pubSubAction","memberListUpdatedWorker","shouldHandleMemberList","getMemberListEventsToSubscribe","eventBridgeHandler","initMemberListSubscriptions","childMemberJoinedWorker","parentId","parent_id","videoStreamWorker","roomSession","videoRecordWorker","videoPlaybackWorker","videoWorker","MemberPosition","talking","currentLayoutEvent","BaseRoomSessionConnection","_screenShareList","_audioEl","_overlayMap","_localVideoOverlay","overlayMap","localVideoOverlay","overlay","screenShareList","_attachSpeakerTrackListener","deviceWatcher","sinkId","disconnectedSpeaker","payloadDeviceId","defaultSpeakers","attachPreConnectWorkers","workers.memberListUpdatedWorker","getMemberOverlay","opts","autoJoin","displayStream","recoverCall","memberCallId","workers.childMemberJoinedWorker","updateSpeaker","prevId","newId","prevSpeaker","newSpeaker","isSame","RoomSessionDeviceAPI","VideoRoomSessionConnection","_deviceList","_currentLayoutEvent","currentLayout","deviceList","interactivityMode","workers.videoWorker","getLayoutList","getMemberList","startScreenShare","addCamera","addDevice","addMicrophone","roomDevice","VideoRoomSessionAPI","undeaf","setOutputVolume","setSpeakerVolume","isVideoRoomSession","r","atob","fromCharCode","decodeURIComponent","header","getStorage","sessionStorage","sessionStorageManager","roomName","jwtPayload","jwtDecode","typ","authStateKey","protocolKey","callIdKey","PREVIOUS_CALLID_STORAGE_KEY","wsClientWorker","handleIncomingInvite","conversationWorker","conversation","isConversationEvent","handleEvent","FabricRoomSessionMemberAPI","requestedPosition","requested_position","handraised","subscriberData","subscriber_data","newPayload","createFabricRoomSessionMemberObject","callLeftWorker","cfRoomSession","fabricMemberWorker","memberInstance","clientType","mapInternalFabricMemberToInternalVideoMemberEntity","mapInternalFabricMemberToInternalVideoMemberUpdatedEntity","mapInternalFabricRoomToInternalVideoRoomEntity","hide_video_muted","prioritize_handraise","mapInternalFabricRoomToInternalVideoRoomSessionEntity","layout_name","locked","streaming","callJoinWorker","subType","subPayload","fabricType","fabricPaylod","capabilities","callSegmentWorker","segmentCallId","segmentRooSessionId","videoAction","mapFabricMemberActionToVideoMemberJoinAndLeftAction","mapFabricMemberActionToVideoMemberUpdatedAction","mapFabricLayoutActionToVideoLayoutAction","isSegmentEvent","fabricWorker","selfMember","m","firstCallJoinedReceived","isFirstCallJoinedorCallStateEvent","origin_call_id","FabricRoomSessionConnection","_self","_member","_capabilities","getItem","executeAction","extraParams","targetMember","setItem","isFabricRoomSession","UserOverlay","_domElement","userId","domElement","hide","style","opacity","show","LocalVideoOverlay","_mirrored","_room","mirrorLocalVideoOverlay","fabricMemberVideoMutedHandler","videoMemberVideoMutedHandler","attachListeners","mirrored","detachListeners","memberVideoMutedHandler","setMediaStream","localVideo","querySelector","setMirror","mirror","firstChild","videoEl","transform","webkitTransform","buildVideo","createElement","muted","playsInline","_getLocationStyles","top","left","_buildLayer","overflow","_updateLayer","createRootElementResizeObserver","rootElement","paddingWrapper","update","wait2","callFirst","timeout","debouncedFn","debounceWrapper","callNow","call4","debounce","maxPaddingBottom","videoHeight","videoWidth","pb","paddingBottom","nativeVideoRatio","computePaddingWrapperWidth","ResizeObserver","entry","contentBoxSize","inlineSize","blockSize","contentRect","onVideoResize","clientWidth","clientHeight","observe","buildVideoElement","applyLocalVideoOverlay","applyMemberOverlay","hasVideoTrack","overlayId","addSDKPrefix","makeLayout","mcuLayers","fragment","createDocumentFragment","currentOverlayIds","myLayerEl","disablePictureInPicture","pointerEvents","objectFit","appendChild","hasVideo","enabled","memberIdInLocation","newLayer","parentNode","removeChild","innerHTML","makeLayoutChangedHandler","processLayoutChanged","layoutChangedHandler","processVideoTrack","videoElementSetup","roomCurrentLayoutEvent","videoTrack","trackHandler","cleanupElement","videoElement","setVideoMediaTrack","maxHeight","mcuWrapper","right","bottom","classList","layersWrapper","display","relativeWrapper","margin","alignItems","justifyContent","HAVE_NOTHING","waitForVideoReady","rootElementResizeObserver","ClientAPI","_videoManager","_chat","_pubSub","makeRoomObject","makeRoomOptions","stopCameraWhileMuted","stopMicrophoneWhileMuted","chat","ChatNamespace","pubSub","PubSubNamespace","videoManager","manager","property","createVideoManagerObject","SwCloseEvent","CloseEvent","wasClean","JWTSession","WebSocket","tokenTyp","decodedJwt","allowReattach","reattach","isVRT","isSAT","createClient","baseUserOptions","INTERCEPTED_METHODS","chatOptions","interceptors","_session","createInterceptor","PubSub","pubSubOptions","http","init","fetch","ok","errorResponse","json","errorMessage","parsedBody","createHttpClient","baseUrl","globalOptions","fetcher","path","headers","body","reqInit","getRequestInit","timerId","controller","AbortController","signal","getUrl","searchParams","append","buildPaginatedResult","anotherPage","links","nextPage","prevPage","prev","firstPage","first","hasNext","hasPrev","makeQueryParamsUrls","queryParams","queryString","HTTPClient","httpClient","httpHost","Authorization","isGetAddressByIdParams","isGetAddressesResponse","displayName","pageSize","sortBy","sortOrder","URLSearchParams","queryUrl","deviceType","deviceToken","device_type","device_token","ConversationAPI","addressId","address_id","createdAt","created_at","lastMessageAt","last_message_at","metadata","sendMessage","text","getConversationMessages","DEFAULT_CHAT_MESSAGES_PAGE_SIZE","Conversation","wsClient","callbacks","chatSubscriptions","subtype","chatCallbacks","conversation_id","callback","fetchChatMessagesPage","fetcherFn","cached","isDirectionNext","chatMessages","isValid","conversationMessages","chatOnlyMessages","remaining","idx","missingReturns","onMessage","IncomingCallManager","_pendingInvites","_handlers","_buildNotification","accept","buildInboundCall","executeVertoBye","details","setNotificationHandlers","pushNotification","websocket","incomingInvite","notification","handler","SATSession","jti","reauthResponse","WSClient","wsClientOptions","_incomingCallManager","_disconnected","createWSClient","makeFabricObject","buildOutboundCall","pathname","sessid","_reject","handlePushNotification","decrypted","executeVertoSubscribe","resultType","incomingCallHandlers","offline","SignalWire","registerDevice","unregisterDevice","getSubscriberInfo","online","dial","getAddresses","getAddress","getConversations","joinConversation","getChatMessages","subscribeChatMessages","__httpClient","__wsClient","createRoomObject","roomOptions","rootElementId","getElementById","roomObject","UNSAFE_PROP_ACCESS","REQUIRED_EVENTS","audioFromConstructor","videoFromConstructor","reattachManager","joined","getPrevCallId","mediaOptions","sendAudio","sendVideo","receiveAudio","receiveVideo","canSend","canSendAudio","canSendVideo","canReceiveAudio","canReceiveVideo","reqToSendAudio","reqToSendVideo","reqToReceiveAudio","reqToReceiveVideo","mustSendAudio","mustSendVideo","mustRecvAudio","mustRecvVideo","getJoinMediaParams","getMicrophoneAnalyzerMediaStream","audioContext","AudioContext","webkitAudioContext","analyser","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","createAnalyzer","rafId","createMediaStreamSource","startMetering","dataArray","frequencyBinCount","getByteFrequencyData","latestVol","final","requestAnimationFrame","cancelAnimationFrame"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../../../node_modules/loglevel/lib/loglevel.js","../../core/node_modules/uuid/dist/esm-browser/rng.js","../../core/node_modules/uuid/dist/esm-browser/regex.js","../../core/node_modules/uuid/dist/esm-browser/stringify.js","../../core/node_modules/uuid/dist/esm-browser/v35.js","../../core/node_modules/uuid/dist/esm-browser/parse.js","../../core/node_modules/uuid/dist/esm-browser/validate.js","../../core/node_modules/uuid/dist/esm-browser/md5.js","../../core/node_modules/uuid/dist/esm-browser/v3.js","../../core/node_modules/uuid/dist/esm-browser/native.js","../../core/node_modules/uuid/dist/esm-browser/v4.js","../../core/node_modules/uuid/dist/esm-browser/sha1.js","../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../node_modules/redux/es/redux.js","../../core/node_modules/uuid/dist/esm-browser/v5.js","../../../node_modules/@redux-saga/symbols/dist/redux-saga-symbols.esm.js","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@redux-saga/is/dist/redux-saga-is.esm.js","../../../node_modules/@redux-saga/core/dist/io-22ea0cf9.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/eventemitter3/index.js","../../core/dist/index.esm.js","../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.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","../../../node_modules/sdp/sdp.js","../../webrtc/dist/mjs/webrtc/src/utils/sdpHelpers.js","../../webrtc/dist/mjs/webrtc/src/utils/helpers.js","../../webrtc/dist/mjs/webrtc/src/RTCPeer.js","../../webrtc/dist/mjs/webrtc/src/utils/watchRTCPeerMediaPackets.js","../../../node_modules/tslib/tslib.es6.mjs","../../webrtc/dist/mjs/webrtc/src/workers/vertoEventWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/roomSubscribedWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/promoteDemoteWorker.js","../../webrtc/dist/mjs/webrtc/src/workers/sessionAuthWorker.js","../../webrtc/dist/mjs/webrtc/src/utils/constants.js","../../webrtc/dist/mjs/webrtc/src/BaseConnection.js","../src/utils/audioElement.ts","../src/features/actions.ts","../src/features/mediaElements/mediaElementsSagas.ts","../src/cantina/workers/videoManagerRoomsWorker.ts","../src/cantina/workers/videoManagerRoomWorker.ts","../src/cantina/workers/videoManagerWorker.ts","../src/cantina/VideoManager.ts","../src/utils/constants.ts","../src/utils/roomSession.ts","../src/RoomSessionScreenShare.ts","../src/video/workers/memberListUpdatedWorker.ts","../src/video/workers/childMemberJoinedWorker.ts","../src/video/workers/videoStreamWorker.ts","../src/video/workers/videoRecordWorker.ts","../src/video/workers/videoPlaybackWorker.ts","../src/video/workers/videoWorker.ts","../src/BaseRoomSession.ts","../src/RoomSessionDevice.ts","../src/video/VideoRoomSession.ts","../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../src/utils/storage.ts","../src/fabric/utils/constants.ts","../src/fabric/workers/wsClientWorker.ts","../src/fabric/workers/conversationWorker.ts","../src/fabric/FabricRoomSessionMember.ts","../src/fabric/workers/callLeftWorker.ts","../src/fabric/workers/fabricMemberWorker.ts","../src/fabric/utils/helpers.ts","../src/fabric/utils/capabilitiesHelpers.ts","../src/fabric/workers/callJoinWorker.ts","../src/fabric/workers/callSegmentWorker.ts","../src/fabric/workers/fabricWorker.ts","../src/fabric/FabricRoomSession.ts","../src/VideoOverlays.ts","../src/utils/videoElement.ts","../src/buildVideoElement.ts","../src/Client.ts","../src/utils/CloseEvent.ts","../src/JWTSession.ts","../src/createClient.ts","../src/chat/Client.ts","../src/pubSub/Client.ts","../src/pubSub/index.ts","../src/fabric/createHttpClient.ts","../src/utils/paginatedResult.ts","../src/utils/makeQueryParamsUrl.ts","../src/fabric/HTTPClient.ts","../src/fabric/utils/typeGuard.ts","../src/fabric/ConversationAPI.ts","../src/fabric/Conversation.ts","../src/fabric/IncomingCallManager.ts","../src/fabric/SATSession.ts","../src/fabric/WSClient.ts","../src/fabric/createWSClient.ts","../src/fabric/SignalWire.ts","../src/createRoomObject.ts","../src/video/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 var _loggersByName = {};\n var defaultLogger = null;\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() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\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, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\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) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\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, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\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 cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[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 } 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 function normalizeLevel(input) {\n var level = input;\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 return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\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 if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\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 self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\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,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import { unsafeStringify } from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n var _namespace;\n\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (let i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n const output = [];\n const length32 = input.length * 32;\n const hexTab = '0123456789abcdef';\n\n for (let i = 0; i < length32; i += 8) {\n const x = input[i >> 5] >>> i % 32 & 0xff;\n const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n let a = 1732584193;\n let b = -271733879;\n let c = -1732584194;\n let d = 271733878;\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a;\n const oldb = b;\n const oldc = c;\n const oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n const length8 = input.length * 8;\n const output = new Uint32Array(getOutputLength(length8));\n\n for (let i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n const lsw = (x & 0xffff) + (y & 0xffff);\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nconst v3 = v35('v3', 0x30, md5);\nexport default v3;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (let i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n const l = bytes.length / 4 + 2;\n const N = Math.ceil(l / 16);\n const M = new Array(N);\n\n for (let i = 0; i < N; ++i) {\n const arr = new Uint32Array(16);\n\n for (let j = 0; j < 16; ++j) {\n arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];\n }\n\n M[i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (let i = 0; i < N; ++i) {\n const W = new Uint32Array(80);\n\n for (let t = 0; t < 16; ++t) {\n W[t] = M[i][t];\n }\n\n for (let t = 16; t < 80; ++t) {\n W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n }\n\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n let e = H[4];\n\n for (let t = 0; t < 80; ++t) {\n const s = Math.floor(t / 20);\n const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nexport { _objectSpread2 as default };","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n INIT: \"@@redux/INIT\" + randomString(),\n REPLACE: \"@@redux/REPLACE\" + randomString(),\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n var proto = obj;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n var type = typeof val;\n\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n var constructorName = ctorName(val);\n\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n } // other\n\n\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n var typeOfVal = typeof val;\n\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n\n return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\n\n function getState() {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\n\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n var isSubscribed = true;\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n isSubscribed = false;\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n currentListeners = null;\n };\n }\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\n\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\n\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n }\n\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n\n dispatch({\n type: ActionTypes.REPLACE\n });\n }\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\n\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n } // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n\n\n dispatch({\n type: ActionTypes.INIT\n });\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n\n\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n }\n\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n }\n });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n // keys multiple times.\n\n var unexpectedKeyCache;\n\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError;\n\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination(state, action) {\n if (state === void 0) {\n state = {};\n }\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n\n if (typeof nextStateForKey === 'undefined') {\n var actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n }\n\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n }\n\n var boundActionCreators = {};\n\n for (var key in actionCreators) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n var store = createStore.apply(void 0, arguments);\n\n var _dispatch = function dispatch() {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(void 0, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\n return _objectSpread(_objectSpread({}, store), {}, {\n dispatch: _dispatch\n });\n };\n };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nconst v5 = v35('v5', 0x50, sha1);\nexport default v5;","var createSymbol = function createSymbol(name) {\n return \"@@redux-saga/\" + name;\n};\n\nvar CANCEL =\n/*#__PURE__*/\ncreateSymbol('CANCEL_PROMISE');\nvar CHANNEL_END_TYPE =\n/*#__PURE__*/\ncreateSymbol('CHANNEL_END');\nvar IO =\n/*#__PURE__*/\ncreateSymbol('IO');\nvar MATCH =\n/*#__PURE__*/\ncreateSymbol('MATCH');\nvar MULTICAST =\n/*#__PURE__*/\ncreateSymbol('MULTICAST');\nvar SAGA_ACTION =\n/*#__PURE__*/\ncreateSymbol('SAGA_ACTION');\nvar SELF_CANCELLATION =\n/*#__PURE__*/\ncreateSymbol('SELF_CANCELLATION');\nvar TASK =\n/*#__PURE__*/\ncreateSymbol('TASK');\nvar TASK_CANCEL =\n/*#__PURE__*/\ncreateSymbol('TASK_CANCEL');\nvar TERMINATE =\n/*#__PURE__*/\ncreateSymbol('TERMINATE');\nvar SAGA_LOCATION =\n/*#__PURE__*/\ncreateSymbol('LOCATION');\n\nexport { CANCEL, CHANNEL_END_TYPE, IO, MATCH, MULTICAST, SAGA_ACTION, SAGA_LOCATION, SELF_CANCELLATION, TASK, TASK_CANCEL, TERMINATE };\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","import { TASK, SAGA_ACTION, MULTICAST, IO } from '@redux-saga/symbols';\n\nvar undef = function undef(v) {\n return v === null || v === undefined;\n};\nvar notUndef = function notUndef(v) {\n return v !== null && v !== undefined;\n};\nvar func = function func(f) {\n return typeof f === 'function';\n};\nvar number = function number(n) {\n return typeof n === 'number';\n};\nvar string = function string(s) {\n return typeof s === 'string';\n};\nvar array = Array.isArray;\nvar object = function object(obj) {\n return obj && !array(obj) && typeof obj === 'object';\n};\nvar promise = function promise(p) {\n return p && func(p.then);\n};\nvar iterator = function iterator(it) {\n return it && func(it.next) && func(it.throw);\n};\nvar iterable = function iterable(it) {\n return it && func(Symbol) ? func(it[Symbol.iterator]) : array(it);\n};\nvar task = function task(t) {\n return t && t[TASK];\n};\nvar sagaAction = function sagaAction(a) {\n return Boolean(a && a[SAGA_ACTION]);\n};\nvar observable = function observable(ob) {\n return ob && func(ob.subscribe);\n};\nvar buffer = function buffer(buf) {\n return buf && func(buf.isEmpty) && func(buf.take) && func(buf.put);\n};\nvar pattern = function pattern(pat) {\n return pat && (string(pat) || symbol(pat) || func(pat) || array(pat) && pat.every(pattern));\n};\nvar channel = function channel(ch) {\n return ch && func(ch.take) && func(ch.close);\n};\nvar stringableFunc = function stringableFunc(f) {\n return func(f) && f.hasOwnProperty('toString');\n};\nvar symbol = function symbol(sym) {\n return Boolean(sym) && typeof Symbol === 'function' && sym.constructor === Symbol && sym !== Symbol.prototype;\n};\nvar multicast = function multicast(ch) {\n return channel(ch) && ch[MULTICAST];\n};\nvar effect = function effect(eff) {\n return eff && eff[IO];\n};\n\nexport { array, buffer, channel, effect, func, iterable, iterator, multicast, notUndef, number, object, observable, pattern, promise, sagaAction, string, stringableFunc, symbol, task, undef };\n","import { TASK_CANCEL, TERMINATE, SAGA_LOCATION, SAGA_ACTION, IO, SELF_CANCELLATION } from '@redux-saga/symbols';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport { array, notUndef, pattern, multicast, channel, undef, effect, task, func, buffer, string, object } from '@redux-saga/is';\nimport delayP from '@redux-saga/delay-p';\n\nvar konst = function konst(v) {\n return function () {\n return v;\n };\n};\nvar kTrue =\n/*#__PURE__*/\nkonst(true);\n\nvar noop = function noop() {};\n\nif (process.env.NODE_ENV !== 'production' && typeof Proxy !== 'undefined') {\n noop =\n /*#__PURE__*/\n new Proxy(noop, {\n set: function set() {\n throw internalErr('There was an attempt to assign a property to internal `noop` function.');\n }\n });\n}\nvar identity = function identity(v) {\n return v;\n};\nvar hasSymbol = typeof Symbol === 'function';\nvar asyncIteratorSymbol = hasSymbol && Symbol.asyncIterator ? Symbol.asyncIterator : '@@asyncIterator';\nfunction check(value, predicate, error) {\n if (!predicate(value)) {\n throw new Error(error);\n }\n}\nvar assignWithSymbols = function assignWithSymbols(target, source) {\n _extends(target, source);\n\n if (Object.getOwnPropertySymbols) {\n Object.getOwnPropertySymbols(source).forEach(function (s) {\n target[s] = source[s];\n });\n }\n};\nvar flatMap = function flatMap(mapper, arr) {\n var _ref;\n\n return (_ref = []).concat.apply(_ref, arr.map(mapper));\n};\nfunction remove(array, item) {\n var index = array.indexOf(item);\n\n if (index >= 0) {\n array.splice(index, 1);\n }\n}\nfunction once(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n\n called = true;\n fn();\n };\n}\n\nvar kThrow = function kThrow(err) {\n throw err;\n};\n\nvar kReturn = function kReturn(value) {\n return {\n value: value,\n done: true\n };\n};\n\nfunction makeIterator(next, thro, name) {\n if (thro === void 0) {\n thro = kThrow;\n }\n\n if (name === void 0) {\n name = 'iterator';\n }\n\n var iterator = {\n meta: {\n name: name\n },\n next: next,\n throw: thro,\n return: kReturn,\n isSagaIterator: true\n };\n\n if (typeof Symbol !== 'undefined') {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n}\nfunction logError(error, _ref2) {\n var sagaStack = _ref2.sagaStack;\n\n /*eslint-disable no-console*/\n console.error(error);\n console.error(sagaStack);\n}\nvar internalErr = function internalErr(err) {\n return new Error(\"\\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\\n Error: \" + err + \"\\n\");\n};\nvar createSetContextWarning = function createSetContextWarning(ctx, props) {\n return (ctx ? ctx + '.' : '') + \"setContext(props): argument \" + props + \" is not a plain object\";\n};\nvar FROZEN_ACTION_ERROR = \"You can't put (a.k.a. dispatch from saga) frozen actions.\\nWe have to define a special non-enumerable property on those actions for scheduling purposes.\\nOtherwise you wouldn't be able to communicate properly between sagas & other subscribers (action ordering would become far less predictable).\\nIf you are using redux and you care about this behaviour (frozen actions),\\nthen you might want to switch to freezing actions in a middleware rather than in action creator.\\nExample implementation:\\n\\nconst freezeActions = store => next => action => next(Object.freeze(action))\\n\"; // creates empty, but not-holey array\n\nvar createEmptyArray = function createEmptyArray(n) {\n return Array.apply(null, new Array(n));\n};\nvar wrapSagaDispatch = function wrapSagaDispatch(dispatch) {\n return function (action) {\n if (process.env.NODE_ENV !== 'production') {\n check(action, function (ac) {\n return !Object.isFrozen(ac);\n }, FROZEN_ACTION_ERROR);\n }\n\n return dispatch(Object.defineProperty(action, SAGA_ACTION, {\n value: true\n }));\n };\n};\nvar shouldTerminate = function shouldTerminate(res) {\n return res === TERMINATE;\n};\nvar shouldCancel = function shouldCancel(res) {\n return res === TASK_CANCEL;\n};\nvar shouldComplete = function shouldComplete(res) {\n return shouldTerminate(res) || shouldCancel(res);\n};\nfunction createAllStyleChildCallbacks(shape, parentCallback) {\n var keys = Object.keys(shape);\n var totalCount = keys.length;\n\n if (process.env.NODE_ENV !== 'production') {\n check(totalCount, function (c) {\n return c > 0;\n }, 'createAllStyleChildCallbacks: get an empty array or object');\n }\n\n var completedCount = 0;\n var completed;\n var results = array(shape) ? createEmptyArray(totalCount) : {};\n var childCallbacks = {};\n\n function checkEnd() {\n if (completedCount === totalCount) {\n completed = true;\n parentCallback(results);\n }\n }\n\n keys.forEach(function (key) {\n var chCbAtKey = function chCbAtKey(res, isErr) {\n if (completed) {\n return;\n }\n\n if (isErr || shouldComplete(res)) {\n parentCallback.cancel();\n parentCallback(res, isErr);\n } else {\n results[key] = res;\n completedCount++;\n checkEnd();\n }\n };\n\n chCbAtKey.cancel = noop;\n childCallbacks[key] = chCbAtKey;\n });\n\n parentCallback.cancel = function () {\n if (!completed) {\n completed = true;\n keys.forEach(function (key) {\n return childCallbacks[key].cancel();\n });\n }\n };\n\n return childCallbacks;\n}\nfunction getMetaInfo(fn) {\n return {\n name: fn.name || 'anonymous',\n location: getLocation(fn)\n };\n}\nfunction getLocation(instrumented) {\n return instrumented[SAGA_LOCATION];\n}\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\nvar BUFFER_OVERFLOW = \"Channel's Buffer overflow!\";\nvar ON_OVERFLOW_THROW = 1;\nvar ON_OVERFLOW_DROP = 2;\nvar ON_OVERFLOW_SLIDE = 3;\nvar ON_OVERFLOW_EXPAND = 4;\nvar zeroBuffer = {\n isEmpty: kTrue,\n put: noop,\n take: noop\n};\n\nfunction ringBuffer(limit, overflowAction) {\n if (limit === void 0) {\n limit = 10;\n }\n\n var arr = new Array(limit);\n var length = 0;\n var pushIndex = 0;\n var popIndex = 0;\n\n var push = function push(it) {\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n length++;\n };\n\n var take = function take() {\n if (length != 0) {\n var it = arr[popIndex];\n arr[popIndex] = null;\n length--;\n popIndex = (popIndex + 1) % limit;\n return it;\n }\n };\n\n var flush = function flush() {\n var items = [];\n\n while (length) {\n items.push(take());\n }\n\n return items;\n };\n\n return {\n isEmpty: function isEmpty() {\n return length == 0;\n },\n put: function put(it) {\n if (length < limit) {\n push(it);\n } else {\n var doubledLimit;\n\n switch (overflowAction) {\n case ON_OVERFLOW_THROW:\n throw new Error(BUFFER_OVERFLOW);\n\n case ON_OVERFLOW_SLIDE:\n arr[pushIndex] = it;\n pushIndex = (pushIndex + 1) % limit;\n popIndex = pushIndex;\n break;\n\n case ON_OVERFLOW_EXPAND:\n doubledLimit = 2 * limit;\n arr = flush();\n length = arr.length;\n pushIndex = arr.length;\n popIndex = 0;\n arr.length = doubledLimit;\n limit = doubledLimit;\n push(it);\n break;\n\n default: // DROP\n\n }\n }\n },\n take: take,\n flush: flush\n };\n}\n\nvar none = function none() {\n return zeroBuffer;\n};\nvar fixed = function fixed(limit) {\n return ringBuffer(limit, ON_OVERFLOW_THROW);\n};\nvar dropping = function dropping(limit) {\n return ringBuffer(limit, ON_OVERFLOW_DROP);\n};\nvar sliding = function sliding(limit) {\n return ringBuffer(limit, ON_OVERFLOW_SLIDE);\n};\nvar expanding = function expanding(initialSize) {\n return ringBuffer(initialSize, ON_OVERFLOW_EXPAND);\n};\n\nvar buffers = /*#__PURE__*/Object.freeze({\n __proto__: null,\n none: none,\n fixed: fixed,\n dropping: dropping,\n sliding: sliding,\n expanding: expanding\n});\n\nvar TAKE = 'TAKE';\nvar PUT = 'PUT';\nvar ALL = 'ALL';\nvar RACE = 'RACE';\nvar CALL = 'CALL';\nvar CPS = 'CPS';\nvar FORK = 'FORK';\nvar JOIN = 'JOIN';\nvar CANCEL = 'CANCEL';\nvar SELECT = 'SELECT';\nvar ACTION_CHANNEL = 'ACTION_CHANNEL';\nvar CANCELLED = 'CANCELLED';\nvar FLUSH = 'FLUSH';\nvar GET_CONTEXT = 'GET_CONTEXT';\nvar SET_CONTEXT = 'SET_CONTEXT';\n\nvar effectTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n TAKE: TAKE,\n PUT: PUT,\n ALL: ALL,\n RACE: RACE,\n CALL: CALL,\n CPS: CPS,\n FORK: FORK,\n JOIN: JOIN,\n CANCEL: CANCEL,\n SELECT: SELECT,\n ACTION_CHANNEL: ACTION_CHANNEL,\n CANCELLED: CANCELLED,\n FLUSH: FLUSH,\n GET_CONTEXT: GET_CONTEXT,\n SET_CONTEXT: SET_CONTEXT\n});\n\nvar TEST_HINT = '\\n(HINT: if you are getting these errors in tests, consider using createMockTask from @redux-saga/testing-utils)';\n\nvar makeEffect = function makeEffect(type, payload) {\n var _ref;\n\n return _ref = {}, _ref[IO] = true, _ref.combinator = false, _ref.type = type, _ref.payload = payload, _ref;\n};\n\nvar isForkEffect = function isForkEffect(eff) {\n return effect(eff) && eff.type === FORK;\n};\n\nvar detach = function detach(eff) {\n if (process.env.NODE_ENV !== 'production') {\n check(eff, isForkEffect, 'detach(eff): argument must be a fork effect');\n }\n\n return makeEffect(FORK, _extends({}, eff.payload, {\n detached: true\n }));\n};\nfunction take(patternOrChannel, multicastPattern) {\n if (patternOrChannel === void 0) {\n patternOrChannel = '*';\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'take(patternOrChannel): patternOrChannel is undefined');\n }\n\n if (pattern(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(pattern) takes one argument but two were provided. Consider passing an array for listening to several action types\");\n }\n\n return makeEffect(TAKE, {\n pattern: patternOrChannel\n });\n }\n\n if (multicast(patternOrChannel) && notUndef(multicastPattern) && pattern(multicastPattern)) {\n return makeEffect(TAKE, {\n channel: patternOrChannel,\n pattern: multicastPattern\n });\n }\n\n if (channel(patternOrChannel)) {\n if (notUndef(multicastPattern)) {\n /* eslint-disable no-console */\n console.warn(\"take(channel) takes one argument but two were provided. Second argument is ignored.\");\n }\n\n return makeEffect(TAKE, {\n channel: patternOrChannel\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\"take(patternOrChannel): argument \" + patternOrChannel + \" is not valid channel or a valid pattern\");\n }\n}\nvar takeMaybe = function takeMaybe() {\n var eff = take.apply(void 0, arguments);\n eff.payload.maybe = true;\n return eff;\n};\nfunction put(channel$1, action) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n check(channel$1, notUndef, 'put(channel, action): argument channel is undefined');\n check(channel$1, channel, \"put(channel, action): argument \" + channel$1 + \" is not a valid channel\");\n check(action, notUndef, 'put(channel, action): argument action is undefined');\n } else {\n check(channel$1, notUndef, 'put(action): argument action is undefined');\n }\n }\n\n if (undef(action)) {\n action = channel$1; // `undefined` instead of `null` to make default parameter work\n\n channel$1 = undefined;\n }\n\n return makeEffect(PUT, {\n channel: channel$1,\n action: action\n });\n}\nvar putResolve = function putResolve() {\n var eff = put.apply(void 0, arguments);\n eff.payload.resolve = true;\n return eff;\n};\nfunction all(effects) {\n var eff = makeEffect(ALL, effects);\n eff.combinator = true;\n return eff;\n}\nfunction race(effects) {\n var eff = makeEffect(RACE, effects);\n eff.combinator = true;\n return eff;\n} // this match getFnCallDescriptor logic\n\nvar validateFnDescriptor = function validateFnDescriptor(effectName, fnDescriptor) {\n check(fnDescriptor, notUndef, effectName + \": argument fn is undefined or null\");\n\n if (func(fnDescriptor)) {\n return;\n }\n\n var context = null;\n var fn;\n\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n check(fn, notUndef, effectName + \": argument of type [context, fn] has undefined or null `fn`\");\n } else if (object(fnDescriptor)) {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n check(fn, notUndef, effectName + \": argument of type {context, fn} has undefined or null `fn`\");\n } else {\n check(fnDescriptor, func, effectName + \": argument fn is not function\");\n return;\n }\n\n if (context && string(fn)) {\n check(context[fn], func, effectName + \": context arguments has no such method - \\\"\" + fn + \"\\\"\");\n return;\n }\n\n check(fn, func, effectName + \": unpacked fn argument (from [context, fn] or {context, fn}) is not a function\");\n};\n\nfunction getFnCallDescriptor(fnDescriptor, args) {\n var context = null;\n var fn;\n\n if (func(fnDescriptor)) {\n fn = fnDescriptor;\n } else {\n if (array(fnDescriptor)) {\n context = fnDescriptor[0];\n fn = fnDescriptor[1];\n } else {\n context = fnDescriptor.context;\n fn = fnDescriptor.fn;\n }\n\n if (context && string(fn) && func(context[fn])) {\n fn = context[fn];\n }\n }\n\n return {\n context: context,\n fn: fn,\n args: args\n };\n}\n\nvar isNotDelayEffect = function isNotDelayEffect(fn) {\n return fn !== delay;\n};\n\nfunction call(fnDescriptor) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var arg0 = typeof args[0] === 'number' ? args[0] : 'ms';\n check(fnDescriptor, isNotDelayEffect, \"instead of writing `yield call(delay, \" + arg0 + \")` where delay is an effect from `redux-saga/effects` you should write `yield delay(\" + arg0 + \")`\");\n validateFnDescriptor('call', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction apply(context, fn, args) {\n if (args === void 0) {\n args = [];\n }\n\n var fnDescriptor = [context, fn];\n\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('apply', fnDescriptor);\n }\n\n return makeEffect(CALL, getFnCallDescriptor([context, fn], args));\n}\nfunction cps(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('cps', fnDescriptor);\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return makeEffect(CPS, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction fork(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('fork', fnDescriptor);\n check(fnDescriptor, function (arg) {\n return !effect(arg);\n }, 'fork: argument must not be an effect');\n }\n\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n return makeEffect(FORK, getFnCallDescriptor(fnDescriptor, args));\n}\nfunction spawn(fnDescriptor) {\n if (process.env.NODE_ENV !== 'production') {\n validateFnDescriptor('spawn', fnDescriptor);\n }\n\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n\n return detach(fork.apply(void 0, [fnDescriptor].concat(args)));\n}\nfunction join(taskOrTasks) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('join(...tasks) is not supported any more. Please use join([...tasks]) to join multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"join([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else {\n check(taskOrTasks, task, \"join(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(JOIN, taskOrTasks);\n}\nfunction cancel(taskOrTasks) {\n if (taskOrTasks === void 0) {\n taskOrTasks = SELF_CANCELLATION;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n throw new Error('cancel(...tasks) is not supported any more. Please use cancel([...tasks]) to cancel multiple tasks.');\n }\n\n if (array(taskOrTasks)) {\n taskOrTasks.forEach(function (t) {\n check(t, task, \"cancel([...tasks]): argument \" + t + \" is not a valid Task object \" + TEST_HINT);\n });\n } else if (taskOrTasks !== SELF_CANCELLATION && notUndef(taskOrTasks)) {\n check(taskOrTasks, task, \"cancel(task): argument \" + taskOrTasks + \" is not a valid Task object \" + TEST_HINT);\n }\n }\n\n return makeEffect(CANCEL, taskOrTasks);\n}\nfunction select(selector) {\n if (selector === void 0) {\n selector = identity;\n }\n\n for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n args[_key5 - 1] = arguments[_key5];\n }\n\n if (process.env.NODE_ENV !== 'production' && arguments.length) {\n check(arguments[0], notUndef, 'select(selector, [...]): argument selector is undefined');\n check(selector, func, \"select(selector, [...]): argument \" + selector + \" is not a function\");\n }\n\n return makeEffect(SELECT, {\n selector: selector,\n args: args\n });\n}\n/**\n channel(pattern, [buffer]) => creates a proxy channel for store actions\n**/\n\nfunction actionChannel(pattern$1, buffer$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(pattern$1, pattern, 'actionChannel(pattern,...): argument pattern is not valid');\n\n if (arguments.length > 1) {\n check(buffer$1, notUndef, 'actionChannel(pattern, buffer): argument buffer is undefined');\n check(buffer$1, buffer, \"actionChannel(pattern, buffer): argument \" + buffer$1 + \" is not a valid buffer\");\n }\n }\n\n return makeEffect(ACTION_CHANNEL, {\n pattern: pattern$1,\n buffer: buffer$1\n });\n}\nfunction cancelled() {\n return makeEffect(CANCELLED, {});\n}\nfunction flush(channel$1) {\n if (process.env.NODE_ENV !== 'production') {\n check(channel$1, channel, \"flush(channel): argument \" + channel$1 + \" is not valid channel\");\n }\n\n return makeEffect(FLUSH, channel$1);\n}\nfunction getContext(prop) {\n if (process.env.NODE_ENV !== 'production') {\n check(prop, string, \"getContext(prop): argument \" + prop + \" is not a string\");\n }\n\n return makeEffect(GET_CONTEXT, prop);\n}\nfunction setContext(props) {\n if (process.env.NODE_ENV !== 'production') {\n check(props, object, createSetContextWarning(null, props));\n }\n\n return makeEffect(SET_CONTEXT, props);\n}\nvar delay =\n/*#__PURE__*/\ncall.bind(null, delayP);\n\nexport { all as $, ALL as A, compose as B, CALL as C, logError as D, wrapSagaDispatch as E, FORK as F, GET_CONTEXT as G, identity as H, buffers as I, JOIN as J, detach as K, take as L, fork as M, cancel as N, call as O, PUT as P, delay as Q, RACE as R, SELECT as S, TAKE as T, actionChannel as U, sliding as V, race as W, effectTypes as X, takeMaybe as Y, put as Z, putResolve as _, CPS as a, apply as a0, cps as a1, spawn as a2, join as a3, select as a4, cancelled as a5, flush as a6, getContext as a7, setContext as a8, 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 compose, D as logError, E as wrapSagaDispatch, H as identity } from './io-22ea0cf9.js';\nexport { I as buffers, K as detach } from './io-22ea0cf9.js';\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","'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) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\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(\n (event) => `${PRODUCT_PREFIX_VIDEO}.${event}`\n);\n\n// src/utils/logger.ts\nimport log from \"loglevel\";\nvar datetime = () => (/* @__PURE__ */ new Date()).toISOString();\nvar defaultLogger = log.getLogger(\"signalwire\");\nvar originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n return function(...args) {\n args.unshift(datetime(), \"-\");\n rawMethod.apply(void 0, args);\n };\n};\nvar defaultLoggerLevel = (\n // @ts-ignore\n \"development\" === process.env.NODE_ENV ? defaultLogger.levels.DEBUG : defaultLogger.getLevel()\n);\ndefaultLogger.setLevel(defaultLoggerLevel);\nvar userLogger;\nvar setLogger = (logger) => {\n userLogger = logger;\n};\nvar debugOptions = {};\nvar setDebugOptions = (options) => {\n if (options == null) {\n debugOptions = {};\n return;\n }\n Object.assign(debugOptions, options);\n};\nvar getLoggerInstance = () => {\n return userLogger != null ? userLogger : defaultLogger;\n};\nvar shouldStringify = (payload) => {\n if (\"method\" in payload && payload.method === \"signalwire.ping\") {\n return false;\n }\n return true;\n};\nvar wsTraffic = ({ type, payload }) => {\n const logger = getLoggerInstance();\n const { logWsTraffic } = debugOptions || {};\n if (!logWsTraffic) {\n return void 0;\n }\n const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;\n return logger.info(`${type.toUpperCase()}: \n`, msg, \"\\n\");\n};\nvar getLogger = () => {\n const logger = getLoggerInstance();\n return new Proxy(logger, {\n get(target, prop, receiver) {\n if (prop === \"wsTraffic\") {\n return wsTraffic;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n};\n\n// src/utils/common.ts\nvar UPPERCASE_REGEX = /[A-Z]/g;\nvar fromCamelToSnakeCase = (event) => {\n return event.replace(UPPERCASE_REGEX, (letter) => {\n return `_${letter.toLowerCase()}`;\n });\n};\nvar WEBRTC_EVENT_TYPES = [\n \"webrtc.message\"\n // 'webrtc.verto',\n];\nvar isWebrtcEventType = (eventType) => {\n return WEBRTC_EVENT_TYPES.includes(eventType);\n};\n\n// src/utils/index.ts\nimport { v4 } from \"uuid\";\n\n// src/utils/parseRPCResponse.ts\nvar parseRPCResponse = ({\n response,\n request\n}) => {\n const { result = {}, error } = response;\n if (error) {\n return {\n error\n };\n }\n switch (request.method) {\n case \"signalwire.connect\":\n return { result };\n default:\n return parseResponse(response);\n }\n};\nvar whitelistCodeRegex = /^2[0-9][0-9]$/;\nvar parseResponse = (response, nodeId) => {\n const { result = {}, error } = response;\n if (error) {\n return { error };\n }\n const { code, node_id, result: nestedResult = null } = result;\n if (code && !whitelistCodeRegex.test(code)) {\n return { error: result };\n }\n if (nestedResult === null) {\n if (nodeId) {\n result.node_id = nodeId;\n }\n return { result };\n }\n if (nestedResult) {\n if (nestedResult.jsonrpc) {\n return parseResponse(nestedResult, node_id);\n }\n return { result: nestedResult };\n }\n return { result };\n};\n\n// src/utils/toExternalJSON.ts\nvar toDateObject = (timestamp) => {\n if (typeof timestamp === \"undefined\") {\n return timestamp;\n }\n const date = new Date(timestamp * 1e3);\n if (isNaN(date.getTime())) {\n return timestamp;\n }\n return date;\n};\nvar DEFAULT_OPTIONS = {\n /**\n * Properties coming from the server where their value will be\n * converted to camelCase\n */\n propsToUpdateValue: [\n \"updated\",\n \"layers\",\n \"members\",\n \"recordings\",\n \"playbacks\"\n ]\n};\nvar isTimestampProperty = (prop) => {\n return prop.endsWith(\"At\");\n};\nvar toExternalJSON = (input, options = DEFAULT_OPTIONS) => {\n if ((input == null ? void 0 : input.__sw_symbol) || (input == null ? void 0 : input.__sw_proxy)) {\n return input;\n }\n return Object.entries(input).reduce((reducer, [key, value]) => {\n const prop = fromSnakeToCamelCase(key);\n const propType = typeof value;\n if (propType === \"object\" && value) {\n if (Array.isArray(value)) {\n if (options.propsToUpdateValue.includes(key)) {\n reducer[prop] = value.map((v) => {\n if (typeof v === \"string\") {\n return fromSnakeToCamelCase(v);\n }\n return toExternalJSON(v);\n });\n } else {\n reducer[prop] = value;\n }\n } else {\n reducer[prop] = toExternalJSON(value);\n }\n } else {\n if (isTimestampProperty(prop)) {\n reducer[prop] = toDateObject(value);\n } else {\n reducer[prop] = value;\n }\n }\n return reducer;\n }, {});\n};\nvar fromSnakeToCamelCase = (input) => {\n if (!input.includes(\"_\")) {\n return input;\n }\n return input.split(\"_\").reduce((reducer, part, index) => {\n const fc = part.trim().charAt(0);\n const remainingChars = part.substr(1).toLowerCase();\n return `${reducer}${index === 0 ? fc.toLowerCase() : fc.toUpperCase()}${remainingChars}`;\n }, \"\");\n};\n\n// src/utils/toInternalEventName.ts\nvar toInternalEventName = ({\n event,\n namespace\n}) => {\n if (typeof event === \"string\") {\n event = getNamespacedEvent({\n event,\n namespace\n });\n event = fromCamelToSnakeCase(event);\n }\n return event;\n};\nvar getNamespacedEvent = ({\n namespace,\n event\n}) => {\n if (!namespace || event.startsWith(namespace)) {\n return event;\n }\n return `${namespace}${EVENT_NAMESPACE_DIVIDER}${event}`;\n};\n\n// src/utils/toInternalAction.ts\nvar toInternalAction = (event) => {\n const { event_type, params, node_id } = event;\n if (event_type === \"queuing.relay.tasks\") {\n return {\n type: event_type,\n payload: event\n };\n }\n if (isWebrtcEventType(event_type) && (params == null ? void 0 : params.jsonrpc)) {\n const vertoRPC = params;\n if (vertoRPC.params) {\n vertoRPC.params.nodeId = node_id;\n }\n return {\n type: event_type,\n payload: vertoRPC\n };\n }\n return {\n type: event_type,\n payload: params\n };\n};\n\n// src/utils/toSnakeCaseKeys.ts\nvar toSnakeCaseKeys = (obj, transform = (value) => value, result = {}) => {\n if (Array.isArray(obj)) {\n result = obj.map((item, index) => {\n if (typeof item === \"object\") {\n return toSnakeCaseKeys(item, transform, result[index]);\n }\n return item;\n });\n } else {\n Object.keys(obj).forEach((key) => {\n const newKey = fromCamelToSnakeCase(key);\n if (obj[key] && typeof obj[key] === \"object\") {\n result[newKey] = toSnakeCaseKeys(obj[key], transform, result[newKey]);\n } else {\n result[newKey] = transform(obj[key]);\n }\n });\n }\n return result;\n};\n\n// src/utils/extendComponent.ts\nvar extendComponent = (klass, methods) => {\n Object.keys(methods).forEach((methodName) => {\n if (klass.prototype.hasOwnProperty(methodName)) {\n throw new Error(`[extendComponent] Duplicated method name: ${methodName}`);\n }\n });\n Object.defineProperties(klass.prototype, methods);\n return klass;\n};\n\n// src/utils/debounce.ts\nfunction debounce(fn, wait2 = 0, callFirst) {\n let timeout = null;\n let debouncedFn = null;\n const clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n debouncedFn = null;\n timeout = null;\n }\n };\n const flush = function() {\n const call4 = debouncedFn;\n clear();\n if (call4) {\n call4();\n }\n };\n const debounceWrapper = function() {\n if (!wait2) {\n return fn.apply(this, arguments);\n }\n const context = this;\n const args = arguments;\n const callNow = callFirst && !timeout;\n clear();\n debouncedFn = function() {\n fn.apply(context, args);\n };\n timeout = setTimeout(function() {\n timeout = null;\n if (!callNow) {\n const call4 = debouncedFn;\n debouncedFn = null;\n return call4 == null ? void 0 : call4();\n }\n }, wait2);\n if (callNow && debouncedFn) {\n return debouncedFn();\n }\n };\n debounceWrapper.cancel = clear;\n debounceWrapper.flush = flush;\n return debounceWrapper;\n}\n\n// src/utils/SWCloseEvent.ts\nvar SWCloseEvent = class {\n constructor(type, options = {}) {\n this.type = type;\n __publicField(this, \"code\");\n __publicField(this, \"reason\");\n __publicField(this, \"wasClean\");\n this.code = options.code === void 0 ? 0 : options.code;\n this.reason = options.reason === void 0 ? \"\" : options.reason;\n this.wasClean = options.wasClean === void 0 ? false : options.wasClean;\n }\n};\n\n// src/utils/eventUtils.ts\nvar stripNamespacePrefix = (event, namespace) => {\n if (namespace && typeof namespace === \"string\") {\n const regex = new RegExp(`^${namespace}.`);\n return event.replace(regex, \"\");\n }\n const items = event.split(\".\");\n if (items.length > 1) {\n items.shift();\n return items.join(\".\");\n }\n return event;\n};\n\n// src/utils/index.ts\nvar safeParseJson = (value) => {\n if (typeof value !== \"string\") {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch (error) {\n return value;\n }\n};\nvar PROTOCOL_PATTERN = /^(ws|wss):\\/\\//;\nvar checkWebSocketHost = (host) => {\n const protocol = PROTOCOL_PATTERN.test(host) ? \"\" : \"wss://\";\n return `${protocol}${host}`;\n};\nvar timeoutPromise = (promise, time, exception) => {\n let timer = null;\n return Promise.race([\n promise,\n new Promise(\n (_resolve, reject) => timer = setTimeout(reject, time, exception)\n )\n ]).finally(() => clearTimeout(timer));\n};\nvar isGlobalEvent = (event) => {\n return GLOBAL_VIDEO_EVENTS.includes(event);\n};\nvar isSyntheticEvent = (event) => {\n return event.includes(SYNTHETIC_EVENT_PREFIX);\n};\nvar isSessionEvent = (event) => {\n return event.includes(\"session.\");\n};\nvar cleanupEventNamespace = (event) => {\n const eventParts = event.split(EVENT_NAMESPACE_DIVIDER);\n return eventParts[eventParts.length - 1];\n};\nvar WITH_CUSTOM_EVENT_NAMES = [\n \"video.member.updated\",\n \"video.member.talking\"\n];\nvar CLIENT_SIDE_EVENT_NAMES = [\n \"video.room.joined\",\n // generated client-side\n \"video.track\",\n \"video.active\",\n \"video.answering\",\n \"video.destroy\",\n \"video.early\",\n \"video.hangup\",\n \"video.held\",\n \"video.new\",\n \"video.purge\",\n \"video.recovering\",\n \"video.requesting\",\n \"video.ringing\",\n \"video.trying\",\n \"video.media.connected\",\n \"video.media.reconnecting\",\n \"video.media.disconnected\",\n \"video.microphone.updated\",\n \"video.camera.updated\",\n \"video.speaker.updated\",\n \"video.microphone.disconnected\",\n \"video.camera.disconnected\",\n \"video.speaker.disconnected\"\n];\nvar validateEventsToSubscribe = (events) => {\n const valid = events.map((internalEvent) => {\n if (typeof internalEvent === \"string\") {\n const event = cleanupEventNamespace(internalEvent);\n if (CLIENT_SIDE_EVENT_NAMES.includes(event) || isSyntheticEvent(event) || isLocalEvent(event) || isSessionEvent(event)) {\n return null;\n }\n const found = WITH_CUSTOM_EVENT_NAMES.find((withCustomName) => {\n return event.startsWith(withCustomName);\n });\n return found || event;\n }\n return internalEvent;\n });\n return Array.from(new Set(valid)).filter(Boolean);\n};\nvar isLocalEvent = (event) => {\n return event.includes(LOCAL_EVENT_PREFIX);\n};\nvar toLocalEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(LOCAL_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar toSyntheticEvent = (event) => {\n const eventParts = event.split(\".\");\n const prefix = eventParts[0];\n return event.split(\".\").reduce((reducer, item) => {\n reducer.push(item);\n if (item === prefix) {\n reducer.push(SYNTHETIC_EVENT_PREFIX);\n }\n return reducer;\n }, []).join(\".\");\n};\nvar isJSONRPCRequest = (e) => {\n return Boolean(e.method);\n};\nvar isJSONRPCResponse = (e) => {\n return !isJSONRPCRequest(e);\n};\nvar isSATAuth = (e) => {\n return typeof e !== \"undefined\" && \"jti\" in e;\n};\n\n// src/RPCMessages/helpers.ts\nvar makeRPCRequest = (params) => {\n var _a;\n return __spreadValues({\n jsonrpc: \"2.0\",\n id: (_a = params.id) != null ? _a : v4()\n }, params);\n};\nvar makeRPCResponse = (params) => {\n return __spreadValues({\n jsonrpc: \"2.0\"\n }, params);\n};\n\n// src/RPCMessages/RPCConnect.ts\nvar DEFAULT_CONNECT_VERSION = {\n major: 3,\n minor: 0,\n revision: 0\n};\nvar UNIFIED_CONNECT_VERSION = {\n major: 4,\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 event_acks: true\n }, params)\n });\n};\n\n// src/RPCMessages/RPCReauthenticate.ts\nvar RPCReauthenticate = (authentication) => {\n return makeRPCRequest({\n method: \"signalwire.reauthenticate\",\n params: {\n authentication\n }\n });\n};\n\n// src/RPCMessages/RPCPing.ts\nvar RPCPing = () => {\n return makeRPCRequest({\n method: \"signalwire.ping\",\n params: {\n timestamp: Date.now() / 1e3\n }\n });\n};\nvar RPCPingResponse = (id, timestamp) => {\n return makeRPCResponse({\n id,\n result: {\n timestamp: timestamp || Date.now() / 1e3\n }\n });\n};\n\n// src/RPCMessages/RPCExecute.ts\nvar RPCExecute = ({ method, params }) => {\n return makeRPCRequest({\n method,\n params\n });\n};\n\n// src/RPCMessages/RPCDisconnect.ts\nvar RPCDisconnectResponse = (id) => {\n return makeRPCResponse({\n id,\n result: {}\n });\n};\n\n// src/RPCMessages/VertoMessages.ts\nvar tmpMap = {\n id: \"callID\",\n destinationNumber: \"destination_number\",\n remoteCallerName: \"remote_caller_id_name\",\n remoteCallerNumber: \"remote_caller_id_number\",\n callerName: \"caller_id_name\",\n callerNumber: \"caller_id_number\"\n};\nvar filterVertoParams = (params) => {\n if (params.hasOwnProperty(\"dialogParams\")) {\n const _a = params.dialogParams, {\n remoteSdp,\n localStream,\n remoteStream\n } = _a, dialogParams = __objRest(_a, [\n \"remoteSdp\",\n \"localStream\",\n \"remoteStream\"\n ]);\n for (const key in tmpMap) {\n if (key && dialogParams.hasOwnProperty(key)) {\n dialogParams[tmpMap[key]] = dialogParams[key];\n delete dialogParams[key];\n }\n }\n params.dialogParams = dialogParams;\n }\n return params;\n};\nvar buildVertoRPCMessage = (method) => {\n return (params = {}) => {\n return makeRPCRequest({\n method,\n params: filterVertoParams(params)\n });\n };\n};\nvar VertoInvite = buildVertoRPCMessage(\"verto.invite\");\nvar VertoBye = buildVertoRPCMessage(\"verto.bye\");\nvar VertoAttach = buildVertoRPCMessage(\"verto.attach\");\nvar VertoModify = buildVertoRPCMessage(\"verto.modify\");\nvar VertoInfo = buildVertoRPCMessage(\"verto.info\");\nvar VertoAnswer = buildVertoRPCMessage(\"verto.answer\");\nvar VertoSubscribe = buildVertoRPCMessage(\"verto.subscribe\");\nvar VertoPong = buildVertoRPCMessage(\"verto.pong\");\nvar VertoResult = (id, method) => {\n return makeRPCResponse({\n id,\n result: {\n method\n }\n });\n};\n\n// src/RPCMessages/RPCEventAck.ts\nvar RPCEventAckResponse = (id) => makeRPCResponse({ id, result: {} });\n\n// src/redux/actions.ts\nvar actions_exports = {};\n__export(actions_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n createAction: () => createAction,\n destroyAction: () => destroyAction,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\n\n// src/redux/toolkit/index.ts\nvar toolkit_exports = {};\n__export(toolkit_exports, {\n configureStore: () => configureStore,\n createAction: () => createAction\n});\n__reExport(toolkit_exports, redux_star);\nimport * as redux_star from \"redux\";\n\n// src/redux/toolkit/createAction.ts\nfunction createAction(type, prepareAction) {\n function actionCreator(...args) {\n if (prepareAction) {\n let prepared = prepareAction(...args);\n if (!prepared) {\n throw new Error(\"prepareAction did not return an object\");\n }\n return __spreadValues(__spreadValues({\n type,\n payload: prepared.payload\n }, \"meta\" in prepared && { meta: prepared.meta }), \"error\" in prepared && { error: prepared.error });\n }\n return { type, payload: args[0] };\n }\n actionCreator.toString = () => `${type}`;\n actionCreator.type = type;\n actionCreator.match = (action) => action.type === type;\n return actionCreator;\n}\n\n// src/redux/toolkit/configureStore.ts\nimport { createStore, compose as compose2, applyMiddleware, combineReducers } from \"redux\";\n\n// src/redux/toolkit/devtoolsExtension.ts\nimport { compose } from \"redux\";\nvar composeWithDevTools = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {\n if (arguments.length === 0) return void 0;\n if (typeof arguments[0] === \"object\") 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) return false;\n let proto = Object.getPrototypeOf(value);\n if (proto === null) 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(\n '\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'\n );\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(\n \"when using a middleware builder function, an array of middleware must be returned\"\n );\n }\n }\n if (!IS_PRODUCTION && finalMiddleware.some((item) => typeof item !== \"function\")) {\n throw new Error(\n \"each middleware provided to configureStore must be a function\"\n );\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n let finalCompose = compose2;\n if (devTools) {\n finalCompose = composeWithDevTools(__spreadValues({\n // Enable capture of stack traces for dispatched Redux actions\n trace: !IS_PRODUCTION\n }, typeof devTools === \"object\" && devTools));\n }\n let storeEnhancers = [middlewareEnhancer];\n if (Array.isArray(enhancers)) {\n storeEnhancers = [middlewareEnhancer, ...enhancers];\n } else if (typeof enhancers === \"function\") {\n storeEnhancers = enhancers(storeEnhancers);\n }\n const composedEnhancer = finalCompose(...storeEnhancers);\n return createStore(rootReducer2, preloadedState, composedEnhancer);\n}\n\n// src/redux/actions.ts\nvar initAction = createAction(\"swSdk/init\");\nvar destroyAction = createAction(\"swSdk/destroy\");\nvar reauthAction = createAction(\"swSdk/reauth\");\nvar authErrorAction = createAction(\n \"auth/error\"\n);\nvar authSuccessAction = createAction(\"auth/success\");\nvar authExpiringAction = createAction(\"auth/expiring\");\nvar socketMessageAction = createAction(\n \"socket/message\"\n);\nvar sessionDisconnectedAction = createAction(\n \"session.disconnected\"\n);\nvar sessionReconnectingAction = createAction(\n \"session.reconnecting\"\n);\nvar sessionForceCloseAction = createAction(\n \"session.forceClose\"\n);\nvar formatCustomSagaAction = (id, action) => {\n return `${action.type}/${id}`;\n};\nvar makeCustomSagaAction = (id, action) => {\n return __spreadProps(__spreadValues({}, action), {\n type: formatCustomSagaAction(id, action)\n });\n};\nvar getCustomSagaActionType = (id, action) => {\n return formatCustomSagaAction(id, action);\n};\n\n// src/redux/toolkit/mapBuilders.ts\nfunction executeReducerBuilderCallback(builderCallback) {\n const actionsMap = {};\n const actionMatchers = [];\n let defaultCaseReducer;\n const builder = {\n addCase(typeOrActionCreator, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (actionMatchers.length > 0) {\n throw new Error(\n \"`builder.addCase` should only be called before calling `builder.addMatcher`\"\n );\n }\n if (defaultCaseReducer) {\n throw new Error(\n \"`builder.addCase` should only be called before calling `builder.addDefaultCase`\"\n );\n }\n }\n const type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\n if (type in actionsMap) {\n throw new Error(\n \"addCase cannot be called with two reducers for the same action type\"\n );\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(\n \"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\"\n );\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(\n initialState,\n finalCaseReducers,\n actionMatchers,\n defaultCaseReducer\n );\n }\n let _reducer;\n return {\n name,\n reducer(state, action) {\n if (!_reducer) _reducer = buildReducer();\n return _reducer(state, action);\n },\n actions: actionCreators,\n caseReducers: sliceCaseReducersByName,\n getInitialState() {\n if (!_reducer) _reducer = buildReducer();\n return _reducer.getInitialState();\n }\n };\n}\n\n// src/redux/utils/createDestroyableSlice.ts\nvar createDestroyableSlice = ({\n name = \"\",\n initialState,\n reducers,\n extraReducers\n}) => {\n return createSlice({\n name,\n initialState,\n reducers,\n extraReducers: (builder) => {\n builder.addCase(destroyAction.type, () => {\n return initialState;\n });\n if (typeof extraReducers === \"function\") {\n extraReducers(builder);\n }\n }\n });\n};\n\n// src/redux/features/session/sessionSlice.ts\nvar initialSessionState = {\n protocol: \"\",\n iceServers: [],\n authStatus: \"unknown\",\n authState: void 0,\n authError: void 0,\n authCount: 0\n};\nfunction authorizingAction(action) {\n return [initAction.type, reauthAction.type].includes(action.type);\n}\nvar sessionSlice = createDestroyableSlice({\n name: \"session\",\n initialState: initialSessionState,\n reducers: {\n connected: (state, { payload }) => {\n var _a, _b;\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorized\",\n authState: payload == null ? void 0 : payload.authorization,\n authCount: state.authCount + 1,\n protocol: (_a = payload == null ? void 0 : payload.protocol) != null ? _a : \"\",\n iceServers: (_b = payload == null ? void 0 : payload.ice_servers) != null ? _b : []\n });\n },\n authStatus: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: payload\n });\n },\n updateAuthState: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authState: payload\n });\n }\n },\n extraReducers: (builder) => {\n builder.addCase(\n authErrorAction.type,\n (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"unauthorized\",\n authError: payload.error\n });\n }\n );\n builder.addMatcher(authorizingAction, (state) => {\n return __spreadProps(__spreadValues({}, state), {\n authStatus: \"authorizing\"\n });\n });\n }\n});\nvar {\n actions: sessionActions,\n reducer: sessionReducer\n} = sessionSlice;\n\n// src/BaseSession.ts\nvar SW_SYMBOL = Symbol(\"BaseSession\");\nvar randomInt = (min, max) => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\nvar reconnectDelay = () => {\n return randomInt(1, 4) * 1e3;\n};\nvar BaseSession = class {\n constructor(options) {\n this.options = options;\n /** @internal */\n __publicField(this, \"__sw_symbol\", SW_SYMBOL);\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"WebSocketConstructor\");\n __publicField(this, \"CloseEventConstructor\");\n __publicField(this, \"agent\");\n __publicField(this, \"connectVersion\", DEFAULT_CONNECT_VERSION);\n __publicField(this, \"_rpcConnectResult\");\n __publicField(this, \"_requests\", /* @__PURE__ */ new Map());\n __publicField(this, \"_socket\", null);\n __publicField(this, \"_host\", DEFAULT_HOST);\n __publicField(this, \"_executeTimeoutMs\", 10 * 1e3);\n __publicField(this, \"_executeTimeoutError\", Symbol.for(\"sw-execute-timeout\"));\n __publicField(this, \"_executeQueue\", /* @__PURE__ */ new Set());\n __publicField(this, \"_swConnectError\", Symbol.for(\"sw-connect-error\"));\n __publicField(this, \"_executeConnectionClosed\", Symbol.for(\"sw-execute-connection-closed\"));\n __publicField(this, \"_checkPingDelay\", 15 * 1e3);\n __publicField(this, \"_checkPingTimer\", null);\n __publicField(this, \"_reconnectTimer\");\n __publicField(this, \"_status\", \"unknown\");\n __publicField(this, \"_sessionChannel\");\n __publicField(this, \"wsOpenHandler\");\n __publicField(this, \"wsCloseHandler\");\n __publicField(this, \"wsErrorHandler\");\n var _a, _b;\n const { host, logLevel = \"info\", sessionChannel } = options;\n if (host) {\n this._host = checkWebSocketHost(host);\n }\n if (sessionChannel) {\n this._sessionChannel = sessionChannel;\n }\n if (logLevel) {\n (_b = (_a = this.logger).setLevel) == null ? void 0 : _b.call(_a, logLevel);\n }\n this._onSocketOpen = this._onSocketOpen.bind(this);\n this._onSocketError = this._onSocketError.bind(this);\n this._onSocketClose = this._onSocketClose.bind(this);\n this._onSocketMessage = this._onSocketMessage.bind(this);\n this.execute = this.execute.bind(this);\n this.connect = this.connect.bind(this);\n this.wsOpenHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"open\", this.wsOpenHandler);\n this._onSocketOpen(event);\n };\n this.wsCloseHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"close\", this.wsCloseHandler);\n this._onSocketClose(event);\n };\n this.wsErrorHandler = (event) => {\n var _a2;\n (_a2 = this._socket) == null ? void 0 : _a2.removeEventListener(\"error\", this.wsErrorHandler);\n this._onSocketError(event);\n };\n }\n get host() {\n return this._host;\n }\n get rpcConnectResult() {\n return this._rpcConnectResult;\n }\n get relayProtocol() {\n var _a, _b;\n return (_b = (_a = this._rpcConnectResult) == null ? void 0 : _a.protocol) != null ? _b : \"\";\n }\n get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult;\n return authorization.signature;\n }\n return void 0;\n }\n get logger() {\n return getLogger();\n }\n get connecting() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 0 /* CONNECTING */;\n }\n get connected() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 1 /* OPEN */;\n }\n get closing() {\n var _a;\n return ((_a = this._socket) == null ? void 0 : _a.readyState) === 2 /* CLOSING */;\n }\n get closed() {\n return this._socket ? this._socket.readyState === 3 /* CLOSED */ : true;\n }\n get status() {\n return this._status;\n }\n get idle() {\n return this._status === \"idle\";\n }\n get ready() {\n return !Boolean(this.idle || !this.connected);\n }\n set token(token) {\n this.options.token = token;\n }\n /**\n * Connect the websocket\n *\n * @return void\n */\n connect() {\n if (!(this == null ? void 0 : this.WebSocketConstructor)) {\n throw new Error(\"Missing WebSocketConstructor\");\n }\n if (!(this == null ? void 0 : this.CloseEventConstructor)) {\n throw new Error(\"Missing CloseEventConstructor\");\n }\n this._clearTimers();\n if (this.connecting || this.connected) {\n this.logger.warn(\"Session already connected.\");\n return;\n }\n this._removeSocketListeners();\n this.destroySocket();\n this._clearCheckPingTimer();\n this._socket = this._createSocket();\n this._addSocketListeners();\n }\n /**\n * Allow children classes to override it.\n * @return WebSocket instance\n */\n _createSocket() {\n return new this.WebSocketConstructor(this._host);\n }\n /** Allow children classes to override it. */\n destroySocket() {\n if (this._socket) {\n this._socket.close();\n this.wsCloseHandler(\n new this.CloseEventConstructor(\"close\", {\n reason: \"Client-side closed\"\n })\n );\n this._socket = null;\n }\n }\n _addSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to add listeners\");\n }\n this._removeSocketListeners();\n this._socket.addEventListener(\"open\", this.wsOpenHandler);\n this._socket.addEventListener(\"close\", this.wsCloseHandler);\n this._socket.addEventListener(\"error\", this.wsErrorHandler);\n this._socket.addEventListener(\"message\", this._onSocketMessage);\n }\n _removeSocketListeners() {\n if (!this._socket) {\n return this.logger.debug(\"Invalid socket instance to remove listeners\");\n }\n this._socket.removeEventListener(\"open\", this.wsOpenHandler);\n this._socket.removeEventListener(\"close\", this.wsCloseHandler);\n this._socket.removeEventListener(\"error\", this.wsErrorHandler);\n this._socket.removeEventListener(\"message\", this._onSocketMessage);\n }\n /**\n * Clear the Session and close the WS connection.\n * @return void\n */\n disconnect() {\n if (!this._socket || this.closing) {\n this.logger.debug(\"Session not connected or already in closing state.\");\n return;\n }\n this._status = \"disconnecting\";\n this._checkCurrentStatus();\n }\n /**\n * Send a JSON object to the server.\n * @return Promise that will resolve/reject depending on the server response\n */\n execute(msg) {\n if (this._status === \"disconnecting\") {\n this.logger.warn(\n \"Reject request because the session is disconnecting\",\n msg\n );\n return Promise.reject({\n code: \"400\",\n message: \"The SDK session is disconnecting\"\n });\n }\n if (this._status === \"disconnected\") {\n return Promise.reject({\n code: \"400\",\n message: \"The SDK is disconnected\"\n });\n }\n let promise = Promise.resolve();\n if (\"params\" in msg) {\n promise = new Promise((resolve, reject) => {\n this._requests.set(msg.id, { rpcRequest: msg, resolve, reject });\n });\n }\n if (!this.ready) {\n this._addToExecuteQueue(msg);\n this.connect();\n return promise;\n }\n this._send(msg);\n return timeoutPromise(\n promise,\n this._executeTimeoutMs,\n this._executeTimeoutError\n ).catch((error) => {\n if (error === this._executeConnectionClosed) {\n throw this._executeConnectionClosed;\n } else if (error === this._executeTimeoutError) {\n if (\"method\" in msg && msg.method === \"signalwire.connect\") {\n throw this._swConnectError;\n }\n this._checkCurrentStatus();\n this.logger.error(\"Request Timeout\", msg);\n if (this.status === \"disconnected\") {\n return this.logger.debug(\n \"Request failed because the session is disconnected\",\n this.status,\n this._socket\n );\n }\n this._closeConnection(\"reconnecting\");\n } else {\n throw error;\n }\n });\n }\n get _connectParams() {\n return {\n agent: this.agent,\n version: this.connectVersion,\n authentication: {\n project: this.options.project,\n token: this.options.token\n }\n };\n }\n /**\n * Authenticate with the SignalWire Network\n * @return Promise<void>\n */\n async authenticate() {\n var _a, _b;\n const params = this._connectParams;\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n }\n if ((_a = this.options.topics) == null ? void 0 : _a.length) {\n params.contexts = this.options.topics;\n } else if ((_b = this.options.contexts) == null ? void 0 : _b.length) {\n params.contexts = this.options.contexts;\n }\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n }\n authError(error) {\n this._removeSocketListeners();\n this.dispatch(authErrorAction({ error }));\n }\n forceClose() {\n this._removeSocketListeners();\n return this._closeConnection(\"reconnecting\");\n }\n async _onSocketOpen(event) {\n this.logger.debug(\"_onSocketOpen\", event.type);\n try {\n this._status = \"unknown\";\n this._clearTimers();\n await this.authenticate();\n this._status = \"connected\";\n this._flushExecuteQueue();\n this.dispatch(authSuccessAction());\n } catch (error) {\n if (error === this._swConnectError || error === this._executeConnectionClosed) {\n this.logger.debug(\n \"Invalid connect or connection closed. Waiting for retry.\"\n );\n return;\n }\n this.logger.error(\"Auth Error\", error);\n this.authError(error);\n }\n }\n _onSocketError(event) {\n this.logger.debug(\"_onSocketError\", event);\n }\n _onSocketClose(event) {\n this.logger.debug(\"_onSocketClose\", event.type, event.code, event.reason);\n if (this._status !== \"disconnected\") {\n this._status = \"reconnecting\";\n this.dispatch(sessionReconnectingAction());\n this._clearTimers();\n this._clearPendingRequests();\n this._reconnectTimer = setTimeout(() => {\n this.connect();\n }, reconnectDelay());\n }\n this._socket = null;\n }\n _clearTimers() {\n clearTimeout(this._reconnectTimer);\n }\n _clearPendingRequests() {\n this.logger.debug(\"_clearPendingRequests\", this._requests.size);\n this._requests.forEach(({ reject }) => {\n reject(this._executeConnectionClosed);\n });\n }\n _onSocketMessage(event) {\n const payload = this.decode(event.data);\n this.logger.wsTraffic({ type: \"recv\", payload });\n if (isJSONRPCResponse(payload)) {\n const request = this._requests.get(payload.id);\n if (request) {\n const { rpcRequest, resolve, reject } = request;\n this._requests.delete(payload.id);\n const { result, error } = parseRPCResponse({\n response: payload,\n request: rpcRequest\n });\n this._checkCurrentStatus();\n return error ? reject(error) : resolve(result);\n }\n return this.logger.warn(\"Unknown request for\", payload);\n }\n switch (payload.method) {\n case \"signalwire.ping\":\n return this._pingHandler(payload);\n case \"signalwire.disconnect\": {\n this.execute(RPCDisconnectResponse(payload.id)).catch((error) => {\n this.logger.error(\"SwDisconnect Error\", error);\n }).finally(() => {\n this._status = \"idle\";\n });\n break;\n }\n default:\n this._eventAcknowledgingHandler(payload).catch(\n (error) => this.logger.error(\"Event Acknowledging Error\", error)\n );\n this.dispatch(socketMessageAction(payload));\n }\n }\n dispatch(_payload) {\n if (!this._sessionChannel) {\n throw new Error(\"Session channel does not exist\");\n }\n this._sessionChannel.put(_payload);\n }\n /**\n * Check the current relayProtocol against the signature\n * to make sure is still valid.\n * @return boolean\n */\n _relayProtocolIsValid() {\n var _a;\n return this.signature && ((_a = this == null ? void 0 : this.relayProtocol) == null ? void 0 : _a.split(\"_\")[1]) === this.signature;\n }\n encode(input) {\n return JSON.stringify(input);\n }\n decode(input) {\n return safeParseJson(input);\n }\n async onSwAuthorizationState(state) {\n this.persistSwAuthorizationState(state);\n }\n async retrieveSwAuthorizationState() {\n return \"\";\n }\n async persistSwAuthorizationState(_) {\n }\n _send(msg) {\n this.logger.wsTraffic({ type: \"send\", payload: msg });\n this._socket.send(this.encode(msg));\n }\n _addToExecuteQueue(msg) {\n this.logger.warn(\"Request queued waiting for session to reconnect\", msg);\n this._executeQueue.add(msg);\n }\n _flushExecuteQueue() {\n if (!this._executeQueue.size) {\n return;\n }\n if (!this.ready) {\n this.logger.warn(`Session not ready to flush the queue.`);\n this._closeConnection(\"reconnecting\");\n return;\n }\n this.logger.debug(`${this._executeQueue.size} messages to flush`);\n this._executeQueue.forEach((msg) => {\n this._send(msg);\n this._executeQueue.delete(msg);\n });\n this._executeQueue.clear();\n }\n _clearCheckPingTimer() {\n clearTimeout(this._checkPingTimer);\n }\n async _pingHandler(payload) {\n var _a;\n this._clearCheckPingTimer();\n this._checkPingTimer = setTimeout(() => {\n this.logger.debug(\"Timeout waiting for ping\");\n this._closeConnection(\"reconnecting\");\n }, this._checkPingDelay);\n await this.execute(RPCPingResponse(payload.id, (_a = payload == null ? void 0 : payload.params) == null ? void 0 : _a.timestamp));\n }\n async _eventAcknowledgingHandler(payload) {\n const { method, id } = payload;\n if (method === \"signalwire.event\") {\n return this.execute(RPCEventAckResponse(id));\n }\n return Promise.resolve();\n }\n /**\n * Do something based on the current `this._status`\n */\n _checkCurrentStatus() {\n switch (this._status) {\n // Only close the WS connection if there are no pending requests\n case \"disconnecting\":\n if (this._requests.size > 0) {\n return;\n }\n this._requests.clear();\n this._closeConnection(\"disconnected\");\n break;\n case \"disconnected\":\n this.dispatch(sessionDisconnectedAction());\n break;\n case \"reconnecting\":\n this.wsCloseHandler(\n new this.CloseEventConstructor(\"close\", {\n reason: \"Client-side closed\"\n })\n );\n break;\n }\n }\n _closeConnection(status) {\n this._clearCheckPingTimer();\n this.logger.debug(\"Close Connection:\", status);\n this._status = status;\n this.dispatch(\n sessionActions.authStatus(\n status === \"disconnected\" ? \"unauthorized\" : \"unknown\"\n )\n );\n this._removeSocketListeners();\n this.destroySocket();\n this._checkCurrentStatus();\n }\n};\n\n// src/BaseJWTSession.ts\nvar BaseJWTSession = class extends BaseSession {\n constructor(options) {\n super(options);\n this.options = options;\n /**\n * Can set a value different than zero to\n * force the JWT as expired within X seconds.\n * TODO: Remove this workaround.\n */\n __publicField(this, \"_expiredDiffSeconds\", 0);\n __publicField(this, \"_refreshTokenNotificationDiff\", 120);\n /**\n * Check the JWT expiration every 20seconds\n */\n __publicField(this, \"_checkTokenExpirationDelay\", 20 * 1e3);\n __publicField(this, \"_checkTokenExpirationTimer\", null);\n this._checkTokenExpiration = this._checkTokenExpiration.bind(this);\n this.reauthenticate = this.reauthenticate.bind(this);\n }\n get expiresAt() {\n var _a;\n if (!(this == null ? void 0 : this._rpcConnectResult)) {\n return 0;\n }\n const { authorization } = this._rpcConnectResult;\n const expiresAt = (_a = isSATAuth(authorization) ? authorization.fabric_subscriber.expires_at : authorization == null ? void 0 : authorization.expires_at) != null ? _a : 0;\n if (typeof expiresAt === \"string\") {\n const parsed = Date.parse(expiresAt);\n if (!isNaN(parsed)) {\n return Math.floor(parsed / 1e3);\n }\n }\n return expiresAt;\n }\n get expiresIn() {\n const now = Math.floor(Date.now() / 1e3);\n return this.expiresAt - now;\n }\n get expired() {\n return this.expiresAt > 0 && this.expiresIn <= this._expiredDiffSeconds;\n }\n /**\n * Authenticate with the SignalWire Network\n * using JWT\n * @return Promise<void>\n */\n async authenticate() {\n const params = __spreadProps(__spreadValues({}, this._connectParams), {\n authentication: {\n jwt_token: this.options.token\n }\n });\n if (this._relayProtocolIsValid()) {\n params.protocol = this.relayProtocol;\n } else {\n const prevProtocol = await this.retrieveRelayProtocol();\n if (prevProtocol) {\n params.protocol = prevProtocol;\n }\n }\n if (params.protocol) {\n const authorizationState = await this.retrieveSwAuthorizationState();\n if (authorizationState) {\n params.authorization_state = authorizationState;\n }\n }\n try {\n this._rpcConnectResult = await this.execute(RPCConnect(params));\n await this.persistRelayProtocol();\n await this._checkTokenExpiration();\n } catch (error) {\n this.logger.debug(\"BaseJWTSession authenticate error\", error);\n throw error;\n }\n }\n async retrieveRelayProtocol() {\n return \"\";\n }\n async persistRelayProtocol() {\n }\n /**\n * Reauthenticate with the SignalWire Network\n * using a newer JWT. If the session has expired\n * will reconnect it.\n * @return Promise<void>\n */\n async reauthenticate() {\n this.logger.debug(\"Session Reauthenticate\", {\n ready: this.ready,\n expired: this.expired\n });\n if (!this.ready || this.expired) {\n return this.connect();\n }\n const params = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token\n };\n try {\n this._rpcConnectResult = await this.execute(RPCReauthenticate(params));\n } catch (error) {\n clearTimeout(this._checkTokenExpirationTimer);\n throw error;\n }\n }\n _onSocketClose(event) {\n clearTimeout(this._checkTokenExpirationTimer);\n super._onSocketClose(event);\n }\n /**\n * Set a timer to dispatch a notification when the JWT is going to expire.\n * @return void\n */\n async _checkTokenExpiration() {\n if (!this.expiresAt) {\n return;\n }\n const refreshTokenFn = this.options.onRefreshToken;\n if (this.expiresIn <= this._refreshTokenNotificationDiff) {\n this.dispatch(authExpiringAction());\n if (typeof refreshTokenFn === \"function\") {\n try {\n const token = await refreshTokenFn();\n this.dispatch(reauthAction({ token }));\n } catch (error) {\n this.logger.error(error);\n }\n } else {\n this.logger.warn(\"The token is going to expire!\");\n }\n }\n clearTimeout(this._checkTokenExpirationTimer);\n if (!this.expired) {\n this._checkTokenExpirationTimer = setTimeout(\n this._checkTokenExpiration,\n this._checkTokenExpirationDelay\n );\n }\n }\n};\n\n// src/redux/index.ts\nvar redux_exports = {};\n__export(redux_exports, {\n authErrorAction: () => authErrorAction,\n authExpiringAction: () => authExpiringAction,\n authSuccessAction: () => authSuccessAction,\n configureStore: () => configureStore2,\n connect: () => connect,\n createAction: () => createAction,\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n destroyAction: () => destroyAction,\n eventChannel: () => eventChannel,\n getCustomSagaActionType: () => getCustomSagaActionType,\n initAction: () => initAction,\n makeCustomSagaAction: () => makeCustomSagaAction,\n reauthAction: () => reauthAction,\n sessionDisconnectedAction: () => sessionDisconnectedAction,\n sessionForceCloseAction: () => sessionForceCloseAction,\n sessionReconnectingAction: () => sessionReconnectingAction,\n socketMessageAction: () => socketMessageAction\n});\nimport createSagaMiddleware, {\n channel,\n multicastChannel\n} from \"@redux-saga/core\";\n\n// src/redux/features/component/componentSlice.ts\nvar initialComponentState = {\n byId: {}\n};\nvar componentSlice = createDestroyableSlice({\n name: \"components\",\n initialState: initialComponentState,\n reducers: {\n upsert: (state, { payload }) => {\n if (payload.id in state.byId) {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: __spreadValues(__spreadValues({}, state.byId[payload.id]), payload)\n })\n });\n } else {\n return __spreadProps(__spreadValues({}, state), {\n byId: __spreadProps(__spreadValues({}, state.byId), {\n [payload.id]: payload\n })\n });\n }\n },\n cleanup: (state, { payload }) => {\n return __spreadProps(__spreadValues({}, state), {\n byId: Object.entries(state.byId).reduce(\n (reducer, [componentId, value]) => {\n if (!payload.ids.includes(componentId)) {\n reducer[componentId] = value;\n }\n return reducer;\n },\n {}\n )\n });\n }\n }\n});\nvar {\n actions: componentActions,\n reducer: componentReducer\n} = componentSlice;\n\n// src/redux/rootReducer.ts\nvar rootReducer = (0, toolkit_exports.combineReducers)({\n components: componentReducer,\n session: sessionReducer\n});\n\n// src/redux/rootSaga.ts\nimport { fork as fork2, call as call2, take as take2, put as put2, all, cancelled } from \"@redux-saga/core/effects\";\n\n// src/redux/features/session/sessionSaga.ts\nimport { put, take, fork } from \"@redux-saga/core/effects\";\n\n// src/redux/utils/sagaHelpers.ts\nvar sagaHelpers_exports = {};\n__export(sagaHelpers_exports, {\n createCatchableSaga: () => createCatchableSaga,\n createRestartableSaga: () => createRestartableSaga,\n eventChannel: () => eventChannel\n});\nimport { call, spawn } from \"@redux-saga/core/effects\";\nimport { eventChannel } from \"@redux-saga/core\";\nvar createRestartableSaga = (saga) => {\n return function* () {\n spawn(function* () {\n while (true) {\n try {\n getLogger().debug(\"Run a restartable saga\");\n yield call(saga);\n getLogger().debug(\n \"One of the restartable saga has ended. Restarting..\"\n );\n } catch (error) {\n getLogger().error(\"Restartable Saga Error\", error);\n }\n }\n });\n };\n};\nvar defaultCatchHandler = (error) => getLogger().error(\"Catchable Saga Error\", error);\nvar createCatchableSaga = (saga, errorHandler = defaultCatchHandler) => {\n return function* (...params) {\n try {\n yield call(saga, ...params);\n } catch (error) {\n errorHandler(error);\n }\n };\n};\n\n// src/redux/features/session/sessionSaga.ts\nvar isWebrtcEvent = (e) => {\n return isWebrtcEventType(e == null ? void 0 : e.event_type);\n};\nvar isVideoEvent = (e) => {\n var _a;\n return !!((_a = e == null ? void 0 : e.event_type) == null ? void 0 : _a.startsWith(\"video.\"));\n};\nvar isSwAuthorizationState = (e) => {\n return (e == null ? void 0 : e.event_type) === \"signalwire.authorization.state\";\n};\nfunction* sessionChannelWatcher({\n sessionChannel,\n swEventChannel,\n session\n}) {\n getLogger().debug(\"sessionChannelWatcher [started]\");\n function* swEventWorker(broadcastParams) {\n yield put(swEventChannel, toInternalAction(broadcastParams));\n if (isWebrtcEvent(broadcastParams) || isVideoEvent(broadcastParams)) {\n return;\n }\n if (isSwAuthorizationState(broadcastParams)) {\n session.onSwAuthorizationState(broadcastParams.params.authorization_state);\n return;\n }\n yield put({ type: broadcastParams.event_type, payload: broadcastParams });\n }\n function* sessionChannelWorker(action) {\n if (action.type !== socketMessageAction.type) {\n yield put(action);\n return;\n }\n const { method, params } = action.payload;\n switch (method) {\n case \"signalwire.event\":\n yield fork(swEventWorker, params);\n break;\n default:\n return getLogger().debug(`Unknown message: ${method}`, action);\n }\n }\n const sessionChannelWorkerCatchable = createCatchableSaga(sessionChannelWorker, (error) => {\n getLogger().error(\"Channel Error\", error);\n });\n while (true) {\n try {\n while (true) {\n const action = yield take(sessionChannel);\n yield fork(sessionChannelWorkerCatchable, action);\n }\n } catch (error) {\n getLogger().error(\"sessionChannelWorker error:\", error);\n } finally {\n getLogger().debug(\"sessionChannelWorker [finally]\");\n }\n }\n}\n\n// src/CustomErrors.ts\nvar AuthError = class _AuthError 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 _HttpError extends Error {\n constructor(code, message, response) {\n super(message);\n this.code = code;\n this.message = message;\n this.response = response;\n __publicField(this, \"name\", \"HttpError\");\n Object.setPrototypeOf(this, _HttpError.prototype);\n }\n};\n\n// src/redux/rootSaga.ts\nfunction* sessionSaga({\n initSession,\n sessionEmitter,\n userOptions,\n channels\n}) {\n var _a;\n getLogger().debug(\"sessionSaga [started]\");\n const session = initSession();\n const swEventChannel = channels.swEventChannel;\n const sessionChannel = channels.sessionChannel;\n let customTasks = [];\n if ((_a = userOptions.workers) == null ? void 0 : _a.length) {\n try {\n const effects = userOptions.workers.map((saga) => {\n return call2(createRestartableSaga(saga));\n });\n customTasks = yield all(effects);\n } catch (error) {\n getLogger().error(\"Error running custom workers\", error);\n }\n }\n const sessionChannelTask = yield fork2(sessionChannelWatcher, {\n session,\n sessionChannel,\n swEventChannel\n });\n const sessionStatusTask = yield fork2(sessionStatusWatcher, {\n session,\n sessionEmitter,\n sessionChannel,\n userOptions\n });\n session.connect();\n yield take2(destroyAction.type);\n session.disconnect();\n yield take2(sessionDisconnectedAction.type);\n sessionEmitter.emit(\"session.disconnected\");\n sessionStatusTask.cancel();\n sessionChannelTask.cancel();\n customTasks.forEach((task) => task.cancel());\n swEventChannel.close();\n sessionChannel.close();\n getLogger().debug(\"sessionSaga [ended]\");\n}\nfunction* reauthenticateWorker({\n session,\n token,\n sessionEmitter\n}) {\n try {\n if (session.reauthenticate) {\n session.token = token;\n yield call2(session.reauthenticate);\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n }\n } catch (error) {\n getLogger().error(\"Reauthenticate Error\", error);\n session.authError(error);\n }\n}\nfunction* sessionStatusWatcher(options) {\n getLogger().debug(\"sessionStatusWatcher [started]\");\n const { session, sessionEmitter } = options;\n try {\n while (true) {\n const action = yield take2([\n authSuccessAction.type,\n authErrorAction.type,\n authExpiringAction.type,\n reauthAction.type,\n sessionReconnectingAction.type,\n sessionForceCloseAction.type\n ]);\n getLogger().debug(\"sessionStatusWatcher\", action.type, action.payload);\n switch (action.type) {\n case authSuccessAction.type: {\n yield put2(sessionActions.connected(session.rpcConnectResult));\n sessionEmitter.emit(\"session.connected\");\n break;\n }\n case authErrorAction.type: {\n yield fork2(sessionAuthErrorSaga, __spreadProps(__spreadValues({}, options), {\n action\n }));\n break;\n }\n case authExpiringAction.type: {\n sessionEmitter.emit(\"session.expiring\");\n break;\n }\n case reauthAction.type: {\n yield fork2(reauthenticateWorker, {\n session,\n token: action.payload.token,\n sessionEmitter\n });\n break;\n }\n case sessionReconnectingAction.type: {\n sessionEmitter.emit(\"session.reconnecting\");\n break;\n }\n case sessionForceCloseAction.type: {\n session.forceClose();\n break;\n }\n }\n }\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionStatusWatcher [cancelled]\");\n }\n }\n}\nfunction* sessionAuthErrorSaga(options) {\n getLogger().debug(\"sessionAuthErrorSaga [started]\");\n try {\n const { action, sessionEmitter } = options;\n const { error: authError } = action.payload;\n const error = authError ? new AuthError(authError.code, authError.message) : new Error(\"Unauthorized\");\n sessionEmitter.emit(\"session.auth_error\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"sessionAuthErrorSaga [cancelled]\");\n }\n }\n}\nvar rootSaga_default = (options) => {\n return function* root({\n userOptions,\n channels\n }) {\n getLogger().debug(\"rootSaga [started]\");\n if (userOptions.logger) {\n setLogger(userOptions.logger);\n }\n if (userOptions.debug) {\n setDebugOptions(userOptions.debug);\n }\n while (true) {\n yield take2(initAction.type);\n try {\n yield call2(sessionSaga, __spreadProps(__spreadValues({}, options), {\n userOptions,\n channels\n }));\n break;\n } catch (error) {\n getLogger().error(\"RootSaga Error:\", error);\n } finally {\n if (yield cancelled()) {\n getLogger().debug(\"rootSaga [cancelled]\");\n }\n getLogger().debug(\"Reboot rootSaga\");\n }\n }\n getLogger().debug(\"rootSaga [finished]\");\n };\n};\n\n// src/redux/features/session/sessionSelectors.ts\nvar sessionSelectors_exports = {};\n__export(sessionSelectors_exports, {\n getAuthError: () => getAuthError,\n getAuthState: () => getAuthState,\n getAuthStatus: () => getAuthStatus,\n getIceServers: () => getIceServers,\n getSession: () => getSession\n});\nvar getIceServers = ({ session }) => {\n var _a;\n return (_a = session == null ? void 0 : session.iceServers) != null ? _a : [];\n};\nvar getSession = (store) => {\n return store.session;\n};\nvar getAuthStatus = ({ session }) => {\n return session.authStatus;\n};\nvar getAuthError = ({ session }) => {\n return session.authError;\n};\nvar getAuthState = ({ session }) => {\n return session.authState;\n};\n\n// src/redux/connect.ts\nvar connect = (options) => {\n const { sessionListeners = {}, store, Component, customSagas = [] } = options;\n const sessionKeys = Object.keys(sessionListeners);\n return (userOptions) => {\n const instance = new Component(__spreadProps(__spreadValues({}, userOptions), { store }));\n const cacheMap = /* @__PURE__ */ new Map();\n let run = true;\n const storeUnsubscribe = store.subscribe(() => {\n const state = store.getState();\n const session = getSession(state);\n for (const reduxKey of sessionKeys) {\n if (run === false) {\n return;\n }\n const cacheKey = `session.${reduxKey}`;\n const current = cacheMap.get(cacheKey);\n const updatedValue = session[reduxKey];\n if (updatedValue !== void 0 && current !== updatedValue) {\n cacheMap.set(cacheKey, updatedValue);\n const fnName = sessionListeners[reduxKey];\n if (typeof fnName === \"string\") {\n instance[fnName](session);\n } else if (typeof fnName === \"function\") {\n fnName(session);\n }\n }\n }\n });\n const taskList = customSagas == null ? void 0 : customSagas.map((saga) => {\n return store.runSaga(saga, { instance, runSaga: store.runSaga });\n });\n instance.destroyer = () => {\n run = false;\n storeUnsubscribe();\n cacheMap.clear();\n if (taskList == null ? void 0 : taskList.length) {\n taskList.forEach((task) => task.cancel());\n }\n };\n return instance;\n };\n};\n\n// src/utils/EventEmitter.ts\nimport EventEmitter from \"eventemitter3\";\nvar getEventEmitter = () => {\n return new EventEmitter();\n};\n\n// src/redux/utils/useSession.ts\nvar useSession = (options) => {\n const { SessionConstructor, userOptions, sessionChannel } = options;\n const sessionEmitter = getEventEmitter();\n let session = null;\n const initSession = () => {\n session = new SessionConstructor(__spreadProps(__spreadValues({}, userOptions), {\n sessionChannel\n }));\n return session;\n };\n const getSession2 = () => {\n if (!session) {\n getLogger().warn(\"Session does not exist!\");\n }\n return session;\n };\n return { session, initSession, getSession: getSession2, sessionEmitter };\n};\n\n// src/redux/utils/useInstanceMap.ts\nvar useInstanceMap = () => {\n const instanceMap = /* @__PURE__ */ new Map();\n const getInstance = (key) => {\n return instanceMap.get(key);\n };\n const setInstance = (key, value) => {\n instanceMap.set(key, value);\n return instanceMap;\n };\n const deleteInstance = (key) => {\n instanceMap.delete(key);\n return instanceMap;\n };\n const getAllInstances = () => {\n return Array.from(instanceMap.entries());\n };\n const deleteAllInstances = () => {\n instanceMap.clear();\n return instanceMap;\n };\n return {\n get: getInstance,\n set: setInstance,\n remove: deleteInstance,\n getAll: getAllInstances,\n deleteAll: deleteAllInstances\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 runRootSaga = true\n } = options;\n const sagaMiddleware = createSagaMiddleware({\n // @ts-expect-error For testing purposes only\n sagaMonitor: userOptions.sagaMonitor\n });\n const swEventChannel = multicastChannel();\n const sessionChannel = channel();\n const channels = {\n swEventChannel,\n sessionChannel\n };\n const store = configureStore({\n devTools: (_a = userOptions == null ? void 0 : userOptions.devTools) != null ? _a : true,\n reducer: rootReducer,\n preloadedState,\n middleware: (getDefaultMiddleware) => (\n // It is preferrable to use the chainable .concat(...) and\n // .prepend(...) methods of the returned MiddlewareArray instead\n // of the array spread operator, as the latter can lose valuable\n // type information under some circumstances.\n // @see https://redux-toolkit.js.org/api/getDefaultMiddleware#intended-usage\n getDefaultMiddleware().concat(sagaMiddleware)\n )\n });\n const instanceMap = useInstanceMap();\n const { initSession, getSession: getSession2, sessionEmitter } = useSession({\n userOptions,\n sessionChannel,\n SessionConstructor\n });\n const runSaga = (saga, args) => {\n return sagaMiddleware.run(saga, __spreadProps(__spreadValues({}, args), {\n channels,\n getSession: getSession2,\n instanceMap\n }));\n };\n if (runRootSaga) {\n const saga = rootSaga_default({\n initSession,\n sessionEmitter\n });\n sagaMiddleware.run(saga, { userOptions, channels });\n }\n return __spreadProps(__spreadValues({}, store), {\n runSaga,\n channels,\n instanceMap,\n sessionEmitter\n });\n};\n\n// src/workers/executeActionWorker.ts\nimport { call as call3 } from \"@redux-saga/core/effects\";\nvar executeActionWorker = function* (options) {\n const { initialState, onDone, onFail, getSession: getSession2 } = options;\n const { requestId: id, method, params } = initialState;\n const session = getSession2();\n if (!session) {\n const error = new Error(\"Session does not exist!\");\n getLogger().error(error);\n onFail == null ? void 0 : onFail(error);\n return;\n }\n try {\n let message = RPCExecute({ id, method, params });\n const response = yield call3(session.execute, message);\n onDone == null ? void 0 : onDone(response);\n } catch (error) {\n getLogger().warn(\"Execute error: \", error);\n onFail == null ? void 0 : onFail(error);\n }\n};\n\n// src/BaseComponent.ts\nvar identity = (payload) => payload;\nvar SW_SYMBOL2 = Symbol(\"BaseComponent\");\nvar BaseComponent = class {\n constructor(options) {\n this.options = options;\n /** @internal */\n __publicField(this, \"__sw_symbol\", SW_SYMBOL2);\n /** @internal */\n __publicField(this, \"uuid\", v4());\n __publicField(this, \"_customSagaTriggers\", /* @__PURE__ */ new Map());\n __publicField(this, \"_destroyer\");\n __publicField(this, \"eventEmitter\");\n /**\n * List of running Tasks to be cancelled on `destroy`.\n */\n __publicField(this, \"_runningWorkers\", []);\n /**\n * Map of Sagas that will be attached to the Store to\n * handle events or perform side-effects. This Map will\n * behave as a queue and will be emptied once the workers\n * have been attached. See `this.attachWorkers` for\n * details.\n */\n __publicField(this, \"_workers\", /* @__PURE__ */ new Map());\n this.eventEmitter = new EventEmitter();\n }\n /** @internal */\n get __uuid() {\n return this.uuid;\n }\n get logger() {\n return getLogger();\n }\n /** @internal */\n set destroyer(d) {\n this._destroyer = d;\n }\n /** @internal */\n get store() {\n return this.options.store;\n }\n /** @internal */\n get instanceMap() {\n return this.store.instanceMap;\n }\n /** @internal */\n get emitter() {\n return this.eventEmitter;\n }\n /** @internal */\n get sessionEmitter() {\n return this.store.sessionEmitter;\n }\n /** @internal */\n get session() {\n return this.sessionEmitter;\n }\n on(event, fn) {\n return this.emitter.on(event, fn);\n }\n once(event, fn) {\n return this.emitter.once(event, fn);\n }\n off(event, fn) {\n return this.emitter.off(event, fn);\n }\n removeAllListeners(event) {\n if (event) {\n return this.off(event);\n }\n this.eventNames().forEach((eventName) => {\n this.off(eventName);\n });\n return this.emitter;\n }\n /** @internal */\n eventNames() {\n return this.emitter.eventNames();\n }\n /** @internal */\n sessionEventNames() {\n return this.sessionEmitter.eventNames();\n }\n getSubscriptions() {\n return validateEventsToSubscribe(this.eventNames());\n }\n /** @internal */\n emit(event, ...args) {\n return this.emitter.emit(event, ...args);\n }\n /** @internal */\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 /** @internal */\n execute({ method, params }, {\n transformParams = identity,\n transformResolve = identity,\n transformReject = identity\n } = {\n transformParams: identity,\n transformResolve: identity,\n transformReject: identity\n }) {\n return new Promise((resolve, reject) => {\n const requestId = v4();\n this.runWorker(\"executeActionWorker\", {\n worker: executeActionWorker,\n onDone: (data) => resolve(transformResolve(data)),\n onFail: (error) => reject(transformReject(error)),\n initialState: {\n requestId,\n componentId: this.__uuid,\n method,\n params: transformParams(params)\n }\n });\n });\n }\n /** @internal */\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 /** @internal */\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 /** @internal */\n select(selectorFn) {\n return selectorFn(this.store.getState());\n }\n /** @internal */\n getStateProperty(param) {\n return this[param];\n }\n /** @internal */\n get _sessionAuthStatus() {\n return getAuthStatus(this.store.getState());\n }\n /** @internal */\n get _sessionAuthState() {\n return getAuthState(this.store.getState());\n }\n /** @internal */\n _waitUntilSessionAuthorized() {\n const authStatus = getAuthStatus(this.store.getState());\n switch (authStatus) {\n case \"authorized\":\n return Promise.resolve(this);\n /**\n * `unknown` is the initial state of the auth reducer\n * so if we've got this far it means it's the first\n * time the user is calling `connect`.\n */\n case \"unknown\":\n /**\n * `authorizing` means that the user is calling\n * `connect` again while we're in the process of\n * authorizing the session.\n */\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 /** @internal */\n runWorker(name, def) {\n if (this._workers.has(name)) {\n getLogger().warn(\n `[runWorker] Worker with name ${name} has already been registerd.`\n );\n } else {\n this._setWorker(name, def);\n }\n return this._attachWorker(name, def);\n }\n _setWorker(name, def) {\n this._workers.set(name, def);\n }\n _attachWorker(name, _a) {\n var _b = _a, { worker } = _b, params = __objRest(_b, [\"worker\"]);\n const task = this.store.runSaga(worker, __spreadValues({\n instance: this,\n runSaga: this.store.runSaga\n }, params));\n this._runningWorkers.push(task);\n this._workers.delete(name);\n return task;\n }\n detachWorkers() {\n this._runningWorkers.forEach((task) => {\n task.cancel();\n });\n this._runningWorkers = [];\n }\n};\n\n// src/BaseClient.ts\nvar BaseClient = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n }\n /**\n * Connect the underlay WebSocket connection to the SignalWire network.\n *\n * @returns Promise that will resolve with the Client object.\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 /**\n * Disconnect the Client from the SignalWire network.\n */\n disconnect() {\n this.store.dispatch(destroyAction());\n }\n removeAllListeners(event) {\n this.sessionEventNames().forEach((eventName) => {\n this.sessionEmitter.off(eventName);\n });\n return super.removeAllListeners(event);\n }\n};\n\n// src/BaseConsumer.ts\nvar BaseConsumer = class extends BaseComponent {\n constructor(options) {\n super(options);\n this.options = options;\n __publicField(this, \"subscribeMethod\", \"signalwire.subscribe\");\n __publicField(this, \"subscribeParams\", {});\n __publicField(this, \"_latestExecuteParams\");\n const resetLatestExecuteParams = () => {\n this._latestExecuteParams = void 0;\n };\n super.session.on(\"session.connected\", resetLatestExecuteParams);\n super.session.on(\"session.disconnected\", resetLatestExecuteParams);\n super.session.on(\"session.reconnecting\", resetLatestExecuteParams);\n }\n shouldExecuteSubscribe(execParams) {\n return !this._latestExecuteParams || JSON.stringify(execParams) !== JSON.stringify(this._latestExecuteParams);\n }\n async subscribe() {\n await this._waitUntilSessionAuthorized();\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length === 0) {\n this.logger.debug(\n \"`subscribe()` was called without any listeners attached.\"\n );\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(\n \"BaseConsumer.subscribe() - Skipped .execute() since the execParams are exactly the same as last time\"\n );\n return;\n }\n this._latestExecuteParams = execParams;\n return new Promise(async (resolve, reject) => {\n try {\n await this.execute(execParams);\n return resolve(void 0);\n } catch (error) {\n return reject(error);\n }\n });\n }\n};\n\n// src/redux/features/shared/namespace.ts\nvar isVideoMemberEvent = (action) => {\n return action.type.startsWith(\"video.member.\") || // TODO: find a better way to do this check.\n action.type.startsWith(\"video.__synthetic__.member\");\n};\nvar isVideoRoomEvent = (action) => {\n return action.type.startsWith(\"video.room.\");\n};\nvar isVideoRoomAudienceCountEvent = (action) => {\n return action.type === \"video.room.audience_count\" || action.type === \"video.room.audienceCount\";\n};\nvar isVideoLayoutEvent = (action) => {\n return action.type.startsWith(\"video.layout.\");\n};\nvar isVideoRecordingEvent = (action) => {\n return action.type.startsWith(\"video.recording.\");\n};\nvar isVideoPlaybackEvent = (action) => {\n return action.type.startsWith(\"video.playback.\");\n};\nvar isVideoStreamEvent = (action) => {\n return action.type.startsWith(\"video.stream.\");\n};\nvar isChatEvent = (action) => {\n return action.type.startsWith(\"chat.\");\n};\nvar isVoiceCallEvent = (action) => {\n return action.type.startsWith(\"calling.\");\n};\nvar findNamespaceInPayload = (action) => {\n var _a;\n if (action.payload === void 0) {\n return \"\";\n } else if (isVideoMemberEvent(action) || isVideoLayoutEvent(action) || isVideoRecordingEvent(action) || isVideoPlaybackEvent(action) || isVideoStreamEvent(action) || isVideoRoomAudienceCountEvent(action)) {\n return action.payload.room_session_id;\n } else if (isVideoRoomEvent(action)) {\n return action.payload.room_session.id;\n } else if (isChatEvent(action)) {\n return \"\";\n } else if (isVoiceCallEvent(action)) {\n return (_a = action.payload.tag) != null ? _a : \"\";\n }\n if (\"development\" === process.env.NODE_ENV) {\n getLogger().info(\n \"Namespace not found for action.type: \",\n action == null ? void 0 : action.type\n );\n }\n return \"\";\n};\n\n// src/types/videoMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS = {\n audio_muted: true,\n video_muted: true,\n deaf: true,\n visible: true,\n input_volume: 1,\n output_volume: 1,\n input_sensitivity: 1\n};\nvar INTERNAL_MEMBER_UPDATED_EVENTS = Object.keys(\n INTERNAL_MEMBER_UPDATABLE_PROPS\n).map((key) => {\n return `${PRODUCT_PREFIX_VIDEO}.member.updated.${key}`;\n});\nvar MEMBER_UPDATABLE_PROPS = toExternalJSON(\n INTERNAL_MEMBER_UPDATABLE_PROPS\n);\nvar MEMBER_UPDATED_EVENTS = Object.keys(MEMBER_UPDATABLE_PROPS).map(\n (key) => {\n return `member.updated.${key}`;\n }\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/types/fabricMember.ts\nvar INTERNAL_MEMBER_UPDATABLE_PROPS2 = {\n audioMuted: true,\n videoMuted: true,\n deaf: true,\n visible: true,\n inputVolume: 1,\n outputVolume: 1,\n inputSensitivity: 1\n};\nvar INTERNAL_CALL_FABRIC_MEMBER_UPDATED_EVENTS = Object.keys(\n INTERNAL_MEMBER_UPDATABLE_PROPS2\n).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 RoomSessionStreamAPI: () => RoomSessionStreamAPI,\n audioMuteMember: () => audioMuteMember,\n audioUnmuteMember: () => audioUnmuteMember,\n createRoomSessionPlaybackObject: () => createRoomSessionPlaybackObject,\n createRoomSessionRecordingObject: () => createRoomSessionRecordingObject,\n createRoomSessionStreamObject: () => createRoomSessionStreamObject,\n deafMember: () => deafMember,\n deleteMemberMeta: () => deleteMemberMeta,\n deleteMeta: () => deleteMeta,\n demote: () => demote,\n getLayouts: () => getLayouts,\n getMemberMeta: () => getMemberMeta,\n getMembers: () => getMembers,\n getMeta: () => getMeta,\n getPlaybacks: () => getPlaybacks,\n getRecordings: () => getRecordings,\n getStreams: () => getStreams,\n hideVideoMuted: () => hideVideoMuted,\n lock: () => lock,\n play: () => play,\n promote: () => promote,\n removeAllMembers: () => removeAllMembers,\n removeMember: () => removeMember,\n setDeaf: () => setDeaf,\n setHideVideoMuted: () => setHideVideoMuted,\n setInputSensitivityMember: () => setInputSensitivityMember,\n setInputVolumeMember: () => setInputVolumeMember,\n setLayout: () => setLayout,\n setMemberMeta: () => setMemberMeta,\n setMemberPosition: () => setMemberPosition,\n setMeta: () => setMeta,\n setOutputVolumeMember: () => setOutputVolumeMember,\n setPositions: () => setPositions,\n setPrioritizeHandraise: () => setPrioritizeHandraise,\n setRaisedHand: () => setRaisedHand,\n showVideoMuted: () => showVideoMuted,\n startRecording: () => startRecording,\n startStream: () => startStream,\n undeafMember: () => undeafMember,\n unlock: () => unlock,\n updateMemberMeta: () => updateMemberMeta,\n updateMeta: () => updateMeta,\n videoMuteMember: () => videoMuteMember,\n videoUnmuteMember: () => videoUnmuteMember\n});\n\n// src/rooms/methods.ts\nvar baseCodeTransform = () => {\n};\nvar createRoomMethod = (method, options = {}) => ({\n value: function(params = {}) {\n return this.execute(\n {\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n },\n options\n );\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 {\n method,\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId || this.memberId\n }, rest)\n },\n options\n );\n }\n});\nvar getLayouts = createRoomMethod(\n \"video.list_available_layouts\",\n {\n transformResolve: (payload) => ({ layouts: payload.layouts })\n }\n);\nvar getMembers = createRoomMethod(\n \"video.members.get\",\n {\n transformResolve: (payload) => ({ members: payload.members })\n }\n);\nvar setLayout = createRoomMethod(\n \"video.set_layout\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar setPositions = createRoomMethod(\n \"video.set_position\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar hideVideoMuted = createRoomMethod(\n \"video.hide_video_muted\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar showVideoMuted = createRoomMethod(\n \"video.show_video_muted\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar lock = createRoomMethod(\"video.lock\", {\n transformResolve: baseCodeTransform\n});\nvar unlock = createRoomMethod(\"video.unlock\", {\n transformResolve: baseCodeTransform\n});\nvar setHideVideoMuted = {\n value: function(value) {\n return this.execute(\n {\n method: value ? \"video.hide_video_muted\" : \"video.show_video_muted\",\n params: {\n room_session_id: this.roomSessionId\n }\n },\n {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\nvar getRecordings = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recordings } = await this.execute({\n method: \"video.recording.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstances = [];\n recordings.forEach((recording) => {\n let recordingInstance = this.instanceMap.get(\n recording.id\n );\n if (!recordingInstance) {\n recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n } else {\n recordingInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n });\n }\n recordingInstances.push(recordingInstance);\n this.instanceMap.set(\n recordingInstance.id,\n recordingInstance\n );\n });\n resolve({ recordings: recordingInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startRecording = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { recording } = await this.execute({\n method: \"video.recording.start\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const recordingInstance = createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n recording\n }\n });\n this.instanceMap.set(\n recordingInstance.id,\n recordingInstance\n );\n resolve(recordingInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar getPlaybacks = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { playbacks } = await this.execute({\n method: \"video.playback.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const playbackInstances = [];\n playbacks.forEach((playback) => {\n let playbackInstance = this.instanceMap.get(\n playback.id\n );\n if (!playbackInstance) {\n playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n } else {\n playbackInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n });\n }\n playbackInstances.push(playbackInstance);\n this.instanceMap.set(\n playbackInstance.id,\n playbackInstance\n );\n });\n resolve({ playbacks: playbackInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar play = {\n value: function(_a) {\n var _b = _a, { seekPosition, currentTimecode } = _b, params = __objRest(_b, [\"seekPosition\", \"currentTimecode\"]);\n return new Promise(async (resolve, reject) => {\n try {\n const seek_position = seekPosition || currentTimecode;\n const { playback } = await this.execute({\n method: \"video.playback.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n seek_position\n }, params)\n });\n const playbackInstance = createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n playback\n }\n });\n this.instanceMap.set(\n playbackInstance.id,\n playbackInstance\n );\n resolve(playbackInstance);\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar createRoomMetaMethod = (method) => {\n return createRoomMethod(method, {\n transformResolve: baseCodeTransform,\n transformParams: (params) => {\n const _a = params, { room_session_id } = _a, meta = __objRest(_a, [\"room_session_id\"]);\n return { room_session_id, meta };\n }\n });\n};\nvar getMeta = createRoomMethod(\"video.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMeta = createRoomMetaMethod(\"video.set_meta\");\nvar updateMeta = createRoomMetaMethod(\"video.update_meta\");\nvar deleteMeta = {\n value: function(params) {\n return this.execute({\n method: \"video.delete_meta\",\n params: {\n room_session_id: this.roomSessionId,\n keys: params\n }\n });\n }\n};\nvar getStreams = {\n value: function() {\n return new Promise(async (resolve, reject) => {\n try {\n const { streams } = await this.execute({\n method: \"video.stream.list\",\n params: {\n room_session_id: this.roomSessionId\n }\n });\n const streamInstances = [];\n streams.forEach((stream) => {\n let streamInstance = this.instanceMap.get(\n stream.id\n );\n if (!streamInstance) {\n streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n } else {\n streamInstance.setPayload({\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n });\n }\n streamInstances.push(streamInstance);\n this.instanceMap.set(\n streamInstance.id,\n streamInstance\n );\n });\n resolve({ streams: streamInstances });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar startStream = {\n value: function(params) {\n return new Promise(async (resolve, reject) => {\n try {\n const { stream } = await this.execute({\n method: \"video.stream.start\",\n params: __spreadValues({\n room_session_id: this.roomSessionId\n }, params)\n });\n const streamInstance = createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: this.roomId,\n room_session_id: this.roomSessionId,\n stream\n }\n });\n this.instanceMap.set(\n streamInstance.id,\n streamInstance\n );\n resolve({ stream: streamInstance });\n } catch (error) {\n reject(error);\n }\n });\n }\n};\nvar setPrioritizeHandraise = {\n value: function(params) {\n return this.execute({\n method: \"video.prioritize_handraise\",\n params: {\n room_session_id: this.roomSessionId,\n enable: params\n }\n });\n }\n};\nvar audioMuteMember = createRoomMemberMethod(\n \"video.member.audio_mute\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar audioUnmuteMember = createRoomMemberMethod(\n \"video.member.audio_unmute\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar videoMuteMember = createRoomMemberMethod(\n \"video.member.video_mute\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar videoUnmuteMember = createRoomMemberMethod(\n \"video.member.video_unmute\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar deafMember = createRoomMemberMethod(\n \"video.member.deaf\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar undeafMember = createRoomMemberMethod(\n \"video.member.undeaf\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar setDeaf = {\n value: function(value) {\n return this.execute(\n {\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 {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\nvar setInputVolumeMember = createRoomMemberMethod(\n \"video.member.set_input_volume\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar setOutputVolumeMember = createRoomMemberMethod(\"video.member.set_output_volume\", {\n transformResolve: baseCodeTransform\n});\nvar setInputSensitivityMember = createRoomMemberMethod(\"video.member.set_input_sensitivity\", {\n transformResolve: baseCodeTransform\n});\nvar promote = {\n value: function(_a) {\n var _b = _a, {\n memberId,\n mediaAllowed,\n joinAudioMuted,\n joinVideoMuted\n } = _b, rest = __objRest(_b, [\n \"memberId\",\n \"mediaAllowed\",\n \"joinAudioMuted\",\n \"joinVideoMuted\"\n ]);\n return this.execute(\n {\n method: \"video.member.promote\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed,\n join_audio_muted: joinAudioMuted,\n join_video_muted: joinVideoMuted\n }, rest)\n },\n {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\nvar demote = {\n value: function({ memberId, mediaAllowed }) {\n return this.execute(\n {\n method: \"video.member.demote\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId,\n media_allowed: mediaAllowed\n }\n },\n {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\nvar setMemberPosition = createRoomMemberMethod(\n \"video.member.set_position\",\n {\n transformResolve: baseCodeTransform\n }\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 {\n method: \"video.member.remove\",\n params: __spreadValues({\n room_session_id: this.roomSessionId,\n member_id: memberId\n }, rest)\n },\n {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\nvar removeAllMembers = {\n value: function() {\n return this.execute(\n {\n method: \"video.member.remove\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: \"all\"\n }\n },\n {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\nvar getMemberMeta = createRoomMemberMethod(\"video.member.get_meta\", {\n transformResolve: ({ meta }) => ({ meta })\n});\nvar setMemberMeta = createRoomMemberMethod(\n \"video.member.set_meta\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar updateMemberMeta = createRoomMemberMethod(\n \"video.member.update_meta\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar deleteMemberMeta = createRoomMemberMethod(\n \"video.member.delete_meta\",\n {\n transformResolve: baseCodeTransform\n }\n);\nvar setRaisedHand = {\n value: function(value) {\n const { raised = true, memberId = this.memberId } = value || {};\n if (!memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument');\n }\n return this.execute(\n {\n method: raised ? \"video.member.raisehand\" : \"video.member.lowerhand\",\n params: {\n room_session_id: this.roomSessionId,\n member_id: memberId\n }\n },\n {\n transformResolve: baseCodeTransform\n }\n );\n }\n};\n\n// src/rooms/RoomSessionRecording.ts\nvar RoomSessionRecordingAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.recording.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.recording.state;\n }\n get duration() {\n return this._payload.recording.duration;\n }\n get startedAt() {\n if (!this._payload.recording.started_at) return void 0;\n return new Date(\n this._payload.recording.started_at * 1e3\n );\n }\n get endedAt() {\n if (!this._payload.recording.ended_at) return void 0;\n return new Date(\n this._payload.recording.ended_at * 1e3\n );\n }\n /** @internal */\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.recording.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.recording.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.recording.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n recording_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionRecordingObject = (params) => {\n const recording = connect({\n store: params.store,\n Component: RoomSessionRecordingAPI\n })(params);\n return recording;\n};\n\n// src/rooms/RoomSessionPlayback.ts\nvar RoomSessionPlaybackAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.playback.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get url() {\n return this._payload.playback.url;\n }\n get state() {\n return this._payload.playback.state;\n }\n get volume() {\n return this._payload.playback.volume;\n }\n get startedAt() {\n if (!this._payload.playback.started_at) return void 0;\n return new Date(\n this._payload.playback.started_at * 1e3\n );\n }\n get endedAt() {\n if (!this._payload.playback.ended_at) return void 0;\n return new Date(\n this._payload.playback.ended_at * 1e3\n );\n }\n get position() {\n return this._payload.playback.position;\n }\n get seekable() {\n return this._payload.playback.seekable;\n }\n /** @internal */\n setPayload(payload) {\n this._payload = payload;\n }\n async pause() {\n await this.execute({\n method: \"video.playback.pause\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async resume() {\n await this.execute({\n method: \"video.playback.resume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async stop() {\n await this.execute({\n method: \"video.playback.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\")\n }\n });\n }\n async setVolume(volume) {\n await this.execute({\n method: \"video.playback.set_volume\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n volume\n }\n });\n }\n async seek(timecode) {\n await this.execute({\n method: \"video.playback.seek_absolute\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(timecode)\n }\n });\n }\n async forward(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: Math.abs(offset)\n }\n });\n }\n async rewind(offset = 5e3) {\n await this.execute({\n method: \"video.playback.seek_relative\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n playback_id: this.getStateProperty(\"id\"),\n position: -Math.abs(offset)\n }\n });\n }\n};\nvar createRoomSessionPlaybackObject = (params) => {\n const playback = connect({\n store: params.store,\n Component: RoomSessionPlaybackAPI\n })(params);\n return playback;\n};\n\n// src/rooms/RoomSessionStream.ts\nvar RoomSessionStreamAPI = class extends BaseComponent {\n constructor(options) {\n super(options);\n __publicField(this, \"_payload\");\n this._payload = options.payload;\n }\n get id() {\n return this._payload.stream.id;\n }\n get roomId() {\n return this._payload.room_id;\n }\n get roomSessionId() {\n return this._payload.room_session_id;\n }\n get state() {\n return this._payload.stream.state;\n }\n get duration() {\n return this._payload.stream.duration;\n }\n get url() {\n return this._payload.stream.url;\n }\n get startedAt() {\n if (!this._payload.stream.started_at) return void 0;\n return new Date(\n this._payload.stream.started_at * 1e3\n );\n }\n get endedAt() {\n if (!this._payload.stream.ended_at) return void 0;\n return new Date(this._payload.stream.ended_at * 1e3);\n }\n /** @internal */\n setPayload(payload) {\n this._payload = payload;\n }\n async stop() {\n await this.execute({\n method: \"video.stream.stop\",\n params: {\n room_session_id: this.getStateProperty(\"roomSessionId\"),\n stream_id: this.getStateProperty(\"id\")\n }\n });\n }\n};\nvar createRoomSessionStreamObject = (params) => {\n const stream = connect({\n store: params.store,\n Component: RoomSessionStreamAPI\n })(params);\n return stream;\n};\n\n// src/chat/index.ts\nvar chat_exports = {};\n__export(chat_exports, {\n BaseChatAPI: () => BaseChatAPI,\n BaseChatConsumer: () => BaseChatConsumer,\n ChatMember: () => ChatMember,\n ChatMessage: () => ChatMessage,\n applyCommonMethods: () => applyCommonMethods,\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 {\n method,\n params\n },\n options\n );\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 {\n method,\n params: __spreadValues({\n member_id: memberId\n }, rest)\n },\n options\n );\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(\n \"chat.members.get\",\n {\n transformResolve: (payload) => ({\n members: payload.members.map((member) => toExternalJSON(member))\n })\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(\n \"chat.member.set_state\",\n {\n transformResolve: baseCodeTransform2,\n transformParams: transformParamChannels\n }\n);\nvar getMemberState = createChatMemberMethod(\"chat.member.get_state\", {\n transformResolve: (payload) => ({ channels: payload.channels }),\n transformParams: transformParamChannels\n});\n\n// src/pubSub/index.ts\nvar pubSub_exports = {};\n__export(pubSub_exports, {\n BasePubSubConsumer: () => BasePubSubConsumer,\n PubSubMessage: () => PubSubMessage,\n createBasePubSubObject: () => createBasePubSubObject\n});\n\n// src/pubSub/workers/pubSubWorker.ts\nvar pubSubWorker = function* (options) {\n getLogger().trace(\"pubSubWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case `${PRODUCT_PREFIX_PUBSUB}.channel.message`: {\n const {\n channel: channel3,\n message: _a\n } = payload, _b = _a, { member } = _b, restMessage = __objRest(_b, [\"member\"]);\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, restMessage), {\n channel: channel3\n }));\n const pubSubMessage = new PubSubMessage(externalJSON);\n client.emit(\"message\", pubSubMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown pubsub event: \"${type}\"`);\n break;\n }\n }\n const isPubSubEvent = (action) => action.type.startsWith(`${PRODUCT_PREFIX_PUBSUB}.`);\n while (true) {\n const action = yield sagaEffects.take(\n swEventChannel,\n isPubSubEvent\n );\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"pubSubWorker ended\");\n};\n\n// src/pubSub/BasePubSub.ts\nvar toInternalPubSubChannels = (channels) => {\n return channels.map((name) => {\n return {\n name\n };\n });\n};\nvar BasePubSubConsumer = class extends BaseConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_PUBSUB}.subscribe`);\n this.initWorker();\n }\n initWorker() {\n this.runWorker(\"pubSub\", { worker: pubSubWorker });\n }\n _getChannelsParam(channels, method) {\n const _channels = !channels || Array.isArray(channels) ? channels : [channels];\n if (!Array.isArray(_channels) || _channels.length === 0) {\n throw new Error(\n `Please specify one or more channels when calling .${method}()`\n );\n }\n return {\n channels: toInternalPubSubChannels(_channels)\n };\n }\n /** @internal */\n _setSubscribeParams(params) {\n this.subscribeParams = __spreadValues(__spreadValues({}, this.subscribeParams), params);\n }\n /** @internal */\n _getSubscribeParams({ channels }) {\n return __spreadValues({}, this._getChannelsParam(channels, \"subscribe\"));\n }\n /** @internal */\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(\n \"Subscribe was called before any listeners were attached. Move `.subscribe()` right after your event listeners to suppress this message.\"\n );\n this.once(\"message\", () => {\n });\n }\n }\n /** @internal */\n getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `${PRODUCT_PREFIX_PUBSUB}.${String(event)}`\n );\n return validateEventsToSubscribe(eventNamesWithPrefix);\n }\n async subscribe(channels) {\n this._checkMissingSubscriptions();\n const params = this._getSubscribeParams({ channels });\n this._setSubscribeParams(params);\n return super.subscribe();\n }\n async unsubscribe(channels) {\n if (this._sessionAuthStatus === \"unknown\" || this._sessionAuthStatus === \"unauthorized\") {\n throw new Error(\"You must be authenticated to unsubscribe from a channel\");\n }\n const params = this._getUnsubscribeParams({ channels });\n return new Promise(async (resolve, reject) => {\n const subscriptions = this.getSubscriptions();\n if (subscriptions.length > 0) {\n const execParams = {\n method: `${PRODUCT_PREFIX_PUBSUB}.unsubscribe`,\n params: __spreadProps(__spreadValues({}, params), {\n events: subscriptions\n })\n };\n try {\n await this.execute(execParams);\n } catch (error) {\n return reject(error);\n }\n } else {\n this.logger.warn(\n \"`unsubscribe()` was called without any listeners attached.\"\n );\n }\n return resolve();\n });\n }\n // Currently only `js` supports this features and it's\n // being ignored (filtered at the Proxy level) within\n // `realtime-api`\n updateToken(token) {\n return new Promise((resolve, reject) => {\n this.session.once(\"session.auth_error\", (error) => {\n reject(error);\n });\n this.session.once(\"session.connected\", () => {\n resolve();\n });\n this.store.dispatch(actions_exports.reauthAction({ token }));\n });\n }\n publish(params) {\n return this.execute({\n method: `${PRODUCT_PREFIX_PUBSUB}.publish`,\n params\n });\n }\n // Currently only `js` supports this features and it's\n // being ignored (filtered at the Proxy level) within\n // `realtime-api`\n async getAllowedChannels() {\n await this._waitUntilSessionAuthorized();\n const authState = this.select(getAuthState);\n if (authState && \"channels\" in authState && authState.channels) {\n return authState.channels;\n }\n return {};\n }\n};\nvar createBasePubSubObject = (params) => {\n const pubSub = connect({\n store: params.store,\n Component: BasePubSubConsumer\n })(params);\n return pubSub;\n};\n\n// src/pubSub/PubSubMessage.ts\nvar PubSubMessage = class {\n constructor(payload) {\n this.payload = payload;\n }\n /** The id of this message */\n get id() {\n return this.payload.id;\n }\n /** The channel in which this message was sent */\n get channel() {\n return this.payload.channel;\n }\n /** The content of this message */\n get content() {\n return this.payload.content;\n }\n /** Any metadata associated to this message */\n get meta() {\n return this.payload.meta;\n }\n /** The date at which this message was published */\n get publishedAt() {\n return this.payload.publishedAt;\n }\n};\n\n// src/chat/workers/chatWorker.ts\nvar chatWorker = function* (options) {\n getLogger().trace(\"chatWorker started\");\n const {\n instance: client,\n channels: { swEventChannel }\n } = options;\n function* worker(action) {\n const { type, payload } = action;\n switch (type) {\n case \"chat.channel.message\": {\n const { channel: channel3, message } = payload;\n const externalJSON = toExternalJSON(__spreadProps(__spreadValues({}, message), {\n channel: channel3\n }));\n const chatMessage = new ChatMessage(externalJSON);\n client.emit(\"message\", chatMessage);\n break;\n }\n case \"chat.member.joined\":\n case \"chat.member.updated\":\n case \"chat.member.left\": {\n const { member } = payload;\n const externalJSON = toExternalJSON(member);\n const chatMessage = new ChatMember(externalJSON);\n const event = stripNamespacePrefix(type);\n client.emit(event, chatMessage);\n break;\n }\n default:\n getLogger().warn(`Unknown chat event: \"${type}\"`);\n break;\n }\n }\n const isChatEvent2 = (action) => action.type.startsWith(\"chat.\");\n while (true) {\n const action = yield sagaEffects.take(\n swEventChannel,\n isChatEvent2\n );\n yield sagaEffects.fork(worker, action);\n }\n getLogger().trace(\"chatWorker ended\");\n};\n\n// src/chat/BaseChat.ts\nvar BaseChatConsumer = class extends BasePubSubConsumer {\n constructor(options) {\n super(options);\n __publicField(this, \"subscribeMethod\", `${PRODUCT_PREFIX_CHAT}.subscribe`);\n }\n initWorker() {\n this.runWorker(\"chat\", { worker: chatWorker });\n }\n};\nvar BaseChatAPI = extendComponent(\n BaseChatConsumer,\n {\n publish,\n getMembers: getMembers2,\n getMessages,\n setMemberState,\n getMemberState\n }\n);\nvar createBaseChatObject = (params) => {\n const chat = connect({\n store: params.store,\n Component: BaseChatAPI\n })(params);\n return chat;\n};\n\n// src/chat/ChatMessage.ts\nvar ChatMessage = class extends PubSubMessage {\n /** The member which sent this message */\n get member() {\n return this.payload.member;\n }\n};\n\n// src/chat/ChatMember.ts\nvar ChatMember = class {\n constructor(payload) {\n this.payload = payload;\n }\n /** The id of this member */\n get id() {\n return this.payload.id;\n }\n /** The channel of this member */\n get channel() {\n return this.payload.channel;\n }\n /** The state of this member */\n get state() {\n var _a;\n return (_a = this.payload.state) != null ? _a : {};\n }\n};\n\n// src/chat/applyCommonMethods.ts\nvar transformParamChannels2 = (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 baseCodeTransform3 = () => {\n};\nfunction applyCommonMethods(targetClass) {\n return class extends targetClass {\n getMembers(params) {\n return this._client.execute(\n {\n method: \"chat.members.get\",\n params\n },\n {\n transformResolve: (payload) => ({\n members: payload.members.map((member) => toExternalJSON(member))\n })\n }\n );\n }\n getMessages(params) {\n return this._client.execute(\n {\n method: \"chat.messages.get\",\n params\n },\n {\n transformResolve: (payload) => ({\n messages: payload.messages.map(\n (message) => toExternalJSON(message)\n ),\n cursor: payload.cursor\n })\n }\n );\n }\n setMemberState(_a = {}) {\n var _b = _a, { memberId } = _b, rest = __objRest(_b, [\"memberId\"]);\n return this._client.execute(\n {\n method: \"chat.member.set_state\",\n params: __spreadValues({\n member_id: memberId\n }, rest)\n },\n {\n transformResolve: baseCodeTransform3,\n transformParams: transformParamChannels2\n }\n );\n }\n getMemberState(_c = {}) {\n var _d = _c, { memberId } = _d, rest = __objRest(_d, [\"memberId\"]);\n return this._client.execute(\n {\n method: \"chat.member.get_state\",\n params: __spreadValues({\n member_id: memberId\n }, rest)\n },\n {\n transformResolve: (payload) => ({\n channels: payload.channels\n }),\n transformParams: transformParamChannels2\n }\n );\n }\n };\n}\n\n// src/memberPosition/index.ts\nvar memberPosition_exports = {};\n__export(memberPosition_exports, {\n memberPositionWorker: () => memberPositionWorker,\n memberUpdatedWorker: () => memberUpdatedWorker\n});\n\n// src/memberPosition/workers.ts\nimport { fork as fork3 } from \"@redux-saga/core/effects\";\nvar defaultDispatcher = function* (type, payload, instance) {\n const event = stripNamespacePrefix(type);\n instance.emit(event, payload);\n};\nfunction* memberPositionLayoutChangedWorker(options) {\n const {\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n } = options;\n const layers = action.payload.layout.layers;\n const processedMembers = {};\n layers.forEach((layer) => {\n var _a;\n const memberId = layer.member_id;\n if (!memberId) {\n return;\n }\n const memberEventParams = memberList.get(memberId);\n if (memberEventParams && layer.position !== ((_a = memberEventParams.member) == null ? void 0 : _a.current_position)) {\n mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: layer.position\n });\n processedMembers[memberId] = true;\n } else {\n processedMembers[memberId] = false;\n }\n });\n for (const [memberId, payload] of memberList) {\n if (processedMembers[memberId]) {\n yield dispatcher == null ? void 0 : dispatcher(\"video.member.updated\", payload, instance);\n } else if (processedMembers[memberId] === void 0) {\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: \"off-canvas\"\n });\n if (!updatedMemberEventParams) {\n return;\n }\n yield dispatcher == null ? void 0 : dispatcher(\n \"video.member.updated\",\n updatedMemberEventParams,\n instance\n );\n }\n }\n}\nfunction* memberUpdatedWorker({\n action,\n memberList,\n instance,\n dispatcher = defaultDispatcher\n}) {\n var _a, _b;\n const memberId = action.payload.member.id;\n const updatedMemberEventParams = mutateMemberCurrentPosition({\n memberList,\n memberId,\n currentPosition: (_b = (_a = memberList.get(memberId)) == null ? void 0 : _a.member) == null ? void 0 : _b.current_position\n });\n if (!updatedMemberEventParams) {\n return;\n }\n const {\n member: { updated = [] }\n } = action.payload;\n const memberUpdatedPayload = __spreadProps(__spreadValues({}, updatedMemberEventParams), {\n member: __spreadValues(__spreadValues({}, updatedMemberEventParams.member), action.payload.member)\n });\n memberList.set(memberId, memberUpdatedPayload);\n for (const key of updated) {\n const type = `${action.type}.${key}`;\n yield dispatcher == null ? void 0 : dispatcher(type, memberUpdatedPayload, instance);\n }\n yield dispatcher == null ? void 0 : dispatcher(action.type, memberUpdatedPayload, instance);\n}\nvar memberPositionWorker = function* memberPositionWorker2({\n instance,\n channels,\n initialState,\n getSession: getSession2,\n instanceMap,\n dispatcher = defaultDispatcher\n}) {\n if (!initialState) {\n return;\n }\n const { swEventChannel } = channels;\n let memberList = initializeMemberList(initialState);\n const addToMemberList = (payload) => {\n if (!memberList.has(payload.member.id)) {\n memberList.set(payload.member.id, payload);\n }\n };\n while (true) {\n const action = yield sagaEffects.take(\n swEventChannel,\n (action2) => {\n const istargetEvent = action2.type === \"video.member.joined\" || action2.type === \"video.member.updated\" || action2.type === \"video.member.left\" || action2.type === \"video.layout.changed\";\n return istargetEvent;\n }\n );\n switch (action.type) {\n case \"video.member.joined\": {\n addToMemberList(action.payload);\n break;\n }\n case \"video.member.updated\": {\n addToMemberList(action.payload);\n yield fork3(memberUpdatedWorker, {\n action,\n channels,\n memberList,\n instance,\n getSession: getSession2,\n instanceMap,\n dispatcher\n });\n break;\n }\n case \"video.member.left\": {\n const member = action.payload.member;\n memberList.delete(member.id);\n break;\n }\n case \"video.layout.changed\": {\n yield fork3(memberPositionLayoutChangedWorker, {\n action,\n channels,\n memberList,\n instance,\n dispatcher\n });\n break;\n }\n }\n }\n};\nvar mutateMemberCurrentPosition = ({\n memberList,\n memberId,\n currentPosition\n}) => {\n const memberEventParams = memberList.get(memberId);\n if (!memberEventParams) {\n return;\n } else if (!currentPosition) {\n return memberEventParams;\n }\n const updatedMemberEventParams = __spreadProps(__spreadValues({}, memberEventParams), {\n member: __spreadProps(__spreadValues({}, memberEventParams == null ? void 0 : memberEventParams.member), {\n current_position: currentPosition\n })\n });\n memberList.set(memberId, updatedMemberEventParams);\n return updatedMemberEventParams;\n};\nvar initializeMemberList = (payload) => {\n const members = payload.room_session.members;\n const memberList = /* @__PURE__ */ new Map();\n members.forEach((member) => {\n const memberId = member.id;\n const roomSessionId = payload.room_session.id || payload.room_session.room_session_id;\n memberList.set(memberId, {\n room_id: payload.room_session.room_id,\n room_session_id: roomSessionId,\n member\n });\n });\n return memberList;\n};\n\n// src/testUtils.ts\nvar testUtils_exports = {};\n__export(testUtils_exports, {\n configureFullStack: () => configureFullStack,\n configureJestStore: () => configureJestStore,\n createMockedLogger: () => createMockedLogger,\n createSessionChannel: () => createSessionChannel,\n createSwEventChannel: () => createSwEventChannel,\n rpcConnectResultVRT: () => rpcConnectResultVRT,\n wait: () => wait\n});\nimport { channel as channel2, multicastChannel as multicastChannel2 } from \"@redux-saga/core\";\nvar PROJECT_ID = \"8f0a119a-cda7-4497-a47d-c81493b824d4\";\nvar TOKEN = \"<VRT>\";\nvar createMockedLogger = () => ({\n fatal: jest.fn(),\n error: jest.fn(),\n warn: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n trace: jest.fn(),\n wsTraffic: jest.fn()\n});\nvar configureJestStore = (options) => {\n return configureStore2(__spreadValues({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false\n },\n SessionConstructor: BaseSession,\n runRootSaga: false\n }, options));\n};\nvar configureFullStack = () => {\n const session = {\n dispatch: console.log,\n connect: jest.fn(),\n disconnect: jest.fn(),\n execute: jest.fn()\n };\n const emitter = new EventEmitter();\n const store = configureStore2({\n userOptions: {\n project: PROJECT_ID,\n token: TOKEN,\n devTools: false\n },\n SessionConstructor: jest.fn().mockImplementation(() => {\n return session;\n })\n });\n store.dispatch(actions_exports.initAction());\n store.dispatch(actions_exports.authSuccessAction());\n return {\n store,\n session,\n emitter,\n destroy: () => store.dispatch(actions_exports.destroyAction())\n };\n};\nvar wait = (ms) => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n};\nvar rpcConnectResultVRT = {\n identity: \"f3bc99df-2c3d-4fa4-b1dc-e8a8ffc579e6@e3fefa44-1bad-4be9-ad9b-1cbb9abd60c7.west-us\",\n authorization: {\n type: \"video\",\n project_id: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n project: \"8f0a119a-cda7-4497-a47d-c81493b824d4\",\n scopes: [\"video\"],\n scope_id: \"26675883-8499-4ee9-85eb-691c4aa209f8\",\n resource: \"9c80f1e8-9430-4070-a043-937eb3a96b38\",\n join_as: \"member\",\n user_name: \"Joe\",\n room: {\n name: \"lobby\",\n display_name: \"Lobby\",\n scopes: [\"room.self.audio_mute\", \"room.self.audio_unmute\"],\n meta: {}\n },\n signature: \"SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q\",\n media_allowed: \"all\",\n audio_allowed: \"both\",\n video_allowed: \"both\",\n meta: {}\n },\n protocol: \"signalwire_SGZtkRD9fvuBAOUp1UF56zESxdEvGT6qSGZtkRD9fvuBAOUp1UF56zESxdEvGT6q_03e8c927-8ea3-4661-86d5-778c3e03296a_8f0a119a-cda7-4497-a47d-c81493b824d4\",\n ice_servers: [\n {\n urls: \"turn.swire.io:443\",\n credential: \"sFTwvi8ShXcYNOcyYjFy3ATIUpQ=\",\n //@ts-expect-error\n credentialType: \"password\",\n username: \"1619521908:8f0a119a-cda7-4497-a47d-c81493b824d4\"\n }\n ]\n};\nvar createSwEventChannel = () => multicastChannel2();\nvar createSessionChannel = () => channel2();\n\n// src/index.ts\nvar selectors = __spreadValues({}, sessionSelectors_exports);\nexport {\n AuthError,\n BaseClient,\n BaseComponent,\n BaseConsumer,\n BaseJWTSession,\n BaseSession,\n chat_exports as Chat,\n ChatMember,\n ChatMessage,\n DEFAULT_CONNECT_VERSION,\n EventEmitter,\n GLOBAL_VIDEO_EVENTS,\n HttpError,\n INTERNAL_CALL_FABRIC_MEMBER_UPDATED_EVENTS,\n INTERNAL_MEMBER_UPDATABLE_PROPS,\n INTERNAL_MEMBER_UPDATED_EVENTS,\n LOCAL_EVENT_PREFIX,\n MEMBER_UPDATABLE_PROPS,\n MEMBER_UPDATED_EVENTS,\n memberPosition_exports as MemberPosition,\n pubSub_exports as PubSub,\n PubSubMessage,\n RPCConnect,\n RPCDisconnectResponse,\n RPCEventAckResponse,\n RPCExecute,\n RPCPing,\n RPCPingResponse,\n RPCReauthenticate,\n rooms_exports as Rooms,\n SWCloseEvent,\n UNIFIED_CONNECT_VERSION,\n VertoAnswer,\n VertoAttach,\n VertoBye,\n VertoInfo,\n VertoInvite,\n VertoModify,\n VertoPong,\n VertoResult,\n VertoSubscribe,\n WEBRTC_EVENT_TYPES,\n actions_exports as actions,\n componentActions,\n componentReducer,\n componentSelectors_exports as componentSelectors,\n configureStore2 as configureStore,\n connect,\n debounce,\n extendComponent,\n findNamespaceInPayload,\n fromSnakeToCamelCase,\n getEventEmitter,\n getLogger,\n initialComponentState,\n initialSessionState,\n isGlobalEvent,\n isJSONRPCRequest,\n isJSONRPCResponse,\n isSATAuth,\n isWebrtcEventType,\n makeRPCRequest,\n makeRPCResponse,\n sagaEffects,\n sagaHelpers_exports as sagaHelpers,\n selectors,\n sessionActions,\n sessionReducer,\n setLogger,\n stripNamespacePrefix,\n testUtils_exports as testUtils,\n timeoutPromise,\n toExternalJSON,\n toInternalAction,\n toInternalEventName,\n toLocalEvent,\n toSnakeCaseKeys,\n toSyntheticEvent,\n v4 as uuid,\n validateEventsToSubscribe\n};\n//# sourceMappingURL=index.esm.js.map\n","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import { getLogger } from '@signalwire/core';\nexport const RTCPeerConnection = (config) => {\n return new window.RTCPeerConnection(config);\n};\n/**\n * Returns whether the current environment supports the media devices API.\n */\nexport const supportsMediaDevices = () => {\n return typeof navigator !== 'undefined' && !!navigator.mediaDevices;\n};\n/**\n * Returns the mediaDevices object if supported, otherwise throws an error.\n */\nexport const getMediaDevicesApi = () => {\n if (!supportsMediaDevices()) {\n throw new Error(\"The media devices API isn't supported in this environment\");\n }\n return navigator.mediaDevices;\n};\n/**\n * Returns whether the current environment supports `getUserMedia`.\n */\nexport const supportsGetUserMedia = () => {\n return typeof getMediaDevicesApi().getUserMedia === 'function';\n};\n/**\n * Returns whether the current environment supports `getDisplayMedia`.\n */\nexport const supportsGetDisplayMedia = () => {\n return typeof getMediaDevicesApi().getDisplayMedia === 'function';\n};\n/**\n * Returns a dictionary whose fields specify the constrainable properties the user agent understands.\n */\nexport const getSupportedConstraints = () => {\n return getMediaDevicesApi().getSupportedConstraints();\n};\nexport const streamIsValid = (stream) => stream && stream instanceof MediaStream;\n/**\n * Returns whether the current environment supports the selection of a media output device.\n */\nexport const supportsMediaOutput = () => {\n return 'sinkId' in HTMLMediaElement.prototype;\n};\n/**\n * Assigns the specified audio output device to the specified HTMLMediaElement.\n * The device with id `deviceId` must be an audio output device. Asynchronously\n * returns whether the operation had success.\n *\n * > 📘\n * > Some browsers do not support output device selection. You can check by\n * > calling [`supportsMediaOutput`](supportsMediaOutput).\n *\n * @param el target element\n * @param deviceId id of the audio output device\n * @returns a promise of whether the operation had success\n *\n * @example\n * ```typescript\n * const el = document.querySelector('video')\n * const outDevices = await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * await SignalWire.WebRTC.setMediaElementSinkId(el, outDevices[0].deviceId)\n * // true\n```\n */\nexport const setMediaElementSinkId = async (el, deviceId) => {\n if (el === null) {\n getLogger().warn('No HTMLMediaElement to attach the speakerId');\n return;\n }\n else if (typeof deviceId !== 'string') {\n getLogger().warn(`Invalid speaker deviceId: '${deviceId}'`);\n return;\n }\n else if (!supportsMediaOutput()) {\n getLogger().warn('Browser does not support output device selection.');\n return;\n }\n try {\n // @ts-ignore\n return await el.setSinkId(deviceId);\n }\n catch (error) {\n if (error.name === 'SecurityError') {\n getLogger().error(`You need to use HTTPS for selecting audio output device: ${error}`);\n }\n else {\n getLogger().error(`Error: ${error}`);\n }\n throw error;\n }\n};\nexport const sdpToJsonHack = (sdp) => sdp;\nexport const stopStream = (stream) => {\n var _a;\n if (streamIsValid(stream)) {\n (_a = stream === null || stream === void 0 ? void 0 : stream.getTracks()) === null || _a === void 0 ? void 0 : _a.forEach(stopTrack);\n }\n};\nexport const stopTrack = (track) => {\n if (track && track.readyState === 'live') {\n track.stop();\n track.dispatchEvent(new Event('ended'));\n }\n};\n/**\n * Maps permission's names from `DevicePermissionDescriptor[\"name\"]`\n * to `MediaDeviceKind`\n */\nconst PERMISSIONS_MAPPING = {\n camera: 'videoinput',\n microphone: 'audioinput',\n speaker: 'audiooutput',\n};\nexport const _getMediaDeviceKindByName = (name) => {\n if (!name) {\n return undefined;\n }\n return PERMISSIONS_MAPPING[name];\n};\n//# sourceMappingURL=primitives.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Enumerates the media input and output devices available on this device.\n *\n * > 📘\n * > Depending on the browser, some information (such as the `label` and\n * > `deviceId` attributes) could be hidden until permission is granted, for\n * > example by calling {@link getUserMedia}.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.enumerateDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"EEX/N2...AjrOs=\"\n * // },\n * // ...\n * // ]\n * ```\n */\nexport const enumerateDevices = () => {\n return getMediaDevicesApi().enumerateDevices();\n};\nexport const enumerateDevicesByKind = async (filterByKind) => {\n let devices = await enumerateDevices().catch((_error) => []);\n if (filterByKind) {\n devices = devices.filter(({ kind }) => kind === filterByKind);\n }\n return devices;\n};\n//# sourceMappingURL=enumerateDevices.js.map","import { getLogger } from '@signalwire/core';\nimport { _getMediaDeviceKindByName } from './primitives';\nimport { enumerateDevicesByKind } from './enumerateDevices';\n/**\n * For browsers not supporting the Permissions API\n * @param {string} kind\n * @returns\n */\nconst _legacyCheckPermissions = async (kind) => {\n const devices = await enumerateDevicesByKind(kind);\n if (!devices.length) {\n getLogger().warn(`No ${kind} devices to check for permissions!`);\n return null;\n }\n return devices.every(({ deviceId, label }) => Boolean(deviceId && label));\n};\n/**\n * Asynchronously returns whether we have permissions to access the specified\n * resource. Some common parameter values for `name` are `\"camera\"`,\n * `\"microphone\"`, and `\"speaker\"`. In those cases, prefer the dedicated methods\n * {@link checkCameraPermissions}, {@link checkMicrophonePermissions}, and\n * {@link checkSpeakerPermissions}.\n * @param name name of the resource\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkPermissions(\"camera\")\n * // true: we have permission for using the camera\n * ```\n */\nexport const checkPermissions = async (name) => {\n if ('permissions' in navigator &&\n typeof navigator.permissions.query === 'function' &&\n name) {\n try {\n /**\n * `navigator.permissions.query` can throw if `name` is not a\n * valid enumation value for `PermissionName`. As of today, some\n * browsers like Fireforx will throw with `name: \"camera\"`\n */\n // @ts-expect-error\n const status = await navigator.permissions.query({ name });\n return status.state === 'granted';\n }\n catch (e) { }\n }\n return _legacyCheckPermissions(_getMediaDeviceKindByName(name));\n};\n/**\n * Asynchronously returns whether we have permissions to access the camera.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkCameraPermissions()\n * // true\n * ```\n */\nexport const checkCameraPermissions = () => checkPermissions('camera');\n/**\n * Asynchronously returns whether we have permissions to access the microphone.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkMicrophonePermissions()\n * // true\n * ```\n */\nexport const checkMicrophonePermissions = () => checkPermissions('microphone');\n/**\n * Asynchronously returns whether we have permissions to access the speakers.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.checkSpeakerPermissions()\n * // true\n * ```\n */\nexport const checkSpeakerPermissions = () => checkPermissions('speaker');\n//# sourceMappingURL=permissions.js.map","import { getLogger, timeoutPromise } from '@signalwire/core';\nimport { getMediaDevicesApi, getSupportedConstraints } from './primitives';\nimport { checkMicrophonePermissions, checkCameraPermissions, } from './permissions';\nconst GUM_TIMEOUT = 5000;\n/**\n * Check if we need to set a timeout on the gUM request.\n * In case the user needs to go through the browser prompt\n * for permissions we can't set a timer but instead just wait for\n * the user and/or the UA to solve the promise.\n * If we have the permissions already, set the timeout because we\n * had some cases where the UA is stuck reading from the device\n * and the gUM request was never resolved.\n *\n * @internal\n * @returns True/False whether the timeout should be used\n */\nconst _useTimeoutForGUM = async (constraints) => {\n const promises = [];\n if (constraints === null || constraints === void 0 ? void 0 : constraints.audio) {\n promises.push(checkMicrophonePermissions());\n }\n if (constraints === null || constraints === void 0 ? void 0 : constraints.video) {\n promises.push(checkCameraPermissions());\n }\n if (promises.length) {\n const results = await Promise.all(promises);\n return results.every(Boolean);\n }\n return false;\n};\n/**\n * Prompts the user to share one or more media devices and asynchronously\n * returns an associated [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object.\n *\n * For more information, see [`MediaDevices.getUserMedia()`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia).\n *\n * @param constraints an optional [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * To only request audio media:\n *\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n *\n * @example\n * To request both audio and video, specifying constraints for the video:\n *\n * ```typescript\n * const constraints = {\n * audio: true,\n * video: {\n * width: { min: 1024, ideal: 1280, max: 1920 },\n * height: { min: 576, ideal: 720, max: 1080 }\n * }\n * }\n * await SignalWire.WebRTC.getUserMedia(constraints)\n * // MediaStream {id: \"EDVk...\", active: true, ...}\n * ```\n */\nexport const getUserMedia = async (constraints = { audio: true, video: true }) => {\n var _a;\n try {\n const promise = getMediaDevicesApi().getUserMedia(constraints);\n const useTimeout = await _useTimeoutForGUM(constraints);\n if (useTimeout) {\n const exception = new Error('Timeout reading from your devices');\n return await timeoutPromise(promise, GUM_TIMEOUT, exception);\n }\n return await promise;\n }\n catch (error) {\n switch (error.name) {\n case 'Error': {\n getLogger().error((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : \"navigator.mediaDevices.getUserMedia doesn't seem to be supported.\");\n break;\n }\n case 'NotFoundError': {\n getLogger().error('No media tracks of the type specified were found that satisfy the given constraints.');\n break;\n }\n case 'NotReadableError': {\n getLogger().error('Hardware error occurred at the operating system, browser, or Web page level which prevented access to the device. This could have been caused by having the Camera or Mic being user by another application.');\n break;\n }\n case 'OverconstrainedError': {\n getLogger().error(`The constraint: ${error.constraint} cannot be met by the selected device.`);\n getLogger().info(`List of available constraints:`, getSupportedConstraints());\n break;\n }\n case 'NotAllowedError': {\n getLogger().error('The user has mostly likely denied access to the device. This could also happen if the browsing context is insecure (using HTTP rather than HTTPS)');\n break;\n }\n case 'TypeError': {\n if (Object.keys(constraints).length === 0) {\n getLogger().error('Constraints can\\'t be empty nor have \"video\" and \"audio\" set to false.');\n }\n else {\n getLogger().error('Please check that you are calling this method from a secure context (using HTTPS rather than HTTP).');\n }\n break;\n }\n case 'SecurityError': {\n getLogger().error('User media support is disabled on the Document on which getUserMedia() was called. The mechanism by which user media support is enabled and disabled is left up to the individual user agent.');\n break;\n }\n }\n throw error;\n }\n};\n//# sourceMappingURL=getUserMedia.js.map","import { getMediaDevicesApi } from './primitives';\n/**\n * Prompts the user to share the screen and asynchronously returns a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream)\n * object associated with a display or part of it.\n *\n * @param constraints an optional\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints)\n * object specifying requirements for the returned [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDisplayMedia()\n * // MediaStream {id: \"HCXy...\", active: true, ...}\n * ```\n */\nexport const getDisplayMedia = (constraints) => {\n return getMediaDevicesApi().getDisplayMedia(constraints);\n};\n//# sourceMappingURL=getDisplayMedia.js.map","import { getLogger, EventEmitter } from '@signalwire/core';\nimport { getUserMedia, enumerateDevices, enumerateDevicesByKind, checkPermissions, checkCameraPermissions, checkMicrophonePermissions, checkSpeakerPermissions, _getMediaDeviceKindByName, stopStream, supportsMediaOutput, getMediaDevicesApi, } from './index';\nconst _constraintsByKind = (kind) => {\n return {\n audio: !kind || kind === 'all' || kind === 'microphone' || kind === 'speaker',\n video: !kind || kind === 'all' || kind === 'camera',\n };\n};\n/**\n * After prompting the user for permission, returns an array of media input and\n * output devices available on this machine. If `kind` is not null, only the\n * devices of the specified kind are returned. Possible values of the `kind`\n * parameters are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`, which\n * respectively correspond to functions\n * {@link getCameraDevicesWithPermissions},\n * {@link getMicrophoneDevicesWithPermissions}, and\n * {@link getSpeakerDevicesWithPermissions}.\n *\n * @param kind filter for this device category\n * @param fullList By default, only devices for which\n * we have been granted permissions are returned. To obtain a list of devices regardless of\n * the permissions, pass `fullList=true`. Note however that some values such as\n * `name` and `deviceId` could be omitted.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevicesWithPermissions(\"camera\")\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getDevices} for better cross browser compatibility.\n */\nexport const getDevicesWithPermissions = async (kind, fullList = false) => getDevices(kind, fullList);\n/**\n * After prompting the user for permission, returns an array of camera devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getCameraDevices} for better cross browser compatibility.\n */\nexport const getCameraDevicesWithPermissions = () => getDevicesWithPermissions('camera');\n/**\n * After prompting the user for permission, returns an array of microphone devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getMicrophoneDevices} for better cross browser compatibility.\n */\nexport const getMicrophoneDevicesWithPermissions = () => getDevicesWithPermissions('microphone');\n/**\n * After prompting the user for permission, returns an array of speaker devices.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevicesWithPermissions()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n * @deprecated Use {@link getSpeakerDevices} for better cross browser compatibility.\n */\nexport const getSpeakerDevicesWithPermissions = () => getDevicesWithPermissions('speaker');\nconst _filterDevices = (devices, options = {}) => {\n const found = [];\n return devices.filter(({ deviceId, kind, groupId }) => {\n var _a;\n if (!deviceId || (options.targets && !((_a = options.targets) === null || _a === void 0 ? void 0 : _a.includes(kind)))) {\n return false;\n }\n if (!groupId) {\n return true;\n }\n const key = `${kind}-${groupId}`;\n const checkDefault = (options === null || options === void 0 ? void 0 : options.excludeDefault) ? deviceId !== 'default' : true;\n if (!found.includes(key) && checkDefault) {\n found.push(key);\n return true;\n }\n return false;\n });\n};\n/**\n * Enumerates the media input and output devices available on this machine. If\n * `name` is provided, only the devices of the specified kind are returned.\n * Possible values of the `name` parameters are `\"camera\"`, `\"microphone\"`, and\n * `\"speaker\"`, which respectively correspond to functions\n * {@link getCameraDevices}, {@link getMicrophoneDevices}, and\n * {@link getSpeakerDevices}.\n *\n * @param name filter for this device category\n * @param fullList Default to false. Set to true to retrieve the raw list as returned by\n * the browser, which might include multiple, duplicate deviceIds for the same group.\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getDevices(\"camera\", true)\n * // [\n * // {\n * // \"deviceId\": \"3c4f97...\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD Camera\",\n * // \"groupId\": \"828fec...\"\n * // }\n * // ]\n * ```\n */\nexport const getDevices = async (name, fullList = false) => {\n const hasPerms = await checkPermissions(name);\n let stream = undefined;\n if (hasPerms === false) {\n const constraints = _constraintsByKind(name);\n stream = await getUserMedia(constraints);\n }\n const devices = await enumerateDevicesByKind(_getMediaDeviceKindByName(name));\n /**\n * Firefox requires an active stream at the time of `enumerateDevices`\n * so we need to stop it after `WebRTC.enumerateDevicesByKind`\n */\n if (stream) {\n stopStream(stream);\n }\n if (fullList === true) {\n return devices;\n }\n return _filterDevices(devices);\n};\n/**\n * Returns an array of camera devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getCameraDevices()\n * // [\n * // {\n * // \"deviceId\": \"Rug5Bk...4TMhY=\",\n * // \"kind\": \"videoinput\",\n * // \"label\": \"HD FaceTime Camera\",\n * // \"groupId\": \"Su/dzw...ccfnY=\"\n * // }\n * // ]\n * ```\n */\nexport const getCameraDevices = () => getDevices('camera');\n/**\n * Returns an array of microphone devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getMicrophoneDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audioinput\",\n * // \"label\": \"Internal Microphone\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getMicrophoneDevices = () => getDevices('microphone');\n/**\n * Returns an array of speaker devices that can be accessed on this device (for which we have permissions).\n *\n * @example\n * ```typescript\n * await SignalWire.WebRTC.getSpeakerDevices()\n * // [\n * // {\n * // \"deviceId\": \"ADciLf...NYgF8=\",\n * // \"kind\": \"audiooutput\",\n * // \"label\": \"External Speaker\",\n * // \"groupId\": \"rgZgKM...NW1hU=\"\n * // }\n * // ]\n * ```\n */\nexport const getSpeakerDevices = () => getDevices('speaker');\n/**\n * Assure a deviceId exists in the current device list from the browser.\n * It checks for deviceId or label - in case the UA changed the deviceId randomly\n */\nexport const assureDeviceId = async (id, label, name) => {\n const devices = await getDevices(name, true);\n for (let i = 0; i < devices.length; i++) {\n const { deviceId, label: deviceLabel } = devices[i];\n if (id === deviceId || label === deviceLabel) {\n return deviceId;\n }\n }\n return null;\n};\n/**\n * Helper methods to assure a deviceId without asking the user the \"kind\"\n */\nexport const assureVideoDevice = (id, label) => assureDeviceId(id, label, 'camera');\nexport const assureAudioInDevice = (id, label) => assureDeviceId(id, label, 'microphone');\nexport const assureAudioOutDevice = (id, label) => assureDeviceId(id, label, 'speaker');\nconst _deviceInfoToMap = (devices) => {\n const map = new Map();\n devices.forEach((deviceInfo) => {\n if (deviceInfo.deviceId) {\n map.set(deviceInfo.deviceId, deviceInfo);\n }\n });\n return map;\n};\nconst _getDeviceListDiff = (oldDevices, newDevices) => {\n const current = _deviceInfoToMap(oldDevices);\n const removals = _deviceInfoToMap(oldDevices);\n const updates = [];\n getLogger().debug('[_getDeviceListDiff] <- oldDevices', oldDevices);\n getLogger().debug('[_getDeviceListDiff] -> newDevices', newDevices);\n const additions = newDevices.filter((newDevice) => {\n const id = newDevice.deviceId;\n const oldDevice = current.get(id);\n if (oldDevice) {\n removals.delete(id);\n if (newDevice.label !== oldDevice.label) {\n updates.push(newDevice);\n }\n }\n return oldDevice === undefined;\n });\n return {\n updated: updates.map((value) => {\n return {\n type: 'updated',\n payload: value,\n };\n }),\n // Removed devices\n removed: Array.from(removals, ([_, value]) => value).map((value) => {\n return {\n type: 'removed',\n payload: value,\n };\n }),\n added: additions.map((value) => {\n return {\n type: 'added',\n payload: value,\n };\n }),\n };\n};\nconst TARGET_PERMISSIONS_MAP = {\n // FIXME: Replace this object with just checkPermissions(<target>)\n camera: checkCameraPermissions,\n microphone: checkMicrophonePermissions,\n speaker: checkSpeakerPermissions,\n};\nconst DEFAULT_TARGETS = [\n 'camera',\n 'microphone',\n 'speaker',\n];\nconst ALLOWED_TARGETS_MSG = `Allowed targets are: '${DEFAULT_TARGETS.join(\"', '\")}'`;\nconst CHECK_SUPPORT_MAP = {\n speaker: supportsMediaOutput,\n};\nconst checkTargetPermissions = async (options) => {\n const targets = options.targets;\n const permissions = await Promise.all(targets.map((target) => TARGET_PERMISSIONS_MAP[target]()));\n return permissions.reduce((reducer, permission, index) => {\n var _a;\n const target = targets[index];\n /**\n * If we don't specify a check for the target we'll assume\n * there's no need to check for support\n */\n const platformSupportStatus = target in CHECK_SUPPORT_MAP ? (_a = CHECK_SUPPORT_MAP[target]) === null || _a === void 0 ? void 0 : _a.call(CHECK_SUPPORT_MAP) : true;\n const supportStatus = platformSupportStatus\n ? 'supported'\n : 'unsupported';\n reducer[supportStatus].push([target, !!permission]);\n return reducer;\n }, { supported: [], unsupported: [] });\n};\nconst validateTargets = async (options) => {\n var _a;\n const targets = ((_a = options.targets) !== null && _a !== void 0 ? _a : DEFAULT_TARGETS).filter((target) => {\n if (!DEFAULT_TARGETS.includes(target)) {\n getLogger().warn(`We'll ignore the \"${target}\" target as it is not allowed. ${ALLOWED_TARGETS_MSG}.`);\n return false;\n }\n return true;\n });\n if (!targets.length) {\n throw new Error(`At least one \"target\" is required for createDeviceWatcher(). ${ALLOWED_TARGETS_MSG}.`);\n }\n const permissions = await checkTargetPermissions({ targets });\n if (permissions.unsupported.length > 0 &&\n targets.length === permissions.unsupported.length) {\n throw new Error(`The platform doesn't support \"${targets.join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices.`);\n }\n else if (permissions.supported.every(([_, status]) => !status)) {\n throw new Error('You must ask the user for permissions before being able to listen for device changes. Try calling getUserMedia() before calling `createDeviceWatcher()`.');\n }\n let needPermissionsTarget = [];\n const filteredTargets = permissions.supported.reduce((reducer, [target, status]) => {\n if (!status) {\n needPermissionsTarget.push(target);\n }\n else {\n reducer.push(target);\n }\n return reducer;\n }, []);\n /**\n * If the length of these two arrays is different it means whether\n * we have unsupported devices or that the user hasn't granted the\n * permissions for certain targets\n */\n if (filteredTargets.length !== targets.length) {\n const unsupportedTargets = permissions.unsupported.length > 0\n ? `The platform doesn't support \"${permissions.unsupported\n .map(([t]) => t)\n .join(', ')}\" as target/s, which means it's not possible to watch for changes on those devices. `\n : '';\n const needPermissions = needPermissionsTarget.length > 0\n ? `The user hasn't granted permissions for the following targets: ${needPermissionsTarget.join(', ')}. `\n : '';\n getLogger().warn(`${unsupportedTargets}${needPermissions}We'll be watching for the following targets instead: \"${filteredTargets.join(', ')}\"`);\n }\n getLogger().debug(`Watching these targets: \"${filteredTargets.join(', ')}\"`);\n return filteredTargets;\n};\n// FIXME: Move createDeviceWatcher and all related helpers/derived methods to its own module\n/**\n * Asynchronously returns an event emitter that notifies changes in the devices.\n * The possible events are:\n *\n * - \"added\": a device has been added\n * - \"removed\": a device has been removed\n * - \"updated\": a device has been updated\n * - \"changed\": any of the previous events occurred\n *\n * In all cases, your event handler gets as parameter an object `e` with the\n * following keys:\n *\n * - `e.changes`: the changed devices. For \"added\", \"removed\", and \"updated\"\n * event handlers, you only get the object associated to the respective event\n * (i.e., only a list of added devices, removed devices, or updated devices).\n * For \"changed\" event handlers, you get all three lists.\n * - `e.devices`: the new list of devices\n *\n * For device-specific helpers, see {@link createCameraDeviceWatcher},\n * {@link createMicrophoneDeviceWatcher}, and {@link createSpeakerDeviceWatcher}.\n *\n * @param options if null, the event emitter is associated to all devices for\n * which we have permission. Otherwise, you can pass an object\n * `{targets: string}`, where the value for key targets is a list of categories.\n * Allowed categories are `\"camera\"`, `\"microphone\"`, and `\"speaker\"`.\n *\n * @example\n * Creating an event listener on the \"changed\" event and printing the received parameter after both connecting and disconnecting external headphones:\n * ```typescript\n * await SignalWire.WebRTC.getUserMedia({audio: true, video: false})\n * h = await SignalWire.WebRTC.createDeviceWatcher()\n * h.on('changed', (c) => console.log(c))\n * ```\n *\n * @example\n * Getting notified just for changes about audio input and output devices, ignoring the camera:\n * ```typescript\n * h = await SignalWire.WebRTC.createDeviceWatcher({targets: ['microphone', 'speaker']})\n * h.on('changed', (c) => console.log(c))\n * ```\n */\nexport const createDeviceWatcher = async (options = {}) => {\n const targets = await validateTargets({ targets: options.targets });\n const emitter = new EventEmitter();\n const currentDevices = await enumerateDevices();\n const kinds = targets === null || targets === void 0 ? void 0 : targets.reduce((reducer, name) => {\n const kind = _getMediaDeviceKindByName(name);\n if (kind) {\n reducer.push(kind);\n }\n return reducer;\n }, []);\n let knownDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n const deviceChangeHandler = async () => {\n const currentDevices = await enumerateDevices();\n const oldDevices = knownDevices;\n const newDevices = _filterDevices(currentDevices, {\n excludeDefault: true,\n targets: kinds,\n });\n knownDevices = newDevices;\n const changes = _getDeviceListDiff(oldDevices, newDevices);\n const hasAddedDevices = changes.added.length > 0;\n const hasRemovedDevices = changes.removed.length > 0;\n const hasUpdatedDevices = changes.updated.length > 0;\n if (hasAddedDevices || hasRemovedDevices || hasUpdatedDevices) {\n emitter.emit('changed', { changes: changes, devices: newDevices });\n }\n if (hasAddedDevices) {\n emitter.emit('added', {\n changes: changes.added,\n devices: newDevices,\n });\n }\n if (hasRemovedDevices) {\n emitter.emit('removed', {\n changes: changes.removed,\n devices: newDevices,\n });\n }\n if (hasUpdatedDevices) {\n emitter.emit('updated', {\n changes: changes.updated,\n devices: newDevices,\n });\n }\n };\n getMediaDevicesApi().addEventListener('devicechange', deviceChangeHandler);\n return emitter;\n};\n/**\n * Asynchronously returns an event emitter that notifies changes in all\n * microphone devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['microphone'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createMicrophoneDeviceWatcher = () => createDeviceWatcher({ targets: ['microphone'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all speaker\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['speaker'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createSpeakerDeviceWatcher = () => createDeviceWatcher({ targets: ['speaker'] });\n/**\n * Asynchronously returns an event emitter that notifies changes in all camera\n * devices. This is equivalent to calling\n * `createDeviceWatcher({ targets: ['camera'] })`, so refer to\n * {@link createDeviceWatcher} for additional information about the returned\n * event emitter.\n */\nexport const createCameraDeviceWatcher = () => createDeviceWatcher({ targets: ['camera'] });\nconst isMediaStream = (options) => {\n return typeof (options === null || options === void 0 ? void 0 : options.getTracks) === 'function';\n};\n// FIXME: Move getMicrophoneAnalyzerMediaStream and all related helpers/derived methods to its own module\nconst getMicrophoneAnalyzerMediaStream = async (options) => {\n if (isMediaStream(options)) {\n return options;\n }\n let constraints;\n if (typeof options === 'string') {\n constraints = {\n audio: {\n deviceId: options,\n },\n };\n }\n else {\n constraints = {\n audio: options,\n };\n }\n return getUserMedia(constraints);\n};\nconst createAnalyzer = (audioContext) => {\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 64;\n analyser.minDecibels = -90;\n analyser.maxDecibels = -10;\n analyser.smoothingTimeConstant = 0.85;\n return analyser;\n};\nconst MAX_VOLUME = 100;\n/**\n * Initializes a microphone analyzer. You can use a MicrophoneAnalyzer to track\n * the input audio volume.\n *\n * To stop the analyzer, plase call the `destroy()` method on the object\n * returned by this method.\n *\n * The returned object emits the following events:\n *\n * - `volumeChanged`: instantaneous volume from 0 to 100\n * - `destroyed`: the object has been destroyed. You get a parameter\n * describing the reason, which can be `null` (if you called `destroy()`),\n * `\"error\"` (in case of errors), or `\"disconnected\"` (if the device was\n * disconnected).\n *\n * @example\n *\n * ```js\n * const micAnalyzer = await createMicrophoneAnalyzer('device-id')\n *\n * micAnalyzer.on('volumeChanged', (vol) => {\n * console.log(\"Volume: \", vol)\n * })\n * micAnalyzer.on('destroyed', (reason) => {\n * console.log('Microphone analyzer destroyed', reason)\n * })\n *\n * micAnalyzer.destroy()\n * ```\n *\n * @param options either the id of the device to analize, or\n * [MediaStreamConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints),\n * or a\n * [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream).\n *\n * @returns Asynchronously returns a MicrophoneAnalyzer.\n */\nexport const createMicrophoneAnalyzer = async (options) => {\n const stream = await getMicrophoneAnalyzerMediaStream(options);\n if (!stream) {\n throw new Error('Failed to get the audio stream');\n }\n const emitter = new EventEmitter();\n const audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n const analyser = createAnalyzer(audioContext);\n let rafId;\n let volume;\n try {\n audioContext.createMediaStreamSource(stream).connect(analyser);\n }\n catch (error) {\n throw new Error('No audio track found');\n }\n /**\n * If the device gets disconnected, we'll notify the user of\n * the change.\n */\n stream.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', () => {\n emitter.emit('destroyed', 'disconnected');\n });\n });\n const startMetering = () => {\n try {\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(dataArray);\n /**\n * dataArray contains the values of the volume\n * gathered within a single requestAnimationFrame With\n * reduce and divide by 20 we translate the array\n * values into a 0-100 scale to draw the green bars\n * for the voice/volume energy.\n */\n const latestVol = dataArray.reduce((final, value) => final + value, 0) / 20;\n if (volume !== latestVol) {\n volume = latestVol;\n emitter.emit('volumeChanged', Math.min(volume, MAX_VOLUME));\n }\n rafId = requestAnimationFrame(startMetering);\n }\n catch (e) {\n emitter.emit('destroyed', 'error');\n }\n };\n rafId = requestAnimationFrame(startMetering);\n const destroy = () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n }\n if (audioContext.state !== 'closed') {\n audioContext.close().catch((error) => {\n getLogger().error('Error closing the AudioContext', error);\n });\n }\n /**\n * If the user provided a MediaStream, we don't need to\n * close it.\n */\n if (!isMediaStream(options)) {\n stream.getTracks().forEach((track) => track.stop());\n }\n emitter.emit('destroyed', null);\n emitter.removeAllListeners();\n };\n return new Proxy(\n // @ts-expect-error\n emitter, {\n get(target, prop, receiver) {\n if (prop === 'destroy') {\n return destroy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n};\n/**\n * Returns the speaker based on the given id.\n * @param id string\n * @returns MediaDevices | undefined\n */\nexport const getSpeakerById = async (id) => {\n const speakers = await getSpeakerDevices();\n return speakers.find((audio) => audio.deviceId === id ||\n (audio.deviceId === 'default' && id === '') ||\n (audio.deviceId === '' && id === 'default'));\n};\n//# sourceMappingURL=deviceHelpers.js.map","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","import { getLogger } from '@signalwire/core';\nimport SDPUtils from 'sdp';\nconst _isAudioLine = (line) => /^m=audio/.test(line);\nconst _isVideoLine = (line) => /^m=video/.test(line);\nconst _getCodecPayloadType = (line) => {\n const pattern = new RegExp('a=rtpmap:(\\\\d+) \\\\w+\\\\/\\\\d+');\n const result = line.match(pattern);\n return result && result.length == 2 ? result[1] : null;\n};\nconst _normalizeSDPLines = (sdp) => {\n // Make the line break consistent\n return sdp.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n};\n/**\n * Check if SDP has a media section (audio or video)\n */\nexport const sdpHasMediaSection = (sdp, media) => {\n const lines = _normalizeSDPLines(sdp).split('\\n');\n for (let line of lines) {\n if (line.startsWith(`m=${media}`)) {\n return true;\n }\n }\n return false;\n};\n/**\n * Check if SDP includes video\n */\nexport const sdpHasVideo = (sdp) => {\n return sdpHasMediaSection(sdp, 'video');\n};\n/**\n * Check if SDP includes audio\n */\nexport const sdpHasAudio = (sdp) => {\n return sdpHasMediaSection(sdp, 'audio');\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 (offerVideoIndex == -1 ||\n offerAudioIndex == -1 ||\n offerAudioIndex < offerVideoIndex) {\n return answer;\n }\n const answerLines = answer.split(endOfLine);\n const answerAudioIndex = answerLines.findIndex(_isAudioLine);\n const answerVideoIndex = answerLines.findIndex(_isVideoLine);\n const audioLines = answerLines.slice(answerAudioIndex, answerVideoIndex);\n const videoLines = answerLines.slice(answerVideoIndex, answerLines.length - 1);\n const beginLines = answerLines.slice(0, answerAudioIndex);\n return [...beginLines, ...videoLines, ...audioLines, ''].join(endOfLine);\n};\n/**\n * Modify the SDP to increase video bitrate\n * @return the SDP modified\n */\nexport const sdpBitrateHack = (sdp, max, min, start) => {\n const endOfLine = '\\r\\n';\n const lines = sdp.split(endOfLine);\n lines.forEach((line, i) => {\n if (/^a=fmtp:\\d*/.test(line)) {\n lines[i] += `;x-google-max-bitrate=${max};x-google-min-bitrate=${min};x-google-start-bitrate=${start}`;\n }\n else if (/^a=mid:(1|video)/.test(line)) {\n lines[i] += `\\r\\nb=AS:${max}`;\n }\n });\n return lines.join(endOfLine);\n};\n// const sdpAudioRemoveRTPExtensions = (sdp: string, extensionsToFilter: string[]): string => {\n// const endOfLine = '\\r\\n'\n// let beginLines: string[] = []\n// let audioLines: string[] = []\n// let videoLines: string[] = []\n// const newLines = sdp.split(endOfLine)\n// const offerAudioIndex = newLines.findIndex(_isAudioLine)\n// const offerVideoIndex = newLines.findIndex(_isVideoLine)\n// if (offerAudioIndex < offerVideoIndex) {\n// beginLines = newLines.slice(0, offerAudioIndex)\n// audioLines = newLines.slice(offerAudioIndex, offerVideoIndex)\n// videoLines = newLines.slice(offerVideoIndex, (newLines.length - 1))\n// } else {\n// beginLines = newLines.slice(0, offerVideoIndex)\n// audioLines = newLines.slice(offerAudioIndex, (newLines.length - 1))\n// videoLines = newLines.slice(offerVideoIndex, offerAudioIndex)\n// }\n// const newAudioLines = audioLines.filter((line: string) => {\n// return !(line.includes(extensionsToFilter[0]) || line.includes(extensionsToFilter[1]) || line.includes(extensionsToFilter[2]))\n// })\n// return [...beginLines, ...newAudioLines, ...videoLines, ''].join(endOfLine)\n// }\n// const sdpAudioRemoveRidMidExtHack = (sdp: string): string => {\n// const extensionsToFilter = [\n// 'urn:ietf:params:rtp-hdrext:sdes:mid',\n// 'urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id',\n// 'urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id',\n// ]\n// return sdpAudioRemoveRTPExtensions(sdp, extensionsToFilter)\n// }\n/**\n * Check for srflx, prflx or relay candidates\n * TODO: improve the logic check private/public IP for typ host\n *\n * @param sdp string\n * @returns boolean\n */\nexport const sdpHasValidCandidates = (sdp) => {\n try {\n const regex = /typ (?:srflx|prflx|relay)/;\n const sections = SDPUtils.getMediaSections(sdp);\n for (const section of sections) {\n const lines = SDPUtils.splitLines(section);\n const valid = lines.some((line) => {\n return line.indexOf('a=candidate') === 0 && regex.test(line);\n });\n if (!valid) {\n return false;\n }\n }\n return true;\n }\n catch (error) {\n getLogger().error('Error checking SDP', error);\n return false;\n }\n};\n/**\n * Remove \"a=candidate\" lines with local candidates\n * https://bloggeek.me/psa-mdns-and-local-ice-candidates-are-coming/\n */\nexport const sdpRemoveLocalCandidates = (sdp) => {\n const pattern = /^a=candidate.*.local\\ .*/;\n const endOfLine = '\\r\\n';\n return sdp\n .split(endOfLine)\n .filter((line) => !pattern.test(line))\n .join(endOfLine);\n};\n/**\n * Get the SDP direction for the specified media type.\n * Returns 'sendrecv' if no direction attribute is found, as per SDP standards.\n */\nexport const getSdpDirection = (sdp, media) => {\n const lines = _normalizeSDPLines(sdp).split('\\n');\n let inMediaSection = false;\n const directions = ['inactive', 'recvonly', 'sendonly', 'sendrecv', 'stopped'];\n for (let line of lines) {\n if (line.startsWith('m=')) {\n // Check if this is the media section we're interested in\n inMediaSection = line.startsWith(`m=${media}`);\n }\n else if (inMediaSection && line.startsWith('a=')) {\n // Check for direction attribute within this media section\n const attr = line.substring(2);\n if (directions.includes(attr)) {\n // Return the found direction attribute\n return attr;\n }\n }\n }\n // If no media section is found, return `stopped`\n if (!inMediaSection) {\n return 'stopped';\n }\n // If no direction attribute is found, return 'sendrecv' as per SDP standard\n return 'sendrecv';\n};\n/**\n * Returns the opposite SDP direction based on the provided direction.\n */\nexport const getOppositeSdpDirection = (direction) => {\n switch (direction) {\n case 'sendrecv':\n return 'sendrecv';\n case 'sendonly':\n return 'recvonly';\n case 'recvonly':\n return 'sendonly';\n case 'inactive':\n return 'inactive';\n default:\n return 'inactive';\n }\n};\n/**\n * Returns boolean indicating remote and local SDPs has the expected opposite direction\n */\nexport const hasMatchingSdpDirection = ({ localSdp, remoteSdp, media, }) => {\n const localDirection = getSdpDirection(localSdp, media);\n const expectedRemoteDirection = getOppositeSdpDirection(localDirection);\n const remoteDirection = getSdpDirection(remoteSdp, media);\n return remoteDirection === expectedRemoteDirection;\n};\n//# sourceMappingURL=sdpHelpers.js.map","import { getLogger } from '@signalwire/core';\nimport { getUserMedia as _getUserMedia } from './getUserMedia';\nimport { assureDeviceId } from './deviceHelpers';\nimport { sdpHasAudio, sdpHasVideo } from './sdpHelpers';\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};\nconst _shouldNegotiateVideo = (options) => {\n var _a;\n return (((_a = options.negotiateVideo) !== null && _a !== void 0 ? _a : true) &&\n (!options.remoteSdp || sdpHasVideo(options.remoteSdp)));\n};\nconst _shouldNegotiateAudio = (options) => {\n var _a;\n return (((_a = options.negotiateAudio) !== null && _a !== void 0 ? _a : true) &&\n (!options.remoteSdp || sdpHasAudio(options.remoteSdp)));\n};\nconst _getVideoConstraints = (options) => {\n var _a;\n return _shouldNegotiateVideo(options)\n ? (_a = options.video) !== null && _a !== void 0 ? _a : !!options.camId\n : false;\n};\nconst _getAudioConstraints = (options) => {\n var _a;\n return _shouldNegotiateAudio(options) ? (_a = options.audio) !== null && _a !== void 0 ? _a : true : false;\n};\nexport const getMediaConstraints = async (options) => {\n let audio = _getAudioConstraints(options);\n const { micLabel = '', micId } = options;\n if (micId && audio) {\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 = _getVideoConstraints(options);\n const { camLabel = '', camId } = options;\n if (camId && video) {\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};\nexport const filterIceServers = (servers, options) => {\n const { disableUdpIceServers = false } = options;\n const filterOutUdpUrls = (urls) => {\n const transportParam = 'transport=udp';\n if (Array.isArray(urls)) {\n return urls.filter((url) => !url.includes(transportParam));\n }\n return urls.includes(transportParam) ? '' : urls;\n };\n return servers.map((server) => (Object.assign(Object.assign({}, server), { urls: disableUdpIceServers ? filterOutUdpUrls(server.urls) : server.urls })));\n};\n//# sourceMappingURL=helpers.js.map","import { getLogger, uuid } from '@signalwire/core';\nimport { getUserMedia, getMediaConstraints, filterIceServers, } from './utils/helpers';\nimport { sdpStereoHack, sdpBitrateHack, sdpMediaOrderHack, sdpHasValidCandidates, } from './utils/sdpHelpers';\nimport { sdpToJsonHack, RTCPeerConnection, streamIsValid, stopTrack, } from './utils';\nimport { watchRTCPeerMediaPackets } from './utils/watchRTCPeerMediaPackets';\nconst RESUME_TIMEOUT = 12000;\nexport default class RTCPeer {\n get logger() {\n return getLogger();\n }\n constructor(call, type) {\n this.call = call;\n this.type = type;\n this.uuid = uuid();\n this._negotiating = false;\n this._processingRemoteSDP = false;\n this._restartingIce = false;\n this.logger.debug('New Peer with type:', this.type, 'Options:', this.options);\n this._onIce = this._onIce.bind(this);\n this._onEndedTrackHandler = this._onEndedTrackHandler.bind(this);\n if (this.options.prevCallId) {\n this.uuid = this.options.prevCallId;\n }\n this.options.prevCallId = undefined;\n if (this.options.localStream && streamIsValid(this.options.localStream)) {\n this._localStream = this.options.localStream;\n }\n this.rtcConfigPolyfill = this.config;\n }\n get options() {\n return this.call.options;\n }\n get watchMediaPacketsTimeout() {\n var _a;\n return (_a = this.options.watchMediaPacketsTimeout) !== null && _a !== void 0 ? _a : 2000;\n }\n get isNegotiating() {\n return this._negotiating;\n }\n get localStream() {\n return this._localStream;\n }\n set localStream(stream) {\n this._localStream = stream;\n }\n get remoteStream() {\n return this._remoteStream;\n }\n get isOffer() {\n return this.type === 'offer';\n }\n get isAnswer() {\n return this.type === 'answer';\n }\n get isSimulcast() {\n return this.options.simulcast === true;\n }\n get isSfu() {\n return this.options.sfu === true;\n }\n get localVideoTrack() {\n const videoSender = this._getSenderByKind('video');\n return (videoSender === null || videoSender === void 0 ? void 0 : videoSender.track) || null;\n }\n get localAudioTrack() {\n const audioSender = this._getSenderByKind('audio');\n return (audioSender === null || audioSender === void 0 ? void 0 : audioSender.track) || null;\n }\n get remoteVideoTrack() {\n const videoReceiver = this._getReceiverByKind('video');\n return (videoReceiver === null || videoReceiver === void 0 ? void 0 : videoReceiver.track) || null;\n }\n get remoteAudioTrack() {\n const audioReceiver = this._getReceiverByKind('audio');\n return (audioReceiver === null || audioReceiver === void 0 ? void 0 : audioReceiver.track) || null;\n }\n get hasAudioSender() {\n return this._getSenderByKind('audio') ? true : false;\n }\n get hasVideoSender() {\n return this._getSenderByKind('video') ? true : false;\n }\n get hasAudioReceiver() {\n return this._getReceiverByKind('audio') ? true : false;\n }\n get hasVideoReceiver() {\n return this._getReceiverByKind('video') ? true : false;\n }\n get config() {\n const { rtcPeerConfig = {} } = this.options;\n const config = Object.assign({ bundlePolicy: 'max-compat', iceServers: filterIceServers(this.call.iceServers, {\n disableUdpIceServers: this.options.disableUdpIceServers,\n }), \n // @ts-ignore\n sdpSemantics: 'unified-plan' }, rtcPeerConfig);\n this.logger.debug('RTC config', config);\n return config;\n }\n get localSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.localDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get remoteSdp() {\n var _a, _b;\n return (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.remoteDescription) === null || _b === void 0 ? void 0 : _b.sdp;\n }\n get hasIceServers() {\n if (this.instance) {\n const { iceServers = [] } = this.getConfiguration();\n return Boolean(iceServers === null || iceServers === void 0 ? void 0 : iceServers.length);\n }\n return false;\n }\n stopTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to stop.`);\n }\n if (sender.track) {\n stopTrack(sender.track);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(sender.track);\n }\n }\n catch (error) {\n this.logger.error('RTCPeer stopTrackSender error', kind, error);\n }\n }\n stopTrackReceiver(kind) {\n var _a;\n try {\n const receiver = this._getReceiverByKind(kind);\n if (!receiver) {\n return this.logger.info(`There is not a '${kind}' receiver to stop.`);\n }\n if (receiver.track) {\n stopTrack(receiver.track);\n (_a = this._remoteStream) === null || _a === void 0 ? void 0 : _a.removeTrack(receiver.track);\n }\n }\n catch (error) {\n this.logger.error('RTCPeer stopTrackReceiver error', kind, error);\n }\n }\n async restoreTrackSender(kind) {\n var _a;\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender) {\n return this.logger.info(`There is not a '${kind}' sender to restore.`);\n }\n if (sender.track && sender.track.readyState !== 'ended') {\n return this.logger.info(`There is already an active ${kind} track.`);\n }\n const constraints = await getMediaConstraints(this.options);\n // @ts-ignore\n const stream = await getUserMedia({ [kind]: constraints[kind] });\n if (stream && streamIsValid(stream)) {\n const newTrack = stream.getTracks().find((t) => t.kind === kind);\n if (newTrack) {\n await sender.replaceTrack(newTrack);\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.addTrack(newTrack);\n }\n }\n }\n catch (error) {\n this.logger.error('RTCPeer restoreTrackSender error', kind, error);\n }\n }\n getDeviceId(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n const { deviceId = null } = sender.track.getSettings();\n return deviceId;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceId error', kind, error);\n return null;\n }\n }\n getTrackSettings(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.getSettings();\n }\n catch (error) {\n this.logger.error('RTCPeer getTrackSettings error', kind, error);\n return null;\n }\n }\n getDeviceLabel(kind) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return null;\n }\n return sender.track.label;\n }\n catch (error) {\n this.logger.error('RTCPeer getDeviceLabel error', kind, error);\n return null;\n }\n }\n restartIceWithRelayOnly() {\n try {\n if (this.isAnswer) {\n return this.logger.warn('Skip restartIceWithRelayOnly since we need to generate answer');\n }\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n return this.logger.warn('RTCPeer already with iceTransportPolicy relay only');\n }\n const newConfig = Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' });\n this.setConfiguration(newConfig);\n this.restartIce();\n }\n catch (error) {\n this.logger.error('restartIceWithRelayOnly', error);\n }\n }\n restartIce() {\n if (this._negotiating || this._restartingIce) {\n return this.logger.warn('Skip restartIce');\n }\n this._restartingIce = true;\n this.logger.debug('Restart ICE');\n // Type must be Offer to send reinvite.\n this.type = 'offer';\n this.instance.restartIce();\n }\n triggerResume() {\n this.logger.info('Probably half-open so force close from client');\n if (this._resumeTimer) {\n this.logger.info('[skipped] Already in \"resume\" state');\n return;\n }\n this.call.emit('media.disconnected');\n this.call.emit('media.reconnecting');\n this.clearTimers();\n this._resumeTimer = setTimeout(() => {\n this.logger.warn('Disconnecting due to RECONNECTION_ATTEMPT_TIMEOUT');\n this.call.emit('media.disconnected');\n this.call.leaveReason = 'RECONNECTION_ATTEMPT_TIMEOUT';\n this.call.setState('hangup');\n }, RESUME_TIMEOUT); // TODO: read from call verto.invite response\n this.call._closeWSConnection();\n }\n resetNeedResume() {\n this.clearResumeTimer();\n if (this.options.watchMediaPackets) {\n this.startWatchMediaPackets();\n }\n }\n stopWatchMediaPackets() {\n if (this._mediaWatcher) {\n this._mediaWatcher.stop();\n }\n }\n startWatchMediaPackets() {\n var _a;\n this.stopWatchMediaPackets();\n this._mediaWatcher = watchRTCPeerMediaPackets(this);\n (_a = this._mediaWatcher) === null || _a === void 0 ? void 0 : _a.start();\n }\n async applyMediaConstraints(kind, constraints) {\n try {\n const sender = this._getSenderByKind(kind);\n if (!sender || !sender.track) {\n return this.logger.info('No sender to apply constraints', kind, constraints);\n }\n if (sender.track.readyState === 'live') {\n const newConstraints = Object.assign(Object.assign({}, sender.track.getConstraints()), constraints);\n const deviceId = this.getDeviceId(kind);\n if (deviceId && !this.options.screenShare) {\n newConstraints.deviceId = { exact: deviceId };\n }\n this.logger.info(`Apply ${kind} constraints`, this.call.id, newConstraints);\n await sender.track.applyConstraints(newConstraints);\n }\n }\n catch (error) {\n this.logger.error('Error applying constraints', kind, constraints);\n }\n }\n _getSenderByKind(kind) {\n var _a;\n if (!((_a = this.instance) === null || _a === void 0 ? void 0 : _a.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 var _a;\n if (!((_a = this.instance) === null || _a === void 0 ? void 0 : _a.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, _c;\n if (this._negotiating) {\n return this.logger.warn('Skip twice onnegotiationneeded!');\n }\n this._negotiating = true;\n try {\n /**\n * additionalDevice and screenShare are `sendonly`\n */\n if (this.options.additionalDevice || this.options.screenShare) {\n (_b = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === null || _b === void 0 ? void 0 : _b.call(_a).forEach((tr) => {\n tr.direction = 'sendonly';\n });\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n this.instance.addEventListener('icecandidate', this._onIce);\n if (this.isOffer) {\n this.logger.debug('Trying to generate offer');\n const offerOptions = {\n /**\n * While this property is deprected, on Browsers where this\n * is still supported this avoids conflicting with the VAD\n * server-side\n */\n // @ts-ignore\n voiceActivityDetection: false,\n };\n if (!this._supportsAddTransceiver()) {\n offerOptions.offerToReceiveAudio = this.options.negotiateAudio;\n offerOptions.offerToReceiveVideo = this.options.negotiateVideo;\n }\n const offer = await this.instance.createOffer(offerOptions);\n await this._setLocalDescription(offer);\n }\n if (this.isAnswer) {\n this.logger.debug('Trying to generate answer');\n await this._setRemoteDescription({\n sdp: this.options.remoteSdp,\n type: 'offer',\n });\n const answer = await this.instance.createAnswer({\n // Same as above.\n // @ts-ignore\n voiceActivityDetection: false,\n });\n await this._setLocalDescription(answer);\n }\n /**\n * ReactNative Workaround\n */\n if (force) {\n this._sdpReady();\n }\n this.logger.info('iceGatheringState', this.instance.iceGatheringState);\n if (this.instance.iceGatheringState === 'gathering') {\n this._iceTimeout = setTimeout(() => {\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n }\n catch (error) {\n this.logger.error(`Error creating ${this.type}:`, error);\n (_c = this._pendingNegotiationPromise) === null || _c === void 0 ? void 0 : _c.reject(error);\n }\n }\n onRemoteBye({ code, message }) {\n var _a, _b;\n // It could be a negotiation/signaling error so reject the \"startMethod\"\n const error = { code, message };\n (_a = this._rejectStartMethod) === null || _a === void 0 ? void 0 : _a.call(this, error);\n (_b = this._pendingNegotiationPromise) === null || _b === void 0 ? void 0 : _b.reject(error);\n this.stop();\n }\n async onRemoteSdp(sdp) {\n var _a, _b;\n if (this._processingRemoteSDP ||\n (this.remoteSdp && this.remoteSdp === sdp)) {\n this.logger.warn('Ignore same remote SDP', sdp);\n return;\n }\n try {\n this._processingRemoteSDP = true;\n const type = this.isOffer ? 'answer' : 'offer';\n await this._setRemoteDescription({ sdp, type });\n this._processingRemoteSDP = false;\n /**\n * Resolve the start() method only for Offer because for Answer\n * we need to reply to the server and wait for the signaling.\n */\n if (this.isOffer) {\n this._resolveStartMethod();\n (_a = this._pendingNegotiationPromise) === null || _a === void 0 ? void 0 : _a.resolve();\n }\n this.resetNeedResume();\n }\n catch (error) {\n this.logger.error(`Error handling remote SDP on call ${this.call.id}:`, error);\n this.call.hangup();\n this._rejectStartMethod(error);\n (_b = this._pendingNegotiationPromise) === null || _b === void 0 ? void 0 : _b.reject(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 var _a;\n this._resolveStartMethod = resolve;\n this._rejectStartMethod = reject;\n try {\n this._localStream = await this._retrieveLocalStream();\n }\n catch (error) {\n this._rejectStartMethod(error);\n (_a = this._pendingNegotiationPromise) === null || _a === void 0 ? void 0 : _a.reject(error);\n return this.call.setState('hangup');\n }\n /**\n * We need to defer the creation of RTCPeerConnection\n * until we gain gUM access otherwise it will have\n * private IP addresses in ICE host candidates\n * replaced by an mDNS hostname\n * @see https://groups.google.com/g/discuss-webrtc/c/6stQXi72BEU?pli=1\n */\n this._setupRTCPeerConnection();\n let hasLocalTracks = false;\n if (this._localStream && streamIsValid(this._localStream)) {\n const audioTracks = this._localStream.getAudioTracks();\n this.logger.debug('Local audio tracks: ', audioTracks);\n const videoTracks = this._localStream.getVideoTracks();\n this.logger.debug('Local video tracks: ', videoTracks);\n hasLocalTracks = Boolean(audioTracks.length || videoTracks.length);\n // TODO: use transceivers way only for offer - when answer gotta match mid from the ones from SRD\n if (this.isOffer && this._supportsAddTransceiver()) {\n const audioTransceiverParams = {\n direction: this.options.negotiateAudio ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n this.logger.debug('Applying audioTransceiverParams', audioTransceiverParams);\n audioTracks.forEach((track) => {\n this.instance.addTransceiver(track, audioTransceiverParams);\n });\n const videoTransceiverParams = {\n direction: this.options.negotiateVideo ? 'sendrecv' : 'sendonly',\n streams: [this._localStream],\n };\n if (this.isSimulcast) {\n const rids = ['0', '1', '2'];\n videoTransceiverParams.sendEncodings = rids.map((rid) => ({\n active: true,\n rid: rid,\n scaleResolutionDownBy: Number(rid) * 6 || 1.0,\n }));\n }\n this.logger.debug('Applying videoTransceiverParams', videoTransceiverParams);\n videoTracks.forEach((track) => {\n this.instance.addTransceiver(track, videoTransceiverParams);\n });\n if (this.isSfu) {\n const { msStreamsNumber = 5 } = this.options;\n this.logger.debug('Add ', msStreamsNumber, 'recvonly MS Streams');\n videoTransceiverParams.direction = 'recvonly';\n for (let i = 0; i < Number(msStreamsNumber); i++) {\n this.instance.addTransceiver('video', videoTransceiverParams);\n }\n }\n }\n else if (typeof this.instance.addTrack === 'function') {\n // Use addTrack\n // To avoid TS complains in forEach\n const stream = this._localStream;\n audioTracks.forEach((track) => this.instance.addTrack(track, stream));\n videoTracks.forEach((track) => this.instance.addTrack(track, stream));\n }\n else {\n // Fallback to legacy addStream ..\n // @ts-ignore\n this.instance.addStream(this._localStream);\n }\n }\n if (this.isOffer) {\n if (this.options.negotiateAudio) {\n this._checkMediaToNegotiate('audio');\n }\n if (this.options.negotiateVideo) {\n this._checkMediaToNegotiate('video');\n }\n /**\n * If it does not support unified-plan stuff (senders/receivers/transceivers)\n * invoke manually startNegotiation and use the RTCOfferOptions\n */\n if (!this._supportsAddTransceiver() && !hasLocalTracks) {\n this.startNegotiation();\n }\n }\n else {\n this.startNegotiation();\n }\n });\n }\n detachAndStop() {\n var _a;\n if (typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getTransceivers) === 'function') {\n this.instance.getTransceivers().forEach((transceiver) => {\n // Do not use `stopTrack` util to not dispatch the `ended` event\n if (transceiver.sender.track) {\n transceiver.sender.track.stop();\n }\n if (transceiver.receiver.track) {\n transceiver.receiver.track.stop();\n }\n });\n }\n this.stop();\n }\n stop() {\n var _a, _b, _c;\n // Do not use `stopTrack` util to not dispatch the `ended` event\n (_a = this._localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());\n (_b = this._remoteStream) === null || _b === void 0 ? void 0 : _b.getTracks().forEach((track) => track.stop());\n (_c = this.instance) === null || _c === void 0 ? void 0 : _c.close();\n this.stopWatchMediaPackets();\n }\n _supportsAddTransceiver() {\n return typeof this.instance.addTransceiver === 'function';\n }\n _checkMediaToNegotiate(kind) {\n // addTransceiver of 'kind' if not present\n const sender = this._getSenderByKind(kind);\n if (!sender && this._supportsAddTransceiver()) {\n const transceiver = this.instance.addTransceiver(kind, {\n direction: 'recvonly',\n });\n this.logger.debug('Add transceiver', kind, transceiver);\n }\n }\n async _sdpReady() {\n var _a, _b;\n clearTimeout(this._iceTimeout);\n if (!this.instance.localDescription) {\n this.logger.error('Missing localDescription', this.instance);\n return;\n }\n const { sdp } = this.instance.localDescription;\n if (sdp.indexOf('candidate') === -1) {\n this.logger.debug('No candidate - retry \\n');\n this.startNegotiation(true);\n return;\n }\n if (!this._sdpIsValid()) {\n this.logger.info('SDP ready but not valid');\n this._onIceTimeout();\n return;\n }\n this.instance.removeEventListener('icecandidate', this._onIce);\n try {\n await this.call.onLocalSDPReady(this);\n if (this.isAnswer) {\n this._resolveStartMethod();\n (_a = this._pendingNegotiationPromise) === null || _a === void 0 ? void 0 : _a.resolve();\n }\n }\n catch (error) {\n this._rejectStartMethod(error);\n (_b = this._pendingNegotiationPromise) === null || _b === void 0 ? void 0 : _b.reject(error);\n }\n }\n _sdpIsValid() {\n if (this.localSdp && this.hasIceServers) {\n return sdpHasValidCandidates(this.localSdp);\n }\n return Boolean(this.localSdp);\n }\n _forceNegotiation() {\n this.logger.info('Force negotiation again');\n this._negotiating = false;\n this.startNegotiation();\n }\n _onIceTimeout() {\n var _a;\n if (this._sdpIsValid()) {\n this._sdpReady();\n return;\n }\n this.logger.info('ICE gathering timeout');\n const config = this.getConfiguration();\n if (config.iceTransportPolicy === 'relay') {\n this.logger.info('RTCPeer already with \"iceTransportPolicy: relay\"');\n const error = {\n code: 'ICE_GATHERING_FAILED',\n message: 'Ice gathering timeout',\n };\n this._rejectStartMethod(error);\n (_a = this._pendingNegotiationPromise) === null || _a === void 0 ? void 0 : _a.reject(error);\n this.call.setState('destroy');\n return;\n }\n this.setConfiguration(Object.assign(Object.assign({}, config), { iceTransportPolicy: 'relay' }));\n this._forceNegotiation();\n }\n _onIce(event) {\n /**\n * Clear _iceTimeout on each single candidate\n */\n if (this._iceTimeout) {\n clearTimeout(this._iceTimeout);\n }\n /**\n * Following spec: no candidate means the gathering is completed.\n */\n if (!event.candidate) {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n return;\n }\n this.logger.debug('RTCPeer Candidate:', event.candidate);\n if (event.candidate.type === 'host') {\n /**\n * With `host` candidate set timeout to\n * maxIceGatheringTimeout and then invoke\n * _onIceTimeout to check if the SDP is valid\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._onIceTimeout();\n }, this.options.maxIceGatheringTimeout);\n }\n else {\n /**\n * With `srflx`, `prflx` or `relay` candidates\n * set timeout to iceGatheringTimeout and then invoke\n * _sdpReady since at least one candidate is valid.\n */\n this._iceTimeout = setTimeout(() => {\n this.instance.removeEventListener('icecandidate', this._onIce);\n this._sdpReady();\n }, this.options.iceGatheringTimeout);\n }\n }\n _setLocalDescription(localDescription) {\n const { useStereo, googleMaxBitrate, googleMinBitrate, googleStartBitrate, } = this.options;\n if (localDescription.sdp && useStereo) {\n localDescription.sdp = sdpStereoHack(localDescription.sdp);\n }\n if (localDescription.sdp &&\n googleMaxBitrate &&\n googleMinBitrate &&\n googleStartBitrate) {\n localDescription.sdp = sdpBitrateHack(localDescription.sdp, googleMaxBitrate, googleMinBitrate, googleStartBitrate);\n }\n // this.logger.debug(\n // 'LOCAL SDP \\n',\n // `Type: ${localDescription.type}`,\n // '\\n\\n',\n // localDescription.sdp\n // )\n return this.instance.setLocalDescription(localDescription);\n }\n _setRemoteDescription(remoteDescription) {\n if (remoteDescription.sdp && this.options.useStereo) {\n remoteDescription.sdp = sdpStereoHack(remoteDescription.sdp);\n }\n if (remoteDescription.sdp && this.instance.localDescription) {\n remoteDescription.sdp = sdpMediaOrderHack(remoteDescription.sdp, this.instance.localDescription.sdp);\n }\n const sessionDescr = sdpToJsonHack(remoteDescription);\n this.logger.debug('REMOTE SDP \\n', `Type: ${remoteDescription.type}`, '\\n\\n', remoteDescription.sdp);\n return this.instance.setRemoteDescription(sessionDescr);\n }\n async _retrieveLocalStream() {\n if (streamIsValid(this.options.localStream)) {\n return this.options.localStream;\n }\n const constraints = await getMediaConstraints(this.options);\n return getUserMedia(constraints);\n }\n _attachListeners() {\n this.instance.addEventListener('signalingstatechange', () => {\n this.logger.debug('signalingState:', this.instance.signalingState);\n switch (this.instance.signalingState) {\n case 'stable':\n // Workaround to skip nested negotiations\n // Chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=740501\n this._negotiating = false;\n this._restartingIce = false;\n this.resetNeedResume();\n if (this.instance.connectionState === 'connected') {\n // An ice restart won't change the connectionState so we emit the same event in here\n // since the signalingState is \"stable\" again.\n this.emitMediaConnected();\n }\n break;\n case 'have-local-offer': {\n if (this.instance.iceGatheringState === 'complete') {\n this._sdpReady();\n }\n break;\n }\n // case 'have-remote-offer': {}\n case 'closed':\n // @ts-ignore\n delete this.instance;\n break;\n default:\n this._negotiating = true;\n }\n });\n this.instance.addEventListener('connectionstatechange', () => {\n this.logger.debug('connectionState:', this.instance.connectionState);\n switch (this.instance.connectionState) {\n // case 'new':\n // break\n case 'connecting':\n this._connectionStateTimer = setTimeout(() => {\n this.logger.warn('connectionState timed out');\n this.restartIceWithRelayOnly();\n }, this.options.maxConnectionStateTimeout);\n break;\n case 'connected':\n this.clearConnectionStateTimer();\n this.emitMediaConnected();\n break;\n // case 'closed':\n // break\n case 'disconnected':\n this.logger.debug('[test] Prevent reattach!');\n break;\n case 'failed': {\n this.triggerResume();\n break;\n }\n }\n });\n this.instance.addEventListener('negotiationneeded', () => {\n this.logger.debug('Negotiation needed event');\n this.startNegotiation();\n });\n this.instance.addEventListener('iceconnectionstatechange', () => {\n this.logger.debug('iceConnectionState:', this.instance.iceConnectionState);\n });\n this.instance.addEventListener('icegatheringstatechange', () => {\n this.logger.debug('iceGatheringState:', this.instance.iceGatheringState);\n });\n // this.instance.addEventListener('icecandidateerror', (event) => {\n // this.logger.warn('IceCandidate Error:', event)\n // })\n this.instance.addEventListener('track', (event) => {\n // @ts-expect-error\n this.call.emit('track', event);\n if (this.isSfu) {\n // const notification = { type: 'trackAdd', event }\n // this.call._dispatchNotification(notification)\n }\n this._remoteStream = event.streams[0];\n });\n // @ts-ignore\n this.instance.addEventListener('addstream', (event) => {\n if (event.stream) {\n this._remoteStream = event.stream;\n }\n });\n this._attachAudioTrackListener();\n this._attachVideoTrackListener();\n }\n clearTimers() {\n this.clearResumeTimer();\n this.clearWatchMediaPacketsTimer();\n this.clearConnectionStateTimer();\n }\n clearConnectionStateTimer() {\n clearTimeout(this._connectionStateTimer);\n }\n clearWatchMediaPacketsTimer() {\n clearTimeout(this._watchMediaPacketsTimer);\n }\n clearResumeTimer() {\n clearTimeout(this._resumeTimer);\n this._resumeTimer = undefined;\n }\n emitMediaConnected() {\n this.call.emit('media.connected');\n }\n _onEndedTrackHandler(event) {\n const mediaTrack = event.target;\n const evt = mediaTrack.kind === 'audio' ? 'microphone' : 'camera';\n this.call.emit(`${evt}.disconnected`, {\n deviceId: mediaTrack.id,\n label: mediaTrack.label,\n });\n }\n _attachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _attachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.addEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachAudioTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n _detachVideoTrackListener() {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks().forEach((track) => {\n track.removeEventListener('ended', this._onEndedTrackHandler);\n });\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local `rtcConfigPolyfill` object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration#parameters\n */\n setConfiguration(config) {\n var _a;\n this.rtcConfigPolyfill = config;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.setConfiguration) === 'function') {\n this.instance.setConfiguration(config);\n }\n }\n /**\n * React Native does not support getConfiguration\n * so we polyfill it using a local config object.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/getConfiguration\n */\n getConfiguration() {\n var _a;\n if (this.instance &&\n typeof ((_a = this.instance) === null || _a === void 0 ? void 0 : _a.getConfiguration) === 'function') {\n return this.instance.getConfiguration();\n }\n return this.rtcConfigPolyfill || this.config;\n }\n}\n//# sourceMappingURL=RTCPeer.js.map","import { getLogger } from '@signalwire/core';\nexport const watchRTCPeerMediaPackets = (rtcPeer) => {\n if (!rtcPeer.hasAudioReceiver && !rtcPeer.hasVideoReceiver) {\n getLogger().warn(`Missing receivers to inspect media for RTCPeer \"${rtcPeer.uuid}\"`);\n return;\n }\n getLogger().debug(`Start watching media for RTCPeer \"${rtcPeer.uuid}\"`);\n let previousAudioValue = 0;\n let previousVideoValue = 0;\n let run = true;\n let timer;\n const clearTimer = () => {\n clearTimeout(timer);\n };\n const meter = async () => {\n var _a, _b;\n let audioPacketsReceived = 0;\n let videoPacketsReceived = 0;\n try {\n const stats = await rtcPeer.instance.getStats(null);\n const audioTrackId = (_a = rtcPeer.remoteAudioTrack) === null || _a === void 0 ? void 0 : _a.id;\n const videoTrackId = (_b = rtcPeer.remoteVideoTrack) === null || _b === void 0 ? void 0 : _b.id;\n stats.forEach((report) => {\n if (report.type === 'inbound-rtp' &&\n report.kind === 'audio' &&\n report.trackIdentifier === audioTrackId) {\n getLogger().trace(`audio inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n audioPacketsReceived = report.packetsReceived;\n }\n if (report.type === 'inbound-rtp' &&\n report.kind === 'video' &&\n report.trackIdentifier === videoTrackId) {\n getLogger().trace(`video inbound-rtp: packetsReceived: ${report.packetsReceived} (at ${report.lastPacketReceivedTimestamp})`);\n videoPacketsReceived = report.packetsReceived;\n }\n });\n }\n catch (error) {\n getLogger().warn('getStats error', error);\n }\n finally {\n const noAudioChanged = audioPacketsReceived && audioPacketsReceived <= previousAudioValue;\n const noVideoChanged = videoPacketsReceived && videoPacketsReceived <= previousVideoValue;\n if (noAudioChanged && noVideoChanged) {\n getLogger().warn(`audioPacketsReceived: ${audioPacketsReceived} - previousAudioValue: ${previousAudioValue}`);\n getLogger().warn(`videoPacketsReceived: ${videoPacketsReceived} - previousVideoValue: ${previousVideoValue}`);\n rtcPeer.triggerResume();\n }\n else {\n previousAudioValue = audioPacketsReceived !== null && audioPacketsReceived !== void 0 ? audioPacketsReceived : previousAudioValue;\n previousVideoValue = videoPacketsReceived !== null && videoPacketsReceived !== void 0 ? videoPacketsReceived : previousVideoValue;\n clearTimer();\n if (run && rtcPeer.instance.connectionState !== 'closed') {\n timer = setTimeout(() => meter(), rtcPeer.watchMediaPacketsTimeout);\n }\n }\n }\n };\n return {\n start: () => {\n clearTimer();\n meter();\n },\n stop: () => {\n run = false;\n clearTimer();\n },\n };\n};\n//# sourceMappingURL=watchRTCPeerMediaPackets.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { __rest } from \"tslib\";\nimport { getLogger, sagaEffects, VertoResult, VertoPong, isWebrtcEventType, sagaHelpers, componentActions, } from '@signalwire/core';\nconst isWebrtcAction = (action) => {\n return isWebrtcEventType(action.type);\n};\nexport const vertoEventWorker = function* (options) {\n getLogger().debug('vertoEventWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const worker = function* (action) {\n var _a, _b;\n const { id: jsonrpcId, method, params = {} } = action.payload;\n const { callID, nodeId } = params;\n const peer = instance.getRTCPeerById(callID);\n if (!peer) {\n getLogger().warn(`RTCPeer '${callID}' not found for method: '${method}'`, params);\n return;\n }\n const activeRTCPeer = instance.peer;\n // getLogger().warn('vertoEventWorker', method, params)\n switch (method) {\n case 'verto.media':\n case 'verto.answer': {\n /**\n * verto.media and verto.answer share the same logic\n *\n * Always invoke peer.onRemoteSdp(params.sdp) on the proper RTCPeer\n * If the `params.callID` is the current ACTIVE peer, set the BaseConnection state to 'early' | 'active'\n * If the `params.callID` is NOT the current peer just setup the media (ie: promote/demote)\n */\n if (peer.uuid === (activeRTCPeer === null || activeRTCPeer === void 0 ? void 0 : activeRTCPeer.uuid)) {\n const state = method === 'verto.media' ? 'early' : 'active';\n instance.setState(state);\n }\n if (params === null || params === void 0 ? void 0 : params.sdp) {\n peer.onRemoteSdp(params.sdp);\n }\n yield sagaEffects.put(componentActions.upsert({\n id: (_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID,\n nodeId: (_b = action.payload.params) === null || _b === void 0 ? void 0 : _b.nodeId,\n }));\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.bye': {\n /**\n * If the `params.callID` is the current ACTIVE peer, stop everything and destroy the BaseConnection\n * If the `params.callID` is NOT the current peer, but is there from promote/demote process stop/destroy just the peer\n */\n yield sagaEffects.call([instance, instance.onVertoBye], {\n rtcPeerId: callID,\n byeCause: params === null || params === void 0 ? void 0 : params.cause,\n byeCauseCode: params === null || params === void 0 ? void 0 : params.causeCode,\n redirectDestination: params === null || params === void 0 ? void 0 : params.redirectDestination,\n });\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoResult(jsonrpcId, method),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.ping': {\n // Remove nodeId from params\n const { nodeId } = params, pongParams = __rest(params, [\"nodeId\"]);\n yield sagaEffects.call([instance, instance.execute], {\n method: instance._getRPCMethod(),\n params: {\n message: VertoPong(pongParams),\n node_id: nodeId,\n },\n });\n break;\n }\n case 'verto.mediaParams': {\n if (!callID || !params.mediaParams) {\n getLogger().warn(`Invalid mediaParams event`, params);\n break;\n }\n const { audio, video } = params.mediaParams;\n if (peer && video) {\n peer.applyMediaConstraints('video', video);\n }\n if (peer && audio) {\n peer.applyMediaConstraints('audio', audio);\n }\n break;\n }\n case 'verto.display': {\n /** Call is active so set the RTCPeer */\n instance.setActiveRTCPeer(rtcPeerId);\n instance.emit('verto.display', action.payload.params);\n break;\n }\n default:\n return getLogger().warn(`Unknown Verto method: ${method}`, params);\n }\n };\n const catchableWorker = sagaHelpers.createCatchableSaga(worker, (error) => {\n getLogger().error('Verto Error', error);\n });\n while (true) {\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n var _a;\n if (isWebrtcAction(action)) {\n return ((_a = action.payload.params) === null || _a === void 0 ? void 0 : _a.callID) === rtcPeerId;\n }\n return false;\n });\n yield sagaEffects.fork(catchableWorker, action);\n }\n getLogger().trace('vertoEventWorker ended');\n};\n//# sourceMappingURL=vertoEventWorker.js.map","import { getLogger, sagaEffects, componentActions, Rooms, } from '@signalwire/core';\nexport const roomSubscribedWorker = function* (options) {\n getLogger().debug('roomSubscribedWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for roomSubscribedWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.room.subscribed' ||\n action.type === 'call.joined') {\n return action.payload.call_id === rtcPeerId;\n }\n return false;\n });\n // New emitter should not change the payload by reference\n const clonedPayload = JSON.parse(JSON.stringify(action.payload));\n /**\n * In here we joined a room_session so we can swap between RTCPeers\n */\n instance.setActiveRTCPeer(rtcPeerId);\n const roomSessionId = action.payload.room_session.id ||\n action.payload.room_session.room_session_id;\n /**\n * TODO: Replace the redux action/component with properties on RTCPeer instance?\n */\n yield sagaEffects.put(componentActions.upsert({\n id: action.payload.call_id,\n roomId: action.payload.room_session.room_id,\n roomSessionId: roomSessionId,\n memberId: action.payload.member_id,\n previewUrl: action.payload.room_session.preview_url,\n }));\n instance.emit('room.subscribed', action.payload);\n instance.emit('room.joined', transformPayload.call(instance, clonedPayload));\n getLogger().debug('roomSubscribedWorker ended', rtcPeerId);\n};\nfunction transformPayload(payload) {\n const keys = ['room_session', 'room'];\n keys.forEach((key) => {\n if (payload[key] && payload[key].recordings) {\n payload[key].recordings = (payload[key].recordings || []).map((recording) => {\n let recordingInstance = this.instanceMap.get(recording.id);\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n },\n });\n }\n else {\n recordingInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n recording,\n });\n }\n this.instanceMap.set(recording.id, recordingInstance);\n return recordingInstance;\n });\n }\n if (payload[key] && payload[key].playbacks) {\n payload[key].playbacks = (payload[key].playbacks || []).map((playback) => {\n let playbackInstance = this.instanceMap.get(playback.id);\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n },\n });\n }\n else {\n playbackInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n playback,\n });\n }\n this.instanceMap.set(playback.id, playbackInstance);\n return playbackInstance;\n });\n }\n if (payload[key] && payload[key].streams) {\n payload[key].streams = (payload[key].streams || []).map((stream) => {\n let streamInstance = this.instanceMap.get(stream.id);\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: this.store,\n payload: {\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n },\n });\n }\n else {\n streamInstance.setPayload({\n room_id: payload.room.room_id,\n room_session_id: payload.room_session.id,\n stream,\n });\n }\n this.instanceMap.set(stream.id, streamInstance);\n return streamInstance;\n });\n }\n });\n return payload;\n}\n//# sourceMappingURL=roomSubscribedWorker.js.map","import { getLogger, sagaEffects, sessionActions, selectors, } from '@signalwire/core';\nexport const promoteDemoteWorker = function* (options) {\n getLogger().debug('promoteDemoteWorker started');\n const { channels, instance, initialState } = options;\n const { swEventChannel } = channels;\n const { rtcPeerId } = initialState;\n if (!rtcPeerId) {\n throw new Error('Missing rtcPeerId for promoteDemoteWorker');\n }\n const action = yield sagaEffects.take(swEventChannel, (action) => {\n if (action.type === 'video.member.promoted' ||\n action.type === 'video.member.demoted') {\n return action.payload.member_id === instance.memberId;\n }\n return false;\n });\n getLogger().debug('promoteDemoteWorker:', action.type, action.payload);\n yield sagaEffects.put(sessionActions.updateAuthState(action.payload.authorization));\n const authState = yield sagaEffects.select(selectors.getAuthState);\n if (!authState) {\n throw new Error(`Invalid authState for '${action.type}'`);\n }\n // TODO: use the new getJoinMediaParams in here\n const { audio_allowed, video_allowed } = authState;\n switch (action.type) {\n case 'video.member.promoted':\n /**\n * Promote means enable the media allowed and keep the\n * same recv settings. (do not force recv media)\n */\n instance.updateMediaOptions({\n audio: audio_allowed === 'both',\n video: video_allowed === 'both',\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n case 'video.member.demoted':\n /**\n * Demote means force recvonly and receive only the media allowed.\n */\n instance.updateMediaOptions({\n audio: false,\n video: false,\n negotiateAudio: audio_allowed !== 'none',\n negotiateVideo: video_allowed !== 'none',\n });\n break;\n }\n instance._triggerNewRTCPeer();\n getLogger().debug('promoteDemoteWorker ended', rtcPeerId);\n};\n//# sourceMappingURL=promoteDemoteWorker.js.map","import { getLogger, sagaEffects, actions, } from '@signalwire/core';\nexport const sessionAuthWorker = function* (options) {\n getLogger().debug('sessionAuthWorker started');\n const { instance } = options;\n const action = yield sagaEffects.take([\n actions.authSuccessAction.type,\n actions.authErrorAction.type,\n ]);\n switch (action.type) {\n case actions.authSuccessAction.type:\n yield sagaEffects.call([instance, instance.resume]);\n break;\n case actions.authErrorAction.type:\n yield sagaEffects.call([instance, instance.setState], 'hangup');\n break;\n }\n getLogger().debug('sessionAuthWorker ended');\n};\n//# sourceMappingURL=sessionAuthWorker.js.map","export const INVITE_VERSION = 1000;\nexport const AUDIO_CONSTRAINTS = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n};\nexport const AUDIO_CONSTRAINTS_SCREENSHARE = Object.assign(Object.assign({}, AUDIO_CONSTRAINTS), { noiseSuppression: false, autoGainControl: false, \n // @ts-expect-error\n googAutoGainControl: false });\nexport const VIDEO_CONSTRAINTS = {\n width: { ideal: 1280, min: 320 },\n height: { ideal: 720, min: 180 },\n aspectRatio: { ideal: 16 / 9 },\n};\nexport const DEFAULT_CALL_OPTIONS = {\n destinationNumber: 'room',\n remoteCallerName: 'Outbound Call',\n remoteCallerNumber: '',\n callerName: '',\n callerNumber: '',\n audio: AUDIO_CONSTRAINTS,\n video: VIDEO_CONSTRAINTS,\n useStereo: false,\n attach: false,\n screenShare: false,\n additionalDevice: false,\n userVariables: {},\n requestTimeout: 10 * 1000,\n autoApplyMediaParams: true,\n iceGatheringTimeout: 2 * 1000,\n maxIceGatheringTimeout: 5 * 1000,\n maxConnectionStateTimeout: 3 * 1000,\n watchMediaPackets: true,\n watchMediaPacketsTimeout: 2 * 1000,\n};\n//# sourceMappingURL=constants.js.map","import { VertoBye, VertoInfo, VertoInvite, BaseComponent, selectors, VertoModify, componentSelectors, actions, isSATAuth, \n// VertoAttach,\nVertoAnswer, } from '@signalwire/core';\nimport RTCPeer from './RTCPeer';\nimport { stopTrack, getUserMedia, streamIsValid } from './utils';\nimport { hasMatchingSdpDirection, sdpRemoveLocalCandidates, } from './utils/sdpHelpers';\nimport * as workers from './workers';\nimport { AUDIO_CONSTRAINTS, AUDIO_CONSTRAINTS_SCREENSHARE, DEFAULT_CALL_OPTIONS, INVITE_VERSION, VIDEO_CONSTRAINTS, } from './utils/constants';\nexport class BaseConnection extends BaseComponent {\n constructor(options) {\n super(options);\n /** @internal */\n this.leaveReason = undefined;\n /** @internal */\n this.gotEarly = false;\n this.state = 'new';\n this.prevState = 'new';\n this.rtcPeerMap = new Map();\n this.resuming = false;\n /** @internal */\n this.onVertoBye = (params) => {\n this.logger.debug('onVertoBye', params);\n const { rtcPeerId, byeCause = 'NORMAL_CLEARING', byeCauseCode = '16', redirectDestination, } = params;\n this.cause = String(byeCause);\n this.causeCode = String(byeCauseCode);\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer) {\n return this.logger.warn('Invalid RTCPeer to hangup', params);\n }\n if (redirectDestination && rtcPeer.localSdp) {\n this.logger.debug('Redirect Destination to:', redirectDestination, 'for RTCPeer:', rtcPeer.uuid);\n // Force nodeId to redirectDestination\n this.executeInvite(rtcPeer.localSdp, rtcPeer.uuid, redirectDestination);\n return;\n }\n // Notify RTCPeer for the bad signaling error\n rtcPeer.onRemoteBye({ code: this.causeCode, message: this.cause });\n // Set state to hangup only if the rtcPeer is the current one\n if (this.activeRTCPeerId === (rtcPeer === null || rtcPeer === void 0 ? void 0 : rtcPeer.uuid)) {\n this.logger.debug('onVertoBye go hangup');\n this.setState('hangup');\n }\n };\n this.options = Object.assign(Object.assign({}, DEFAULT_CALL_OPTIONS), options);\n this._checkDefaultMediaConstraints();\n this.setState('new');\n this.logger.trace('New Call with Options:', this.options);\n this._initPeer();\n }\n get id() {\n return this.__uuid;\n }\n get active() {\n return this.state === 'active';\n }\n get trying() {\n return this.state === 'trying';\n }\n get memberId() {\n // @ts-expect-error\n return this.component.memberId;\n }\n get previewUrl() {\n // @ts-expect-error\n return this.component.previewUrl;\n }\n get roomId() {\n // @ts-expect-error\n return this.component.roomId;\n }\n get roomSessionId() {\n // @ts-expect-error\n return this.component.roomSessionId;\n }\n get nodeId() {\n // @ts-expect-error\n return this.component.nodeId || this.options.nodeId;\n }\n get callId() {\n var _a;\n return ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.uuid) || '';\n }\n get localStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.localStream;\n }\n set localStream(stream) {\n if (this.peer) {\n this.peer.localStream = stream;\n }\n }\n get remoteStream() {\n var _a;\n return (_a = this.peer) === null || _a === void 0 ? void 0 : _a.remoteStream;\n }\n get iceServers() {\n var _a, _b;\n return (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.iceServers) !== null && _b !== void 0 ? _b : this.select(selectors.getIceServers);\n }\n get component() {\n return (this.select((state) => componentSelectors.getComponent(state, this.callId)) || {});\n }\n 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 get withAudio() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasAudioReceiver);\n }\n get withVideo() {\n var _a;\n return Boolean((_a = this.peer) === null || _a === void 0 ? void 0 : _a.hasVideoReceiver);\n }\n get localAudioTrack() {\n return this.peer ? this.peer.localAudioTrack : null;\n }\n get localVideoTrack() {\n return this.peer ? this.peer.localVideoTrack : null;\n }\n get peer() {\n return this.getRTCPeerById(this.activeRTCPeerId);\n }\n set peer(rtcPeer) {\n if (!rtcPeer) {\n this.logger.warn('Invalid RTCPeer', rtcPeer);\n return;\n }\n this.logger.debug('Set RTCPeer', rtcPeer.uuid, rtcPeer);\n this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n if (this.peer && this.peer.instance && this.callId !== rtcPeer.uuid) {\n const oldPeerId = this.peer.uuid;\n this.logger.debug('>>> Stop old RTCPeer', oldPeerId);\n // Hangup the previous RTCPeer\n this.hangup(oldPeerId).catch(console.error);\n this.peer.detachAndStop();\n // Remove RTCPeer from local cache to stop answering to ping/pong\n // this.rtcPeerMap.delete(oldPeerId)\n }\n this.logger.debug('>>> Replace RTCPeer with', rtcPeer.uuid);\n this.activeRTCPeerId = rtcPeer.uuid;\n }\n // Implementation for the overloaded emit\n emit(event, ...args) {\n return super.emit(event, ...args);\n }\n /** @internal */\n dialogParams(rtcPeerId) {\n const { destinationNumber, attach, callerName, callerNumber, remoteCallerName, remoteCallerNumber, userVariables, screenShare, additionalDevice, pingSupported = true, } = this.options;\n return {\n dialogParams: {\n id: rtcPeerId,\n destinationNumber,\n attach,\n reattaching: attach,\n callerName,\n callerNumber,\n remoteCallerName,\n remoteCallerNumber,\n userVariables,\n screenShare,\n additionalDevice,\n pingSupported,\n version: INVITE_VERSION,\n },\n };\n }\n getRTCPeerById(rtcPeerId) {\n return this.rtcPeerMap.get(rtcPeerId);\n }\n appendRTCPeer(rtcPeer) {\n return this.rtcPeerMap.set(rtcPeer.uuid, rtcPeer);\n }\n setActiveRTCPeer(rtcPeerId) {\n this.peer = this.getRTCPeerById(rtcPeerId);\n }\n setLocalStream(stream) {\n return new Promise(async (resolve, reject) => {\n try {\n if (!this.peer || !this.localStream) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!streamIsValid(stream)) {\n return reject(new Error('Invalid stream provided.'));\n }\n const prevAudioTracks = this.localStream.getAudioTracks();\n const newAudioTracks = stream.getAudioTracks();\n if (newAudioTracks.length <= 0) {\n this.logger.info('No audio track found in the stream provided. Audio will be unaffected.');\n }\n else {\n prevAudioTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newAudioTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n const prevVideoTracks = this.localStream.getVideoTracks();\n const newVideoTracks = stream.getVideoTracks();\n if (newVideoTracks.length <= 0) {\n this.logger.info('No video track found in the stream provided. Video will be unaffected.');\n }\n else {\n prevVideoTracks.forEach((track) => {\n var _a;\n stopTrack(track);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n });\n newVideoTracks.forEach((track) => {\n var _a;\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.addTrack(track);\n });\n }\n await this.updateStream(this.localStream);\n this.logger.debug('setLocalStream done');\n resolve(this.localStream);\n }\n catch (error) {\n this.logger.error('setLocalStream', error);\n reject(error);\n }\n });\n }\n /**\n * Verto messages have to be wrapped into an execute\n * request and sent using the proper RPC WebRTCMethod.\n */\n vertoExecute(params) {\n return this.execute({\n method: this._getRPCMethod(),\n params,\n });\n }\n /** @internal */\n _getRPCMethod() {\n const authState = this.select(selectors.getAuthState);\n if (authState && isSATAuth(authState)) {\n return 'webrtc.verto';\n }\n return 'video.message';\n }\n /** @internal */\n async _triggerNewRTCPeer() {\n this.logger.debug('_triggerNewRTCPeer Start');\n try {\n this.logger.debug('Build a new RTCPeer');\n const rtcPeer = this._buildPeer('offer');\n this.logger.debug('Trigger start for the new RTCPeer!');\n await rtcPeer.start();\n }\n catch (error) {\n this.logger.error('Error building new RTCPeer to promote/demote', error);\n }\n }\n updateCamera(constraints) {\n return this.applyConstraintsAndRefreshStream({\n video: Object.assign({ aspectRatio: 16 / 9 }, constraints),\n });\n }\n updateMicrophone(constraints) {\n return this.applyConstraintsAndRefreshStream({\n audio: constraints,\n });\n }\n /**\n * Determines the appropriate {@link RTCRtpTransceiverDirection} based on current audio/video\n * and negotiation options. The returned direction tells the peer connection\n * whether to send, receive, both, or remain inactive for the given media kind.\n */\n _getTransceiverDirection(kind) {\n let direction = 'inactive';\n if (kind === 'audio') {\n if (this.options.audio && this.options.negotiateAudio) {\n direction = 'sendrecv';\n }\n else if (this.options.audio && !this.options.negotiateAudio) {\n direction = 'sendonly';\n }\n else if (!this.options.audio && this.options.negotiateAudio) {\n direction = 'recvonly';\n }\n else {\n direction = 'inactive';\n }\n }\n if (kind === 'video') {\n if (this.options.video && this.options.negotiateVideo) {\n direction = 'sendrecv';\n }\n else if (this.options.video && !this.options.negotiateVideo) {\n direction = 'sendonly';\n }\n else if (!this.options.video && this.options.negotiateVideo) {\n direction = 'recvonly';\n }\n else {\n direction = 'inactive';\n }\n }\n return direction;\n }\n /**\n * Adjusts senders based on the given audio/video constraints. If a constraint is set to false,\n * it stops the corresponding outbound track. Returns true if at least one sender is active,\n * otherwise false.\n */\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 * Attempts to obtain a new media stream that matches the given constraints, using a recursive\n * strategy. If the new constraints fail, it tries to restore the old constraints.\n * Returns a Promise that resolves to the new MediaStream or resolves without a stream if\n * constraints were fully disabled. Rejects on unrecoverable errors.\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 (!this.peer) {\n return reject(new Error('Invalid RTCPeerConnection.'));\n }\n if (!Object.keys(constraints).length) {\n return reject(new Error('Invalid audio/video constraints.'));\n }\n this.logger.debug('updateConstraints trying constraints', this.__uuid, constraints);\n const shouldContinueWithUpdate = this.manageSendersWithConstraints(constraints);\n if (!shouldContinueWithUpdate) {\n this.logger.debug('Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped');\n return resolve();\n }\n /**\n * On some devices/browsers you cannot open more than one MediaStream at\n * a time, per process. When this happens we'll try to do the following:\n * 1. Stop the current media tracks\n * 2. Try to get new media tracks with the new constraints\n * 3. If we get an error: restore the media tracks using the previous\n * constraints.\n * @see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1238038\n *\n * Instead of just replace the track, force-stop the current one to free\n * up the device\n */\n let oldConstraints = {};\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => {\n var _a;\n /**\n * We'll keep a reference of the original constraints so if something\n * fails we should be able to restore them.\n */\n // @ts-expect-error\n oldConstraints[track.kind] = track.getConstraints();\n // @ts-expect-error\n if (constraints[track.kind] !== undefined) {\n this.logger.debug('updateConstraints stop old tracks first?');\n this.logger.debug('Track readyState:', track.kind, track.readyState);\n stopTrack(track);\n track.stop();\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(track);\n }\n });\n let newStream;\n try {\n this.logger.info('updateConstraints with', constraints);\n newStream = await getUserMedia(constraints);\n }\n catch (error) {\n this.logger.error('Error updating device constraints:', error.name, error.message, error);\n this.logger.info('Restoring previous constraints', oldConstraints);\n await this.updateConstraints(oldConstraints, {\n attempt: attempt + 1,\n });\n return reject(error);\n }\n this.logger.debug('updateConstraints done');\n resolve(newStream);\n }\n catch (error) {\n this.logger.error('updateConstraints', error);\n reject(error);\n }\n });\n }\n /**\n * Updates local tracks and transceivers from the given stream.\n * For each new track, it adds/updates a transceiver and emits updated device events.\n */\n async updateStream(stream) {\n try {\n if (!this.peer) {\n throw new Error('Invalid RTCPeerConnection.');\n }\n // Store the previous tracks for device.updated events\n const prevVideoTrack = this.localVideoTrack;\n const prevAudioTrack = this.localAudioTrack;\n this.logger.debug('updateStream got stream', stream);\n if (!this.localStream) {\n this.localStream = new MediaStream();\n }\n const tracks = stream.getTracks();\n this.logger.debug(`updateStream got ${tracks.length} tracks`);\n for (const newTrack of tracks) {\n this.logger.debug('updateStream apply track: ', newTrack);\n // Add or update the transceiver (may trigger renegotiation)\n await this.handleTransceiverForTrack(newTrack);\n // Emit the device.updated events\n this.emitDeviceUpdatedEvents({\n newTrack,\n prevAudioTrack,\n prevVideoTrack,\n });\n }\n this.logger.debug('updateStream done');\n }\n catch (error) {\n this.logger.error('updateStream error', error);\n throw error;\n }\n }\n /**\n * Finds or creates a transceiver for the new track. If an existing transceiver is found,\n * replaces its track and updates its direction, if needed. If no transceiver is found,\n * adds a new one. The method can trigger renegotiation.\n */\n async handleTransceiverForTrack(newTrack) {\n var _a, _b;\n if (!this.peer) {\n return this.logger.error('Invalid RTCPeerConnection');\n }\n const transceiver = this.peer.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) {\n this.logger.debug('handleTransceiverForTrack got transceiver', transceiver.currentDirection, transceiver.mid);\n // Existing transceiver found, replace track if it's different\n if (((_a = transceiver.sender.track) === null || _a === void 0 ? void 0 : _a.id) !== newTrack.id) {\n await transceiver.sender.replaceTrack(newTrack);\n this.logger.debug(`handleTransceiverForTrack replaceTrack for ${newTrack.kind}`);\n }\n // Update direction if needed\n const newDirection = this._getTransceiverDirection(newTrack.kind);\n if (transceiver.direction !== newDirection) {\n transceiver.direction = newDirection;\n this.logger.debug(`handleTransceiverForTrack set direction to ${newDirection}`);\n }\n // Stop old track and add a new one\n this.replaceOldTrack(newTrack);\n }\n else {\n this.logger.debug('handleTransceiverForTrack no transceiver found; addTransceiver and start dancing!');\n // No suitable transceiver found, add a new one\n const direction = this._getTransceiverDirection(newTrack.kind);\n this.peer.type = 'offer';\n (_b = this.localStream) === null || _b === void 0 ? void 0 : _b.addTrack(newTrack);\n this.peer.instance.addTransceiver(newTrack, {\n direction: direction,\n streams: [this.localStream],\n });\n }\n }\n /**\n * Replaces old tracks of the same kind in the local stream with the new track.\n * Stops and removes the old track, then adds the new one. Also updates related\n * device options and reattaches track listeners.\n */\n replaceOldTrack(newTrack) {\n if (!this.peer || !this.localStream) {\n return this.logger.error('Invalid RTCPeerConnection');\n }\n // Detach listeners because stopTrack will trigger the track ended event\n this.peer._detachAudioTrackListener();\n this.peer._detachVideoTrackListener();\n this.localStream.getTracks().forEach((oldTrack) => {\n var _a;\n if (oldTrack.kind === newTrack.kind && oldTrack.id !== newTrack.id) {\n this.logger.debug('replaceOldTrack stop old track and apply new one');\n stopTrack(oldTrack);\n (_a = this.localStream) === null || _a === void 0 ? void 0 : _a.removeTrack(oldTrack);\n }\n });\n this.localStream.addTrack(newTrack);\n if (newTrack.kind === 'audio') {\n this.options.micId = newTrack.getSettings().deviceId;\n }\n if (newTrack.kind === 'video') {\n this.options.camId = newTrack.getSettings().deviceId;\n }\n // Attach listeners again\n this.peer._attachAudioTrackListener();\n this.peer._attachVideoTrackListener();\n }\n /**\n * Emits device updated events for audio or video. Uses previously stored\n * track references to indicate what changed between old and new devices.\n */\n emitDeviceUpdatedEvents({ newTrack, prevAudioTrack, prevVideoTrack, }) {\n if (newTrack.kind === 'audio') {\n this.emit('microphone.updated', {\n previous: {\n deviceId: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.id,\n label: prevAudioTrack === null || prevAudioTrack === void 0 ? void 0 : prevAudioTrack.label,\n },\n current: {\n deviceId: newTrack.id,\n label: newTrack.label,\n },\n });\n }\n else if (newTrack.kind === 'video') {\n this.emit('camera.updated', {\n previous: {\n deviceId: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.id,\n label: prevVideoTrack === null || prevVideoTrack === void 0 ? void 0 : prevVideoTrack.label,\n },\n current: {\n deviceId: newTrack.id,\n label: newTrack.label,\n },\n });\n }\n }\n /**\n * Applies the given constraints by retrieving a new stream and then uses\n * {@link updateStream} to synchronize local tracks with that new stream.\n */\n async applyConstraintsAndRefreshStream(constraints) {\n const newStream = await this.updateConstraints(constraints);\n if (newStream) {\n await this.updateStream(newStream);\n }\n }\n runRTCPeerWorkers(rtcPeerId) {\n this.runWorker('vertoEventWorker', {\n worker: workers.vertoEventWorker,\n initialState: { rtcPeerId },\n });\n const main = !(this.options.additionalDevice || this.options.screenShare);\n if (main) {\n this.runWorker('roomSubscribedWorker', {\n worker: workers.roomSubscribedWorker,\n initialState: { rtcPeerId },\n });\n this.runWorker('promoteDemoteWorker', {\n worker: workers.promoteDemoteWorker,\n initialState: { rtcPeerId },\n });\n }\n }\n /** @internal */\n invite() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'outbound';\n this.peer = this._buildPeer('offer');\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Invite error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n answer() {\n return new Promise(async (resolve, reject) => {\n this.direction = 'inbound';\n if (!this.peer) {\n this.peer = this._buildPeer('answer');\n }\n try {\n await this.peer.start();\n resolve(this);\n }\n catch (error) {\n this.logger.error('Answer error', error);\n reject(error);\n }\n });\n }\n /** @internal */\n onLocalSDPReady(rtcPeer) {\n if (!rtcPeer.instance.localDescription) {\n this.logger.error('Missing localDescription', rtcPeer);\n throw new Error('Invalid RTCPeerConnection localDescription');\n }\n const { type, sdp } = rtcPeer.instance.localDescription;\n const mungedSDP = this._mungeSDP(sdp);\n this.logger.debug('LOCAL SDP \\n', `Type: ${type}`, '\\n\\n', mungedSDP);\n switch (type) {\n case 'offer':\n this._watchSessionAuth();\n // If we have a remoteDescription already, send reinvite\n if (!this.resuming && rtcPeer.instance.remoteDescription) {\n return this.executeUpdateMedia(mungedSDP, rtcPeer.uuid);\n }\n else {\n return this.executeInvite(mungedSDP, rtcPeer.uuid);\n }\n case 'answer':\n return this.executeAnswer(mungedSDP, rtcPeer.uuid);\n default:\n return this.logger.error(`Unknown SDP type: '${type}' on call ${this.id}`);\n }\n }\n /** @internal */\n _closeWSConnection() {\n this._watchSessionAuth();\n this.store.dispatch(actions.sessionForceCloseAction());\n }\n _watchSessionAuth() {\n if (this.sessionAuthTask) {\n this.sessionAuthTask.cancel();\n }\n this.sessionAuthTask = this.runWorker('sessionAuthWorker', {\n worker: workers.sessionAuthWorker,\n });\n }\n /** @internal */\n async resume() {\n var _a;\n this.logger.warn(`[resume] Call ${this.id}`);\n if ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.instance) {\n const { connectionState } = this.peer.instance;\n this.logger.debug(`[resume] connectionState for ${this.id} is '${connectionState}'`);\n if (connectionState !== 'closed') {\n this.resuming = true;\n this.peer.restartIce();\n }\n }\n }\n /**\n * Send the `verto.invite` only if the state is either `new` or `requesting`\n * - new: the first time we send out the offer.\n * - requesting: we received a redirectDestination so need to send it again\n * specifying nodeId.\n *\n */\n async executeInvite(sdp, rtcPeerId, nodeId) {\n const rtcPeer = this.getRTCPeerById(rtcPeerId);\n if (!rtcPeer || (rtcPeer.instance.remoteDescription && !this.resuming)) {\n throw new Error(`RTCPeer '${rtcPeerId}' already has a remoteDescription. Invalid invite.`);\n }\n // Set state to `requesting` only when `new`, otherwise keep it as `requesting`.\n if (this.state === 'new') {\n this.setState('requesting');\n }\n try {\n const ssOpts = this.options.screenShare\n ? {\n layout: this.options.layout,\n positions: this.options.positions,\n }\n : {};\n const message = VertoInvite(Object.assign(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), ssOpts), { sdp }));\n let subscribe = [];\n if (this.options.screenShare) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.screenshare'];\n }\n else if (this.options.additionalDevice) {\n /** @ts-expect-error - Only being used for debugging purposes */\n subscribe = ['video.room.additionaldevice'];\n }\n else {\n subscribe = this.getSubscriptions();\n }\n this.logger.debug('Subscribing to', subscribe);\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe,\n });\n this.logger.debug('Invite response', response);\n this.resuming = false;\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /**\n * Send the `verto.answer` only if the state is `new`\n * - new: the first time we send out the answer.\n */\n async executeAnswer(sdp, rtcPeerId, nodeId) {\n // Set state to `answering` only when `new`, otherwise keep it as `answering`.\n if (this.state === 'new') {\n this.setState('answering');\n }\n try {\n const message = VertoAnswer(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: nodeId !== null && nodeId !== void 0 ? nodeId : this.options.nodeId,\n subscribe: this.getSubscriptions(),\n });\n this.logger.debug('Answer response', response);\n this.resuming = false;\n /** Call is active so set the RTCPeer */\n this.setActiveRTCPeer(rtcPeerId);\n }\n catch (error) {\n this.setState('hangup');\n throw error;\n }\n }\n /**\n * Send the `verto.modify` when it's an offer and remote is already present\n * It helps in renegotiation.\n */\n async executeUpdateMedia(sdp, rtcPeerId) {\n var _a, _b;\n try {\n const message = VertoModify(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { sdp, action: 'updateMedia' }));\n const response = await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n this.logger.debug('UpdateMedia response', response);\n if (!this.peer) {\n return this.logger.error('Invalid RTCPeer to updateMedia');\n }\n if (!response.sdp) {\n return this.logger.error('UpdateMedia invalid SDP answer', response);\n }\n await this.peer.onRemoteSdp(response.sdp);\n }\n catch (error) {\n // Should we hangup when renegotiation fails?\n this.logger.error('UpdateMedia error', error);\n // Reject the pending negotiation promise\n (_b = (_a = this.peer) === null || _a === void 0 ? void 0 : _a._pendingNegotiationPromise) === null || _b === void 0 ? void 0 : _b.reject(error);\n throw error;\n }\n }\n async hangup(id) {\n const rtcPeerId = id !== null && id !== void 0 ? id : this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(this.dialogParams(rtcPeerId));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('Hangup error:', error);\n }\n finally {\n if (rtcPeerId !== this.callId) {\n return this.logger.warn('Prevent setState hangup', rtcPeerId, this.callId);\n }\n this.setState('hangup');\n }\n }\n async hangupAll() {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to hangup');\n }\n try {\n const message = VertoBye(Object.assign({ cause: 'REJECT_ALL', causeCode: '825' }, this.dialogParams(rtcPeerId)));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n catch (error) {\n this.logger.error('HangupAll error:', error);\n }\n finally {\n this.setState('hangup');\n }\n }\n async sendDigits(dtmf) {\n const rtcPeerId = this.callId;\n if (!rtcPeerId) {\n throw new Error('Invalid RTCPeer ID to send DTMF');\n }\n const message = VertoInfo(Object.assign(Object.assign({}, this.dialogParams(rtcPeerId)), { dtmf }));\n await this.vertoExecute({\n message,\n callID: rtcPeerId,\n node_id: this.nodeId,\n });\n }\n /** @internal */\n doReinviteWithRelayOnly() {\n if (this.peer && this.active) {\n this.peer.restartIceWithRelayOnly();\n }\n }\n /** @internal */\n stopOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('audio');\n }\n }\n /** @internal */\n restoreOutboundAudio() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('audio');\n }\n }\n /** @internal */\n stopOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.stopTrackSender('video');\n }\n }\n /** @internal */\n restoreOutboundVideo() {\n if (this.peer && this.active) {\n this.peer.restoreTrackSender('video');\n }\n }\n /** @internal */\n setState(state) {\n this.prevState = this.state;\n this.state = state;\n this.logger.trace(`Call ${this.id} state change from ${this.prevState} to ${this.state}`);\n 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.logger.debug('updateMediaOptions', Object.assign({}, options));\n this.options = Object.assign(Object.assign({}, this.options), options);\n this._checkDefaultMediaConstraints();\n }\n /**\n * Allow to define logic to munge the SDP\n *\n * @internal\n * */\n _mungeSDP(sdp) {\n return sdpRemoveLocalCandidates(sdp);\n }\n /**\n * Always use VIDEO_CONSTRAINTS if video: true\n * Always use AUDIO_CONSTRAINTS (or the SS one) if audio: true\n *\n * @internal\n */\n _checkDefaultMediaConstraints() {\n if (this.options.video === true) {\n this.options.video = VIDEO_CONSTRAINTS;\n }\n if (this.options.audio === true) {\n this.options.audio = this.options.screenShare\n ? AUDIO_CONSTRAINTS_SCREENSHARE\n : AUDIO_CONSTRAINTS;\n }\n }\n _initPeer() {\n // Build only for answer to be able to reject\n if (this.options.remoteSdp) {\n this.peer = this._buildPeer('answer');\n }\n }\n _buildPeer(type) {\n const rtcPeer = new RTCPeer(this, type);\n this.appendRTCPeer(rtcPeer);\n this.runRTCPeerWorkers(rtcPeer.uuid);\n return rtcPeer;\n }\n /** @internal */\n _finalize() {\n this.rtcPeerMap.forEach((rtcPeer) => {\n rtcPeer.stop();\n });\n this.rtcPeerMap.clear();\n }\n /**\n * Add or update the transceiver based on the media type and direction\n */\n _upsertTransceiverByKind(direction, kind) {\n if (!this.peer) {\n return this.logger.error('Invalid RTCPeerConnection');\n }\n let transceiver = this.peer.instance\n .getTransceivers()\n .find((tr) => { var _a, _b; return ((_a = tr.sender.track) === null || _a === void 0 ? void 0 : _a.kind) === kind || ((_b = tr.receiver.track) === null || _b === void 0 ? void 0 : _b.kind) === kind; });\n if (transceiver) {\n if (transceiver.direction === direction) {\n this.logger.info(`Transceiver ${kind} has the same direction \"${direction}\".`);\n return;\n }\n transceiver.direction = direction;\n this.logger.info(`Updated ${kind} transceiver to \"${direction}\" mode.`);\n }\n else {\n // No transceiver exists; add one if the direction is not \"inactive\"\n if (direction !== 'inactive') {\n // Ensure we act as the offerer when adding the transceiver during renegotiation\n this.peer.type = 'offer';\n transceiver = this.peer.instance.addTransceiver(kind, { direction });\n this.logger.info(`Added ${kind} transceiver in \"${direction}\" mode.`);\n }\n }\n if (direction === 'stopped' || direction === 'inactive') {\n this.peer.stopTrackReceiver(kind);\n this.peer.stopTrackSender(kind);\n }\n else if (direction === 'sendonly') {\n this.peer.stopTrackReceiver(kind);\n }\n else if (direction === 'recvonly') {\n this.peer.stopTrackSender(kind);\n }\n }\n /**\n * Allow user to upgrade/downgrade media in a call.\n * This performs RTC Peer renegotiation.\n *\n * @param params: {@link UpdateMediaParams}\n */\n async updateMedia(params) {\n var _a, _b, _c, _d, _e, _f, _g;\n try {\n const { audio, video } = params;\n if (!this.peer) {\n throw new Error('Invalid RTCPeerConnection');\n }\n // Check if the peer is already negotiating\n if ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.isNegotiating) {\n throw new Error('The peer is already negotiating the media!');\n }\n /**\n * Create a new renegotiation promise that would be resolved by the {@link executeUpdateMedia}\n */\n const peer = this.peer;\n const negotiationPromise = new Promise((resolve, reject) => {\n peer._pendingNegotiationPromise = {\n resolve,\n reject,\n };\n });\n const shouldEnableAudio = ['sendonly', 'sendrecv'].includes((audio === null || audio === void 0 ? void 0 : audio.direction) || '');\n const shouldEnableVideo = ['sendonly', 'sendrecv'].includes((video === null || video === void 0 ? void 0 : video.direction) || '');\n const shouldNegotiateAudio = ['sendrecv', 'receive'].includes((audio === null || audio === void 0 ? void 0 : audio.direction) || '');\n const shouldNegotiateVideo = ['sendrecv', 'receive'].includes((video === null || video === void 0 ? void 0 : video.direction) || '');\n this.updateMediaOptions(Object.assign(Object.assign(Object.assign(Object.assign({}, (audio && { audio: (_b = audio === null || audio === void 0 ? void 0 : audio.constraints) !== null && _b !== void 0 ? _b : shouldEnableAudio })), (video && { video: (_c = video === null || video === void 0 ? void 0 : video.constraints) !== null && _c !== void 0 ? _c : shouldEnableVideo })), (audio && { negotiateAudio: shouldNegotiateAudio })), (video && { negotiateVideo: shouldNegotiateVideo })));\n /**\n * The {@link applyConstraintsAndRefreshStream} updates the constraints,\n * gets the new user stream and updates the transceiver.\n * However, it only handles the media which is being enabled.\n * If the media is being disabled, we need to handle that below.\n */\n await this.applyConstraintsAndRefreshStream(Object.assign(Object.assign({}, (audio && { audio: (_d = audio === null || audio === void 0 ? void 0 : audio.constraints) !== null && _d !== void 0 ? _d : shouldEnableAudio })), (video && { video: (_e = video === null || video === void 0 ? void 0 : video.constraints) !== null && _e !== void 0 ? _e : shouldEnableVideo })));\n // When disabling audio\n if (audio && !shouldEnableAudio) {\n this._upsertTransceiverByKind(audio.direction, 'audio');\n }\n // When disabling video\n if (video && !shouldEnableVideo) {\n this._upsertTransceiverByKind(video.direction, 'video');\n }\n /**\n * Trigger the negotiation with the new settings.\n * If the negotiation is already ongoing it would not have a side effect.\n */\n await this.peer.startNegotiation();\n // Wait for the Renegotiation to complete\n await negotiationPromise;\n // Throw error if the remote SDP does not include the expected audio direction\n if (!hasMatchingSdpDirection({\n localSdp: this.peer.localSdp,\n remoteSdp: this.peer.remoteSdp,\n media: 'audio',\n })) {\n throw new Error('The server did not set the audio direction correctly');\n }\n // Throw error if the remote SDP does not include the expected video direction\n if (!hasMatchingSdpDirection({\n localSdp: this.peer.localSdp,\n remoteSdp: this.peer.remoteSdp,\n media: 'video',\n })) {\n throw new Error('The server did not set the video direction correctly');\n }\n }\n catch (error) {\n // Reject the negotiation promise if an error occurs\n (_g = (_f = this.peer) === null || _f === void 0 ? void 0 : _f._pendingNegotiationPromise) === null || _g === void 0 ? void 0 : _g.reject(error);\n throw error;\n }\n }\n /**\n * Allow user to set the audio direction on the RTC Peer.\n * This performs RTC Peer renegotiation.\n *\n * @param direction {@link UpdateMediaDirection}\n */\n async setAudioDirection(direction) {\n if (!['sendonly', 'sendrecv', 'recvonly', 'inactive'].includes(direction)) {\n throw new Error('Invalid direction specified');\n }\n return this.updateMedia({\n audio: {\n direction,\n },\n });\n }\n /**\n * Allow user to set the video direction on the RTC Peer.\n * This performs RTC Peer renegotiation.\n *\n * @param direction {@link UpdateMediaDirection}\n */\n async setVideoDirection(direction) {\n if (!['sendonly', 'sendrecv', 'recvonly', 'inactive'].includes(direction)) {\n throw new Error('Invalid direction specified');\n }\n return this.updateMedia({\n video: {\n direction,\n },\n });\n }\n async hold() {\n const message = VertoModify(Object.assign(Object.assign({}, this.dialogParams(this.callId)), { action: 'hold' }));\n await this.vertoExecute({\n message,\n callID: this.callId,\n node_id: this.nodeId,\n });\n }\n async unhold() {\n const message = VertoModify(Object.assign(Object.assign({}, this.dialogParams(this.callId)), { action: 'unhold' }));\n this.vertoExecute({\n message,\n callID: this.callId,\n node_id: this.nodeId,\n });\n }\n}\n//# sourceMappingURL=BaseConnection.js.map","const setAudioMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n}) => {\n element.autoplay = true\n // @ts-ignore\n element.playsinline = true\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n\n return element\n}\n\nexport { setAudioMediaTrack }\n","import { actions } from '@signalwire/core'\n\nexport const audioSetSpeakerAction = actions.createAction<string>(\n 'swJs/audioSetSpeakerAction'\n)\n","import {\n getLogger,\n CustomSagaParams,\n actions,\n sagaEffects,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport type { SagaIterator, Task } from '@signalwire/core'\nimport { setMediaElementSinkId } from '@signalwire/webrtc'\nimport { setAudioMediaTrack } from '../../utils/audioElement'\nimport { audioSetSpeakerAction } from '../actions'\nimport { VideoRoomSessionConnection } from '../../video/VideoRoomSession'\n\nexport const makeAudioElementSaga = ({ speakerId }: { speakerId?: string }) => {\n return function* audioElementSaga({\n instance: room,\n runSaga,\n }: CustomSagaParams<VideoRoomSessionConnection>): SagaIterator {\n if (typeof Audio === 'undefined') {\n getLogger().warn('`Audio` is not supported on this environment.')\n return\n }\n\n try {\n const audioEl = room.getAudioEl()\n let audioTask: Task | undefined\n\n const trackHandler = function (event: RTCTrackEvent) {\n switch (event.track.kind) {\n case 'audio': {\n audioTask = runSaga(audioElementSetupWorker, {\n track: event.track,\n element: audioEl,\n speakerId,\n room,\n })\n break\n }\n }\n }\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the audioEl with the new track.\n */\n room.on('track', trackHandler)\n\n room.once('destroy', () => {\n audioTask?.cancel()\n })\n } catch (error) {\n getLogger().error('audioElementSaga', error)\n }\n }\n}\n\nfunction* audioElementActionsWatcher({\n element,\n room,\n}: {\n element: HTMLAudioElement\n room: VideoRoomSessionConnection\n}): SagaIterator {\n // TODO: For now we're handling individual actions but in the future\n // we might want to have a single action per custom saga and use it\n // in a similar fashion to `executeAction`\n const setSpeakerActionType = actions.getCustomSagaActionType(\n room.__uuid,\n audioSetSpeakerAction\n )\n\n while (true) {\n const action = yield sagaEffects.take([setSpeakerActionType])\n\n try {\n switch (action.type) {\n case setSpeakerActionType:\n const response = yield sagaEffects.call(\n setMediaElementSinkId,\n element,\n action.payload\n )\n\n room.emit(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n action.payload\n )\n\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: response,\n kind: 'resolve',\n })\n break\n }\n } catch (error) {\n room.settleCustomSagaTrigger({\n dispatchId: action.dispatchId,\n payload: error,\n kind: 'reject',\n })\n getLogger().error(error)\n }\n }\n}\n\nfunction* audioElementSetupWorker({\n track,\n element,\n speakerId,\n room,\n}: {\n track: MediaStreamTrack\n element: HTMLAudioElement\n speakerId?: string\n room: VideoRoomSessionConnection\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","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomsSubscribedEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomsWorker = function* (\n options: VideoManagerWorkerParams<\n MapToPubSubShape<VideoManagerRoomsSubscribedEvent>\n >\n): SagaIterator {\n getLogger().trace('videoManagerRoomsWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n const modPayload = {\n rooms: payload.rooms.map((row) => toExternalJSON(row)),\n }\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n // @ts-expect-error\n modPayload\n )\n\n getLogger().trace('videoManagerRoomsWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoManagerRoomEvent,\n toExternalJSON,\n VideoManagerRoomEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoManagerWorkerParams } from './videoManagerWorker'\n\nexport const videoManagerRoomWorker = function* (\n options: VideoManagerWorkerParams<MapToPubSubShape<VideoManagerRoomEvent>>\n): SagaIterator {\n getLogger().trace('videoManagerRoomWorker started')\n const {\n instance: client,\n action: { type, payload },\n } = options\n\n // For now we expose the transformed payload and not a RoomSession\n client.emit(\n stripNamespacePrefix(type) as VideoManagerRoomEventNames,\n toExternalJSON(payload)\n )\n\n getLogger().trace('videoManagerRoomWorker ended')\n}\n","import { getLogger, sagaEffects } from '@signalwire/core'\nimport type {\n SagaIterator,\n MapToPubSubShape,\n VideoManagerEvent,\n SDKWorker,\n SDKActions,\n SDKWorkerParams,\n} from '@signalwire/core'\nimport type { VideoManager } from '../VideoManager'\nimport { videoManagerRoomsWorker } from './videoManagerRoomsWorker'\nimport { videoManagerRoomWorker } from './videoManagerRoomWorker'\n\nexport type VideoManagerWorkerParams<T> = SDKWorkerParams<VideoManager> & {\n action: T\n}\n\nexport const videoManagerWorker: SDKWorker<VideoManager> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoManagerWorker started')\n const {\n channels: { swEventChannel },\n } = options\n\n function* worker(action: MapToPubSubShape<VideoManagerEvent>) {\n const { type } = action\n\n switch (type) {\n case 'video-manager.rooms.subscribed':\n yield sagaEffects.fork(videoManagerRoomsWorker, {\n action,\n ...options,\n })\n break\n case 'video-manager.room.added':\n case 'video-manager.room.deleted':\n case 'video-manager.room.ended':\n case 'video-manager.room.started':\n case 'video-manager.room.updated':\n yield sagaEffects.fork(videoManagerRoomWorker, {\n action,\n ...options,\n })\n break\n default:\n getLogger().warn(`Unknown video-manager event: \"${type}\"`)\n break\n }\n }\n\n while (true) {\n const action: MapToPubSubShape<VideoManagerEvent> = yield sagaEffects.take(\n swEventChannel,\n (action: SDKActions) => {\n return action.type.startsWith('video-manager.')\n }\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoManagerWorker ended')\n}\n","import {\n BaseComponentOptions,\n VideoManagerRoomEventNames,\n connect,\n ConsumerContract,\n validateEventsToSubscribe,\n EventEmitter,\n BaseConsumer,\n ToExternalJSONResult,\n VideoManagerRoomEventParams,\n InternalVideoManagerRoomEntity,\n RoomsSubscribed,\n} from '@signalwire/core'\nimport { videoManagerWorker } from './workers'\n\n/** @internal */\nexport type VideoManagerEvents = Record<\n VideoManagerRoomEventNames,\n (room: ToExternalJSONResult<VideoManagerRoomEventParams>) => void\n> &\n Record<\n RoomsSubscribed,\n (room: {\n rooms: ToExternalJSONResult<InternalVideoManagerRoomEntity>[]\n }) => void\n >\n\n/** @internal */\nexport interface VideoManager extends ConsumerContract<VideoManagerEvents> {}\n\n/** @internal */\nexport class VideoManagerAPI extends BaseConsumer<VideoManagerEvents> {\n constructor(options: BaseComponentOptions) {\n super(options)\n\n this.runWorker('videoManagerWorker', {\n worker: videoManagerWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map(\n (event) => `video-manager.${event}`\n ) as EventEmitter.EventNames<VideoManagerEvents>[]\n return validateEventsToSubscribe(eventNamesWithPrefix)\n }\n}\n\nexport const createVideoManagerObject = (params: BaseComponentOptions) => {\n const manager = connect<VideoManagerEvents, VideoManagerAPI, VideoManager>({\n store: params.store,\n Component: VideoManagerAPI,\n })(params)\n\n const proxy = new Proxy<VideoManager>(manager, {\n get(\n target: VideoManager,\n property: string | symbol,\n receiver: ProxyHandler<VideoManager>\n ) {\n if (property === '_eventsNamespace') {\n return ''\n } else if (property === 'eventChannel') {\n return 'video-manager.rooms'\n }\n\n return Reflect.get(target, property, receiver)\n },\n })\n return proxy\n}\n","export const SCREENSHARE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: false,\n autoGainControl: false,\n // @ts-expect-error\n googAutoGainControl: false,\n}\n","import { getLogger } from '@signalwire/core'\nimport type { VideoAuthorization } from '@signalwire/core'\nimport type { BaseRoomSessionJoinParams } from './interfaces'\n\ntype GetJoinMediaParamsOptions = BaseRoomSessionJoinParams & {\n authState: VideoAuthorization\n}\n/**\n * getJoinMediaParams returns whether the Join method must send/recv\n * audio and video.\n * Based on values on the Auth block (media allowed and join_as type)\n * it matches the user's preferences and return an object that tells\n * if the negotiation has to include sendrecv/sendonly or recvonly\n * for audio and video.\n */\nexport const getJoinMediaParams = (options: GetJoinMediaParamsOptions) => {\n const {\n authState,\n audio = true,\n video = true,\n sendAudio,\n sendVideo,\n receiveAudio,\n receiveVideo,\n } = options\n getLogger().debug('getJoinMediaParams options', { ...options })\n const { audio_allowed, video_allowed, join_as } = authState\n // Fallback to 'member' in case of null/undefined\n const joinAs = join_as ?? 'member'\n const canSend = joinAs === 'member'\n\n const canSendAudio = canSend && audio_allowed === 'both'\n const canSendVideo = canSend && video_allowed === 'both'\n const canReceiveAudio = audio_allowed !== 'none'\n const canReceiveVideo = video_allowed !== 'none'\n\n const reqToSendAudio = Boolean(sendAudio ?? audio)\n const reqToSendVideo = Boolean(sendVideo ?? video)\n const reqToReceiveAudio = Boolean(receiveAudio ?? audio)\n const reqToReceiveVideo = Boolean(receiveVideo ?? video)\n\n if (!canSendAudio && reqToSendAudio) {\n getLogger().info(\n 'Not allowed to send audio on this room. Default values will be used.'\n )\n }\n if (!canSendVideo && reqToSendVideo) {\n getLogger().info(\n 'Not allowed to send video on this room. Default values will be used.'\n )\n }\n if (!canReceiveAudio && reqToReceiveAudio) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n if (!canReceiveVideo && reqToReceiveVideo) {\n getLogger().info(\n 'Not allowed to receive video from the room. Default values will be used.'\n )\n }\n return {\n mustSendAudio: canSendAudio && reqToSendAudio,\n mustSendVideo: canSendVideo && reqToSendVideo,\n mustRecvAudio: canReceiveAudio && reqToReceiveAudio,\n mustRecvVideo: canReceiveVideo && reqToReceiveVideo,\n }\n}\n\nexport const checkMediaParams = (\n options: Record<string, boolean | undefined>\n) => {\n // At least one value must be true\n return Object.values(options).some(Boolean)\n}\n\nexport const SDK_PREFIX = 'sw-sdk-'\nexport const addSDKPrefix = (id: string) => {\n return `${SDK_PREFIX}${id}`\n}\n\nexport const OVERLAY_PREFIX = 'sw-overlay-'\nexport const addOverlayPrefix = (id: string) => {\n return `${OVERLAY_PREFIX}${id}`\n}\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomScreenShareMethods } from './utils/interfaces'\n\ntype RoomSessionScreenShareEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionScreenShare) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionScreenShareEvents = {\n [k in keyof RoomSessionScreenShareEventsHandlerMap]: RoomSessionScreenShareEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionScreenShare} instead */\nexport interface RoomScreenShare extends RoomSessionScreenShare {}\nexport interface RoomSessionScreenShare\n extends RoomScreenShareMethods,\n BaseConnectionContract<RoomSessionScreenShareEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionScreenShareEvents>['runWorker']\n}\n\nexport class RoomSessionScreenShareConnection extends BaseConnection<RoomSessionScreenShareEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * Represents a screen sharing.\n */\nexport const RoomSessionScreenShareAPI = extendComponent<\n RoomSessionScreenShareConnection,\n RoomScreenShareMethods\n>(RoomSessionScreenShareConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n sagaEffects,\n SagaIterator,\n SDKWorker,\n toSyntheticEvent,\n validateEventsToSubscribe,\n toInternalEventName,\n SwEventChannel,\n InternalVideoMemberEntity,\n InternalVideoMemberUpdatedEvent,\n VideoMemberJoinedEvent,\n VideoMemberLeftEvent,\n VideoMemberUpdatedEvent,\n InternalVideoRoomJoinedEvent,\n MapToPubSubShape,\n} from '@signalwire/core'\nimport type { VideoMemberListUpdatedParams } from '../../utils/interfaces'\nimport { VideoRoomSession } from '../VideoRoomSession'\n\nconst noop = () => {}\n\nconst EXTERNAL_MEMBER_LIST_UPDATED_EVENT = 'memberList.updated'\n\nconst INTERNAL_MEMBER_LIST_UPDATED_EVENT = toInternalEventName({\n event: EXTERNAL_MEMBER_LIST_UPDATED_EVENT,\n})\n\nconst SYNTHETIC_MEMBER_LIST_UPDATED_EVENT = toSyntheticEvent(\n INTERNAL_MEMBER_LIST_UPDATED_EVENT\n)\n\n/**\n * List of action types this worker cares about.\n */\ntype MemberListUpdatedTargetActions = MapToPubSubShape<\n | InternalVideoRoomJoinedEvent\n | InternalVideoMemberUpdatedEvent\n | VideoMemberJoinedEvent\n | VideoMemberLeftEvent\n | VideoMemberUpdatedEvent\n>\n\nconst MEMBER_LIST_EVENTS: Array<MemberListUpdatedTargetActions['type']> = [\n /** Alias to `video.room.subscribed` */\n 'video.room.joined',\n 'video.member.joined',\n 'video.member.left',\n 'video.member.updated',\n]\n\ntype MemberList = Map<string, InternalVideoMemberEntity>\n\nconst isMemberListEvent = (\n event: string\n): event is MemberListUpdatedTargetActions['type'] => {\n // @ts-expect-error\n return MEMBER_LIST_EVENTS.includes(event)\n}\n\nconst getMemberListEventsToSubscribe = (\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n return validateEventsToSubscribe(MEMBER_LIST_EVENTS).filter((event) => {\n return !subscriptions.includes(event)\n })\n}\n\nconst shouldHandleMemberList = (subscriptions: string[]) => {\n return subscriptions.some((event) =>\n event.includes(EXTERNAL_MEMBER_LIST_UPDATED_EVENT)\n )\n}\n\nconst getMembersFromAction = (action: MemberListUpdatedTargetActions) => {\n if (action.type === 'video.room.joined') {\n return action.payload.room_session.members\n }\n\n return [action.payload.member]\n}\n\nexport const getUpdatedMembers = ({\n action,\n memberList,\n}: {\n action: MemberListUpdatedTargetActions\n memberList: MemberList\n}) => {\n const actionMembers = getMembersFromAction(action)\n\n switch (action.type) {\n case 'video.member.left':\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.delete(member.id)\n })\n break\n default:\n actionMembers.forEach((member: InternalVideoMemberEntity) => {\n memberList.set(member.id, member)\n })\n }\n\n return Array.from(memberList.values())\n}\n\nconst initMemberListSubscriptions = (\n room: VideoRoomSession,\n subscriptions: MemberListUpdatedTargetActions['type'][]\n) => {\n const events = getMemberListEventsToSubscribe(subscriptions)\n\n events.forEach((event) => {\n /**\n * Params to `subscribe` come from the event handlers\n * the user has attached so to make sure we subscribe to\n * all the appropiate events needed for\n * `memberList.updated` to work, we must subscribe to\n * the required events. We don't need to act upon the\n * event (that's why we attach a `noop`), just to\n * register it (`subscribe` gets its values from\n * `BaseComponent.getSubscriptions`, which gets\n * populated by each of the event handlers the user\n * attached).\n */\n room.once(event as any, noop)\n })\n\n /**\n * This handler will act as a simple bridge between\n * synthetic events and external events.\n */\n const eventBridgeHandler = ({ members }: VideoMemberListUpdatedParams) => {\n room.emit(EXTERNAL_MEMBER_LIST_UPDATED_EVENT, { members })\n }\n\n // @ts-expect-error\n room.on(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n\n /**\n * Any events attached by the saga should be specified\n * here so it can be cleaned up when needed.\n */\n const cleanup = () => {\n // @ts-expect-error\n room.off(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, eventBridgeHandler)\n }\n\n return {\n cleanup,\n }\n}\n\nfunction* membersListUpdatedWatcher({\n swEventChannel,\n instance,\n}: {\n swEventChannel: SwEventChannel\n instance: any\n}): SagaIterator {\n const memberList: MemberList = new Map()\n\n function* worker(pubSubAction: MemberListUpdatedTargetActions) {\n const roomSessionId =\n pubSubAction.type === 'video.room.joined'\n ? pubSubAction.payload.room_session.id\n : pubSubAction.payload.room_session_id\n\n const members = getUpdatedMembers({ action: pubSubAction, memberList })\n const memberListPayload = {\n /**\n * At this point it's needed to send the\n * `room_session_id` so the pubSubSaga can properly\n * infer the namespace for emitting the events to the\n * appropiate room.\n */\n room_session_id: roomSessionId,\n members,\n }\n\n instance.emit(SYNTHETIC_MEMBER_LIST_UPDATED_EVENT, memberListPayload)\n }\n\n while (true) {\n const pubSubAction: MemberListUpdatedTargetActions = yield sagaEffects.take(\n swEventChannel,\n ({ type }: any) => {\n return isMemberListEvent(type)\n }\n )\n\n yield sagaEffects.fork(worker, pubSubAction)\n }\n}\n\nexport const memberListUpdatedWorker: SDKWorker<VideoRoomSession> =\n function* membersChangedWorker({\n channels: { swEventChannel },\n instance,\n }): SagaIterator {\n // @ts-expect-error\n const subscriptions = instance.getSubscriptions()\n\n if (!shouldHandleMemberList(subscriptions)) {\n return\n }\n\n const { cleanup } = initMemberListSubscriptions(instance, subscriptions)\n\n yield sagaEffects.fork(membersListUpdatedWatcher, {\n swEventChannel,\n instance,\n })\n\n instance.once('destroy', () => {\n cleanup()\n })\n }\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n VideoMemberJoinedEvent,\n componentSelectors,\n componentActions,\n type ReduxComponent,\n} from '@signalwire/core'\n\nimport type { BaseConnection } from '@signalwire/webrtc'\n\ntype ChildMemberJoinedWorkerOnDone = () => void\ntype ChildMemberJoinedWorkerOnFail = (args: { error: Error }) => void\n\nexport type ChildMemberJoinedWorkerHooks = SDKWorkerHooks<\n ChildMemberJoinedWorkerOnDone,\n ChildMemberJoinedWorkerOnFail\n>\n\nexport const childMemberJoinedWorker: SDKWorker<\n BaseConnection<any>,\n ChildMemberJoinedWorkerHooks\n> = function* (options): SagaIterator {\n getLogger().trace('childMemberJoinedWorker started')\n const { channels, instance, initialState, onDone, onFail } = options\n const { swEventChannel } = channels\n const { parentId } = initialState\n if (!parentId) {\n throw new Error('Missing parentId for childMemberJoinedWorker')\n }\n\n const action: MapToPubSubShape<VideoMemberJoinedEvent> =\n yield sagaEffects.take(swEventChannel, (action: SDKActions) => {\n if (action.type === 'video.member.joined') {\n return action.payload.member.parent_id === parentId\n }\n return false\n })\n\n /**\n * On video.member.joined with a parent_id, check if we are the\n * owner of the object comparing parent_id in the state.\n * If so update the state with the room values to update the\n * object.\n */\n const { member } = action.payload\n if (member?.parent_id) {\n const byId: Record<string, ReduxComponent> = yield sagaEffects.select(\n componentSelectors.getComponentsById\n )\n const parent = Object.values(byId).find((row) => {\n return 'memberId' in row && row.memberId === member.parent_id\n })\n if (parent) {\n yield sagaEffects.put(\n componentActions.upsert({\n id: instance.callId,\n roomId: action.payload.room_id,\n roomSessionId: action.payload.room_session_id,\n memberId: member.id,\n })\n )\n\n onDone?.()\n } else {\n onFail?.({ error: new Error('Unknown parent_id') })\n }\n }\n getLogger().trace('childMemberJoinedWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n VideoStreamEvent,\n RoomSessionStream,\n Rooms,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoStreamWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoStreamEvent>>\n): SagaIterator {\n getLogger().trace('videoStreamWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let streamInstance = get<RoomSessionStream>(payload.stream.id)\n if (!streamInstance) {\n streamInstance = Rooms.createRoomSessionStreamObject({\n store: roomSession.store,\n payload,\n })\n } else {\n streamInstance.setPayload(payload)\n }\n set<RoomSessionStream>(payload.stream.id, streamInstance)\n\n switch (type) {\n case 'video.stream.started':\n roomSession.emit('stream.started', streamInstance)\n break\n case 'video.stream.ended':\n roomSession.emit('stream.ended', streamInstance)\n remove<RoomSessionStream>(payload.stream.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoStreamWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionRecording,\n Rooms,\n VideoRecordingEvent,\n VideoRecordingEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoRecordWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoRecordingEvent>>\n): SagaIterator {\n getLogger().trace('videoRecordWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let recordingInstance = get<RoomSessionRecording>(payload.recording.id)\n if (!recordingInstance) {\n recordingInstance = Rooms.createRoomSessionRecordingObject({\n store: roomSession.store,\n payload,\n })\n } else {\n recordingInstance.setPayload(payload)\n }\n set<RoomSessionRecording>(payload.recording.id, recordingInstance)\n\n const event = stripNamespacePrefix(type) as VideoRecordingEventNames\n\n switch (type) {\n case 'video.recording.started':\n case 'video.recording.updated': {\n roomSession.emit(event, recordingInstance)\n break\n }\n case 'video.recording.ended':\n roomSession.emit(event, recordingInstance)\n remove<RoomSessionRecording>(payload.recording.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoRecordWorker ended')\n}\n","import {\n getLogger,\n SagaIterator,\n MapToPubSubShape,\n RoomSessionPlayback,\n Rooms,\n VideoPlaybackEvent,\n VideoPlaybackEventNames,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport { VideoWorkerParams } from './videoWorker'\n\nexport const videoPlaybackWorker = function* (\n options: VideoWorkerParams<MapToPubSubShape<VideoPlaybackEvent>>\n): SagaIterator {\n getLogger().trace('videoPlaybackWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n // For now, we are not storing the RoomSession object in the instance map\n\n let playbackInstance = get<RoomSessionPlayback>(payload.playback.id)\n if (!playbackInstance) {\n playbackInstance = Rooms.createRoomSessionPlaybackObject({\n store: roomSession.store,\n payload,\n })\n } else {\n playbackInstance.setPayload(payload)\n }\n set<RoomSessionPlayback>(payload.playback.id, playbackInstance)\n\n const event = stripNamespacePrefix(type) as VideoPlaybackEventNames\n\n switch (type) {\n case 'video.playback.started':\n case 'video.playback.updated': {\n roomSession.emit(event, playbackInstance)\n break\n }\n case 'video.playback.ended':\n roomSession.emit(event, playbackInstance)\n remove<RoomSessionPlayback>(payload.playback.id)\n break\n default:\n getLogger().warn(`Unknown video.stream event: \"${type}\"`)\n break\n }\n\n getLogger().trace('videoPlaybackWorker ended')\n}\n","import {\n SDKActions,\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n MemberPosition,\n stripNamespacePrefix,\n VideoAction,\n VideoRoomDeviceEventNames,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { videoStreamWorker } from './videoStreamWorker'\nimport { videoRecordWorker } from './videoRecordWorker'\nimport { videoPlaybackWorker } from './videoPlaybackWorker'\nimport { VideoRoomSessionConnection } from '../VideoRoomSession'\nimport { MediaEventNames } from '@signalwire/webrtc'\n\nexport type VideoWorkerParams<T> =\n SDKWorkerParams<VideoRoomSessionConnection> & {\n action: T\n }\n\nexport const videoWorker: SDKWorker<VideoRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('videoWorker started')\n\n const { channels, instance: roomSession } = options\n const { swEventChannel } = channels\n\n function* worker(action: VideoAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'video.room.subscribed':\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n instance: roomSession,\n initialState: payload,\n })\n return\n case 'video.playback.started':\n case 'video.playback.updated':\n case 'video.playback.ended':\n yield sagaEffects.fork(videoPlaybackWorker, {\n action,\n ...options,\n })\n return // Return since we don't need to handle the raw event for this\n case 'video.recording.started':\n case 'video.recording.updated':\n case 'video.recording.ended':\n yield sagaEffects.fork(videoRecordWorker, {\n action,\n ...options,\n })\n return\n case 'video.stream.ended':\n case 'video.stream.started':\n yield sagaEffects.fork(videoStreamWorker, {\n action,\n ...options,\n })\n return\n case 'video.room.audience_count': {\n roomSession.emit('room.audienceCount', payload)\n return\n }\n case 'video.member.talking': {\n const { member } = payload\n if ('talking' in member) {\n const suffix = member.talking ? 'started' : 'ended'\n roomSession.emit(`member.talking.${suffix}`, payload)\n\n // Keep for backwards compat.\n const deprecatedSuffix = member.talking ? 'start' : 'stop'\n roomSession.emit(`member.talking.${deprecatedSuffix}`, payload)\n }\n break // Break here since we do need the raw event sent to the client\n }\n case 'video.layout.changed': {\n // Upsert the layout event which is needed for buildVideoElement\n roomSession.currentLayoutEvent = action.payload\n break\n }\n default:\n break\n }\n\n const event = stripNamespacePrefix(type, 'video') as\n | VideoRoomDeviceEventNames\n | MediaEventNames\n | BaseConnectionState\n roomSession.emit(event, payload)\n }\n\n const isVideoEvent = (action: SDKActions) => {\n return action.type.startsWith('video.')\n }\n\n while (true) {\n const action: VideoAction = yield sagaEffects.take(\n swEventChannel,\n isVideoEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('videoWorker ended')\n}\n","import {\n BaseComponentContract,\n BaseConnectionState,\n connect,\n EventEmitter,\n LOCAL_EVENT_PREFIX,\n} from '@signalwire/core'\nimport {\n BaseConnection,\n BaseConnectionOptions,\n createSpeakerDeviceWatcher,\n getDisplayMedia,\n getSpeakerById,\n supportsMediaOutput,\n MediaEventNames,\n} from '@signalwire/webrtc'\nimport { LocalVideoOverlay, OverlayMap } from './VideoOverlays'\nimport {\n AudioElement,\n BaseRoomSessionContract,\n StartScreenShareOptions,\n} from './utils/interfaces'\nimport { SCREENSHARE_AUDIO_CONSTRAINTS } from './utils/constants'\nimport { addOverlayPrefix } from './utils/roomSession'\nimport { audioSetSpeakerAction } from './features/actions'\nimport {\n RoomSessionScreenShare,\n RoomSessionScreenShareAPI,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShareEvents,\n} from './RoomSessionScreenShare'\nimport * as workers from './video/workers'\n\nexport interface BaseRoomSession<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n> extends BaseRoomSessionContract,\n BaseConnection<EventTypes>,\n BaseComponentContract {}\n\nexport interface BaseRoomSessionOptions extends BaseConnectionOptions {}\n\nexport class BaseRoomSessionConnection<\n EventTypes extends EventEmitter.ValidEventTypes = BaseRoomSessionEvents\n >\n extends BaseConnection<EventTypes>\n implements BaseRoomSessionContract\n{\n private _screenShareList = new Set<RoomSessionScreenShare>()\n private _audioEl: AudioElement\n private _overlayMap: OverlayMap\n private _localVideoOverlay: LocalVideoOverlay\n\n get audioEl() {\n return this._audioEl\n }\n\n set overlayMap(map: OverlayMap) {\n this._overlayMap = map\n }\n\n get overlayMap() {\n return this._overlayMap\n }\n\n set localVideoOverlay(overlay: LocalVideoOverlay) {\n this._localVideoOverlay = overlay\n }\n\n get localVideoOverlay() {\n return this._localVideoOverlay\n }\n\n get screenShareList() {\n return Array.from(this._screenShareList)\n }\n\n private _attachSpeakerTrackListener() {\n if (!supportsMediaOutput()) return\n\n // @TODO: Stop the watcher when user leave/disconnects\n createSpeakerDeviceWatcher().then((deviceWatcher) => {\n deviceWatcher.on('removed', async (data) => {\n const sinkId = this._audioEl.sinkId\n const disconnectedSpeaker = data.changes.find((device) => {\n const payloadDeviceId = device.payload.deviceId\n\n return (\n payloadDeviceId === sinkId ||\n (payloadDeviceId === '' && sinkId === 'default') ||\n (payloadDeviceId === 'default' && sinkId === '')\n )\n })\n if (disconnectedSpeaker) {\n this.emit('speaker.disconnected', {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n })\n\n /**\n * In case the currently in-use speaker disconnects, OS by default fallbacks to the default speaker\n * Set the sink id here to make the SDK consistent with the OS\n */\n await this._audioEl.setSinkId?.('')\n\n const defaultSpeakers = await getSpeakerById('default')\n\n if (!defaultSpeakers?.deviceId) return\n\n // Emit the speaker.updated event since the OS will fallback to the default speaker\n this.emit('speaker.updated', {\n previous: {\n deviceId: disconnectedSpeaker.payload.deviceId,\n label: disconnectedSpeaker.payload.label,\n },\n current: {\n deviceId: defaultSpeakers.deviceId,\n label: defaultSpeakers.label,\n },\n })\n }\n })\n })\n }\n\n /** @internal */\n protected override _finalize() {\n this._screenShareList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._screenShareList.forEach((screenShare) => {\n screenShare.leave()\n })\n\n return super.hangup(id)\n }\n\n leave() {\n return this.hangup()\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 attachPreConnectWorkers() {\n this.runWorker('memberListUpdated', {\n worker: workers.memberListUpdatedWorker,\n })\n }\n\n /** @internal */\n getAudioEl() {\n if (this._audioEl) return this._audioEl\n this._audioEl = new Audio()\n this._attachSpeakerTrackListener()\n return this._audioEl\n }\n\n getMemberOverlay(memberId: string) {\n return this.overlayMap.get(addOverlayPrefix(memberId))\n }\n\n /**\n * Allow sharing the screen within the room.\n */\n async startScreenShare(opts: StartScreenShareOptions = {}) {\n return new Promise<RoomSessionScreenShare>(async (resolve, reject) => {\n const {\n autoJoin = true,\n audio = false,\n video = true,\n layout,\n positions,\n } = opts\n try {\n const displayStream: MediaStream = await getDisplayMedia({\n audio: audio === true ? SCREENSHARE_AUDIO_CONSTRAINTS : audio,\n video,\n })\n const options: BaseConnectionOptions = {\n ...this.options,\n screenShare: true,\n recoverCall: false,\n localStream: displayStream,\n remoteStream: undefined,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n layout,\n positions,\n }\n\n const screenShare = connect<\n RoomSessionScreenShareEvents,\n RoomSessionScreenShareConnection,\n RoomSessionScreenShare\n >({\n store: this.store,\n Component: RoomSessionScreenShareAPI,\n })(options)\n\n /**\n * Hangup if the user stop the screenShare from the\n * native browser button or if the videoTrack ends.\n */\n displayStream.getVideoTracks().forEach((t) => {\n t.addEventListener('ended', () => {\n if (screenShare && screenShare.active) {\n screenShare.leave()\n }\n })\n })\n\n screenShare.once('destroy', () => {\n screenShare.emit('room.left')\n this._screenShareList.delete(screenShare)\n })\n\n screenShare.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(screenShare),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._screenShareList.add(screenShare)\n if (autoJoin) {\n return await screenShare.join()\n }\n return resolve(screenShare)\n } catch (error) {\n this.logger.error('ScreenShare Error', error)\n reject(error)\n }\n })\n }\n\n updateSpeaker({ deviceId }: { deviceId: string }) {\n const prevId = this.audioEl.sinkId as string\n this.once(\n // @ts-expect-error\n `${LOCAL_EVENT_PREFIX}.speaker.updated`,\n async (newId: string) => {\n const prevSpeaker = await getSpeakerById(prevId)\n const newSpeaker = await getSpeakerById(newId)\n\n const isSame = newSpeaker?.deviceId === prevSpeaker?.deviceId\n if (!newSpeaker?.deviceId || isSame) return\n\n this.emit('speaker.updated', {\n previous: {\n deviceId: prevSpeaker?.deviceId,\n label: prevSpeaker?.label,\n },\n current: {\n deviceId: newSpeaker.deviceId,\n label: newSpeaker.label,\n },\n })\n }\n )\n\n return this.triggerCustomSaga<undefined>(audioSetSpeakerAction(deviceId))\n }\n}\n\ntype BaseRoomSessionEventsHandlerMap = Record<\n BaseConnectionState,\n (params: BaseRoomSession<BaseRoomSessionEvents>) => void\n> &\n Record<MediaEventNames, () => void>\n\nexport type BaseRoomSessionEvents = {\n [k in keyof BaseRoomSessionEventsHandlerMap]: BaseRoomSessionEventsHandlerMap[k]\n}\n\n/** @internal */\nexport const createBaseRoomSessionObject = (\n params: BaseRoomSessionOptions\n): BaseRoomSession<BaseRoomSessionEvents> => {\n const room = connect<\n BaseRoomSessionEvents,\n BaseRoomSessionConnection<BaseRoomSessionEvents>,\n BaseRoomSession<BaseRoomSessionEvents>\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: BaseRoomSessionConnection,\n })(params)\n\n return room\n}\n","import {\n Rooms,\n extendComponent,\n BaseConnectionContract,\n RoomLeft,\n RoomLeftEventParams,\n BaseConnectionState,\n} from '@signalwire/core'\nimport { BaseConnection, MediaEventNames } from '@signalwire/webrtc'\nimport { RoomSessionDeviceMethods } from './utils/interfaces'\n\ntype RoomSessionDeviceEventsHandlerMap = Record<\n BaseConnectionState,\n (params: RoomSessionDevice) => void\n> &\n Record<RoomLeft, (params?: RoomLeftEventParams) => void> &\n Record<MediaEventNames, () => void>\n\nexport type RoomSessionDeviceEvents = {\n [k in keyof RoomSessionDeviceEventsHandlerMap]: RoomSessionDeviceEventsHandlerMap[k]\n}\n\n/** @deprecated Use {@link RoomSessionDevice} instead */\nexport interface RoomDevice extends RoomSessionDevice {}\nexport interface RoomSessionDevice\n extends RoomSessionDeviceMethods,\n BaseConnectionContract<RoomSessionDeviceEvents> {\n join(): Promise<void>\n leave(): Promise<void>\n /** @internal */\n runWorker: BaseConnection<RoomSessionDeviceEvents>['runWorker']\n}\n\nexport class RoomSessionDeviceConnection extends BaseConnection<RoomSessionDeviceEvents> {\n join() {\n return super.invite()\n }\n\n leave() {\n return super.hangup()\n }\n}\n\n/**\n * A RoomSessionDevice represents a device (such as a microphone or a camera)\n * that is at some point in its lifetime part of a {@link RoomSession}. You can\n * obtain a RoomSessionDevice from the {@link RoomSession} methods\n * {@link RoomSession.addCamera}, {@link RoomSession.addMicrophone}, and\n * {@link RoomSession.addDevice}.\n */\nexport const RoomSessionDeviceAPI = extendComponent<\n RoomSessionDeviceConnection,\n RoomSessionDeviceMethods\n>(RoomSessionDeviceConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n})\n","import {\n BaseComponentContract,\n BaseConnectionContract,\n connect,\n EventEmitter,\n extendComponent,\n Rooms,\n validateEventsToSubscribe,\n VideoAuthorization,\n VideoLayoutChangedEventParams,\n} from '@signalwire/core'\nimport { BaseConnectionOptions } from '@signalwire/webrtc'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n RoomSessionDevice,\n RoomSessionDeviceAPI,\n RoomSessionDeviceConnection,\n RoomSessionDeviceEvents,\n} from '../RoomSessionDevice'\nimport * as workers from './workers'\nimport {\n AddCameraOptions,\n AddDeviceOptions,\n AddMicrophoneOptions,\n CreateScreenShareObjectOptions,\n VideoRoomSessionMethods,\n VideoRoomSessionEvents,\n VideoRoomSessionContract,\n BaseRoomSessionContract,\n} from '../utils/interfaces'\n\nexport interface VideoRoomSession\n extends VideoRoomSessionContract,\n VideoRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<VideoRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface VideoRoomSessionOptions extends BaseRoomSessionOptions {}\n\nexport class VideoRoomSessionConnection\n extends BaseRoomSessionConnection<VideoRoomSessionEvents>\n implements VideoRoomSessionContract\n{\n private _deviceList = new Set<RoomSessionDevice>()\n private _currentLayoutEvent: VideoLayoutChangedEventParams\n\n constructor(options: VideoRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n set currentLayoutEvent(event: VideoLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get deviceList() {\n return Array.from(this._deviceList)\n }\n\n get interactivityMode() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.join_as ?? ''\n })\n }\n\n get permissions() {\n return this.select(({ session }) => {\n const { authState } = session\n return (authState as VideoAuthorization)?.room?.scopes ?? []\n })\n }\n\n private initWorker() {\n this.runWorker('videoWorker', {\n worker: workers.videoWorker,\n })\n }\n\n /** @internal */\n protected override getSubscriptions() {\n const eventNamesWithPrefix = this.eventNames().map((event) => {\n return `video.${String(event)}`\n })\n return validateEventsToSubscribe(\n eventNamesWithPrefix\n ) as EventEmitter.EventNames<{}>[]\n }\n\n /** @internal */\n protected _finalize() {\n this._deviceList.clear()\n\n super._finalize()\n }\n\n /** @internal */\n override async hangup(id?: string) {\n this._deviceList.forEach((device) => {\n device.leave()\n })\n\n return super.hangup(id)\n }\n\n join() {\n return super.invite<VideoRoomSession>()\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 /** @deprecated Use {@link startScreenShare} instead. */\n async createScreenShareObject(opts: CreateScreenShareObjectOptions = {}) {\n return this.startScreenShare(opts)\n }\n\n /**\n * Allow to add a camera to the room.\n */\n addCamera(opts: AddCameraOptions = {}) {\n const { autoJoin = true, ...video } = opts\n return this.addDevice({\n autoJoin,\n video,\n })\n }\n\n /**\n * Allow to add a microphone to the room.\n */\n addMicrophone(opts: AddMicrophoneOptions = {}) {\n const { autoJoin = true, ...audio } = opts\n return this.addDevice({\n autoJoin,\n audio,\n })\n }\n\n /**\n * Allow to add additional devices to the room like cameras or microphones.\n */\n async addDevice(opts: AddDeviceOptions = {}) {\n return new Promise<RoomSessionDevice>(async (resolve, reject) => {\n const { autoJoin = true, audio = false, video = false } = opts\n if (!audio && !video) {\n throw new TypeError(\n 'At least one of `audio` or `video` must be requested.'\n )\n }\n\n const options: BaseConnectionOptions = {\n ...this.options,\n localStream: undefined,\n remoteStream: undefined,\n audio,\n video,\n additionalDevice: true,\n recoverCall: false,\n userVariables: {\n ...(this.options?.userVariables || {}),\n memberCallId: this.callId,\n memberId: this.memberId,\n },\n }\n\n const roomDevice = connect<\n RoomSessionDeviceEvents,\n RoomSessionDeviceConnection,\n RoomSessionDevice\n >({\n store: this.store,\n Component: RoomSessionDeviceAPI,\n })(options)\n\n roomDevice.once('destroy', () => {\n roomDevice.emit('room.left')\n this._deviceList.delete(roomDevice)\n })\n\n try {\n roomDevice.runWorker('childMemberJoinedWorker', {\n worker: workers.childMemberJoinedWorker,\n onDone: () => resolve(roomDevice),\n onFail: reject,\n initialState: {\n parentId: this.memberId,\n },\n })\n\n this._deviceList.add(roomDevice)\n if (autoJoin) {\n return await roomDevice.join()\n }\n return resolve(roomDevice)\n } catch (error) {\n this.logger.error('RoomDevice Error', error)\n reject(error)\n }\n })\n }\n}\n\nexport const VideoRoomSessionAPI = extendComponent<\n VideoRoomSessionConnection,\n VideoRoomSessionMethods\n>(VideoRoomSessionConnection, {\n audioMute: Rooms.audioMuteMember,\n audioUnmute: Rooms.audioUnmuteMember,\n videoMute: Rooms.videoMuteMember,\n videoUnmute: Rooms.videoUnmuteMember,\n deaf: Rooms.deafMember,\n undeaf: Rooms.undeafMember,\n setInputVolume: Rooms.setInputVolumeMember,\n setOutputVolume: Rooms.setOutputVolumeMember,\n setMicrophoneVolume: Rooms.setInputVolumeMember,\n setSpeakerVolume: Rooms.setOutputVolumeMember,\n setInputSensitivity: Rooms.setInputSensitivityMember,\n removeMember: Rooms.removeMember,\n removeAllMembers: Rooms.removeAllMembers,\n getMembers: Rooms.getMembers,\n getLayouts: Rooms.getLayouts,\n setLayout: Rooms.setLayout,\n setPositions: Rooms.setPositions,\n setMemberPosition: Rooms.setMemberPosition,\n hideVideoMuted: Rooms.hideVideoMuted,\n showVideoMuted: Rooms.showVideoMuted,\n getRecordings: Rooms.getRecordings,\n startRecording: Rooms.startRecording,\n getPlaybacks: Rooms.getPlaybacks,\n play: Rooms.play,\n setHideVideoMuted: Rooms.setHideVideoMuted,\n getMeta: Rooms.getMeta,\n setMeta: Rooms.setMeta,\n updateMeta: Rooms.updateMeta,\n deleteMeta: Rooms.deleteMeta,\n getMemberMeta: Rooms.getMemberMeta,\n setMemberMeta: Rooms.setMemberMeta,\n updateMemberMeta: Rooms.updateMemberMeta,\n deleteMemberMeta: Rooms.deleteMemberMeta,\n promote: Rooms.promote,\n demote: Rooms.demote,\n getStreams: Rooms.getStreams,\n startStream: Rooms.startStream,\n lock: Rooms.lock,\n unlock: Rooms.unlock,\n setRaisedHand: Rooms.setRaisedHand,\n setPrioritizeHandraise: Rooms.setPrioritizeHandraise,\n})\n\nexport const isVideoRoomSession = (room: unknown): room is VideoRoomSession => {\n return room instanceof VideoRoomSessionConnection\n}\n\n/** @internal */\nexport const createVideoRoomSessionObject = (\n params: VideoRoomSessionOptions\n): VideoRoomSession => {\n const room = connect<\n VideoRoomSessionEvents,\n VideoRoomSessionConnection,\n VideoRoomSession\n >({\n store: params.store,\n customSagas: params.customSagas,\n Component: VideoRoomSessionAPI,\n })(params)\n\n return room\n}\n","function e(e){this.message=e}e.prototype=new Error,e.prototype.name=\"InvalidCharacterError\";var r=\"undefined\"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,\"\");if(t.length%4==1)throw new e(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var n,o,a=0,i=0,c=\"\";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(o);return c};function t(e){var t=e.replace(/-/g,\"+\").replace(/_/g,\"/\");switch(t.length%4){case 0:break;case 2:t+=\"==\";break;case 3:t+=\"=\";break;default:throw\"Illegal base64url string!\"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t=\"0\"+t),\"%\"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if(\"string\"!=typeof e)throw new n(\"Invalid token specified\");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(\".\")[o]))}catch(e){throw new n(\"Invalid token specified: \"+e.message)}}n.prototype=new Error,n.prototype.name=\"InvalidTokenError\";export default o;export{n as InvalidTokenError};\n//# sourceMappingURL=jwt-decode.esm.js.map\n","import jwtDecode from 'jwt-decode'\nimport { getLogger } from '@signalwire/core'\n\n/**\n * Note: ready to support RN with a \"storage.native.ts\" file.\n */\nexport const getStorage = () => {\n if (window && window.sessionStorage) {\n return window.sessionStorage\n }\n return undefined\n}\n\nexport const sessionStorageManager = (token: string) => {\n let roomName: string = ''\n try {\n const jwtPayload = jwtDecode<{ r: string; ja: string }>(token)\n roomName = jwtPayload?.r ?? ''\n } catch (e) {\n try {\n const jwtPayload = jwtDecode<{ typ: string}>(token, {header: true})\n roomName = jwtPayload.typ || ''\n } catch {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().error('[sessionStorageManager] error decoding JWT', token)\n }\n roomName = ''\n }\n }\n\n const valid = Boolean(roomName)\n return {\n authStateKey: valid && `as-${roomName}`,\n protocolKey: valid && `pt-${roomName}`,\n callIdKey: valid && `ci-${roomName}`,\n }\n}\n","export const PREVIOUS_CALLID_STORAGE_KEY = 'ci-SAT';","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n SDKWorkerHooks,\n WebRTCMessageParams,\n} from '@signalwire/core'\nimport { WSClient } from '../WSClient'\n\ntype WSClientWorkerOnDone = () => void\ntype WSClientWorkerOnFail = (args: { error: Error }) => void\n\nexport type WSClientWorkerHooks = SDKWorkerHooks<\n WSClientWorkerOnDone,\n WSClientWorkerOnFail\n>\n\nexport const wsClientWorker: SDKWorker<WSClient, WSClientWorkerHooks> =\n function* (options): SagaIterator {\n getLogger().debug('wsClientWorker started')\n const { channels, initialState, instance: client } = options\n const { swEventChannel } = channels\n const { handleIncomingInvite } = initialState\n\n function* fireHoseWorker(action: SDKActions) {\n // @ts-expect-error Emit all events - This is for internal usage\n client.emit(action.type, action.payload)\n }\n\n function* vertoInviteWorker(action: MapToPubSubShape<WebRTCMessageParams>) {\n // Invoke WSClient function to build and answer the invite\n handleIncomingInvite(action.payload.params)\n }\n\n const isVertoInvite = (action: SDKActions) => {\n if (action.type === 'webrtc.message') {\n return action.payload.method === 'verto.invite'\n }\n return false\n }\n\n try {\n while (true) {\n // Take all actions from the channel\n const action: SDKActions = yield sagaEffects.take(\n swEventChannel,\n () => true\n )\n\n // Fire all the events with fireHoseWorker\n yield sagaEffects.fork(fireHoseWorker, action)\n\n // If the event is verto.invite, handle that with vertoInviteWorker\n if (isVertoInvite(action)) {\n getLogger().debug('Receiving a call over WebSocket', action)\n yield sagaEffects.fork(\n vertoInviteWorker,\n action as MapToPubSubShape<WebRTCMessageParams>\n )\n }\n }\n } finally {\n getLogger().trace('wsClientWorker ended')\n }\n }\n","import {\n getLogger,\n sagaEffects,\n SagaIterator,\n SDKWorker,\n SDKActions,\n MapToPubSubShape,\n ConversationEvent,\n} from '@signalwire/core'\nimport { Conversation } from '../Conversation'\nimport { WSClient } from '../WSClient'\n\ninterface ConversationWorkerInitialState {\n conversation: Conversation\n}\n\nexport const conversationWorker: SDKWorker<WSClient> = function* (\n options\n): SagaIterator {\n getLogger().debug('conversationWorker started')\n const {\n channels: { swEventChannel },\n initialState,\n } = options\n\n const { conversation } = initialState as ConversationWorkerInitialState\n\n const isConversationEvent = (action: SDKActions) => {\n return action.type.startsWith('conversation.')\n }\n\n while (true) {\n const action: MapToPubSubShape<ConversationEvent> = yield sagaEffects.take(\n swEventChannel,\n isConversationEvent\n )\n conversation.handleEvent(action.payload)\n }\n\n getLogger().trace('conversationWorker ended')\n}\n","import {\n FabricMemberEventNames,\n FabricMemberEventParams,\n FabricMemberEventParamsExcludeTalking,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEventParams,\n FabricMemberContract,\n connect,\n MemberJoined,\n MemberLeft,\n MemberTalking,\n MemberUpdated,\n BaseComponentOptionsWithPayload,\n BaseComponent,\n} from '@signalwire/core'\n\nexport interface FabricRoomSessionMember extends FabricMemberContract {\n /** Unique id of this member. */\n id: string\n setPayload(payload: FabricMemberEventParams): void\n}\n\n// TODO: Fabric Room Session Member instance does not emit any events yet\nexport type FabricRoomSessionMemberEventsHandlerMap = Record<\n MemberJoined,\n (params: FabricMemberJoinedEventParams) => void\n> &\n Record<MemberUpdated, (params: FabricMemberUpdatedEventParams) => void> &\n Record<MemberLeft, (params: FabricMemberLeftEventParams) => void> &\n Record<MemberTalking, (params: FabricMemberTalkingEventParams) => void> &\n Record<\n Exclude<FabricMemberEventNames, MemberJoined | MemberLeft | MemberTalking>,\n (params: FabricMemberUpdatedEventParams) => void\n >\n\nexport type FabricRoomSessionMemberEvents = {\n [k in keyof FabricRoomSessionMemberEventsHandlerMap]: FabricRoomSessionMemberEventsHandlerMap[k]\n}\n\nexport interface FabricRoomSessionMemberOptions\n extends BaseComponentOptionsWithPayload<FabricMemberEventParamsExcludeTalking> {}\n\nexport class FabricRoomSessionMemberAPI\n extends BaseComponent<FabricRoomSessionMemberEvents>\n implements FabricMemberContract\n{\n private _payload: FabricMemberEventParamsExcludeTalking\n\n constructor(options: FabricRoomSessionMemberOptions) {\n super(options)\n this._payload = options.payload\n }\n\n get id() {\n return this._payload.member.member_id\n }\n\n get callId() {\n return this._payload.member.call_id\n }\n\n get nodeId() {\n return this._payload.member.node_id\n }\n\n get memberId() {\n return this.id\n }\n\n get roomSessionId() {\n return this._payload.room_session_id\n }\n\n get roomId() {\n return this._payload.room_id\n }\n\n get parentId() {\n return this._payload.member.parent_id\n }\n\n get name() {\n return this._payload.member.name\n }\n\n get type() {\n return this._payload.member.type\n }\n\n get requestedPosition() {\n return this._payload.member.requested_position\n }\n\n get currentPosition() {\n return this._payload.member.current_position\n }\n\n get meta() {\n return this._payload.member.meta\n }\n\n get handraised() {\n return this._payload.member.handraised\n }\n\n get talking() {\n return this._payload.member.talking\n }\n\n get audioMuted() {\n return this._payload.member.audio_muted\n }\n\n get videoMuted() {\n return this._payload.member.video_muted\n }\n\n get deaf() {\n return this._payload.member.deaf\n }\n\n get visible() {\n return this._payload.member.visible\n }\n\n get inputVolume() {\n return this._payload.member.input_volume\n }\n\n get outputVolume() {\n return this._payload.member.output_volume\n }\n\n get inputSensitivity() {\n return this._payload.member.input_sensitivity\n }\n\n get subscriberData() {\n return this._payload.member.subscriber_data\n }\n\n /** @internal */\n setPayload(payload: FabricMemberEventParams) {\n // Reshape the payload since the `member.talking` event does not return all the parameters of a member\n const newPayload = {\n ...this._payload,\n ...payload,\n member: {\n ...this._payload.member,\n ...payload.member,\n },\n }\n this._payload = newPayload\n }\n}\n\nexport const createFabricRoomSessionMemberObject = (\n params: FabricRoomSessionMemberOptions\n): FabricRoomSessionMember => {\n const member = connect<\n FabricRoomSessionMemberEventsHandlerMap,\n FabricRoomSessionMemberAPI,\n FabricRoomSessionMember\n >({\n store: params.store,\n Component: FabricRoomSessionMemberAPI,\n })(params)\n\n return member\n}\n","import { getLogger, SagaIterator, CallLeftEvent } from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { FabricRoomSessionMemberAPI } from '../FabricRoomSessionMember'\n\nexport const callLeftWorker = function* (\n options: FabricWorkerParams<CallLeftEvent>\n): SagaIterator {\n getLogger().trace('callLeftWorker started')\n\n const {\n action: { payload },\n instance: cfRoomSession,\n instanceMap,\n } = options\n\n const { room_session_id } = payload\n\n // Remove all the member instance where roomSessionId matches\n instanceMap.getAll().forEach(([key, obj]) => {\n if (\n obj instanceof FabricRoomSessionMemberAPI &&\n obj.roomSessionId === room_session_id\n ) {\n instanceMap.remove(key)\n }\n })\n\n cfRoomSession.emit('call.left', payload)\n cfRoomSession.emit('room.left', payload)\n\n getLogger().trace('callLeftWorker ended')\n}\n","import {\n FabricMemberEvent,\n FabricMemberUpdatedEventParams,\n MemberUpdatedEventNames,\n SagaIterator,\n fromSnakeToCamelCase,\n getLogger,\n} from '@signalwire/core'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\n\nexport const fabricMemberWorker = function* (\n options: FabricWorkerParams<FabricMemberEvent>\n): SagaIterator {\n getLogger().trace('fabricMemberWorker started')\n const {\n instance: roomSession,\n action: { type, payload },\n instanceMap: { get, set, remove },\n } = options\n\n const memberId = payload.member.member_id\n let memberInstance = get<FabricRoomSessionMember>(memberId)\n if (!memberInstance && type !== 'member.talking') {\n memberInstance = createFabricRoomSessionMemberObject({\n store: roomSession.store,\n payload: payload,\n })\n }\n if (memberInstance) {\n memberInstance.setPayload(payload)\n }\n set<FabricRoomSessionMember>(memberId, memberInstance)\n\n if (type.startsWith('member.updated.')) {\n const clientType = fromSnakeToCamelCase(type) as MemberUpdatedEventNames\n roomSession.emit(clientType, payload as FabricMemberUpdatedEventParams)\n }\n\n switch (type) {\n case 'member.joined':\n roomSession.emit(type, payload)\n break\n case 'member.updated':\n roomSession.emit(type, payload)\n break\n case 'member.left':\n roomSession.emit(type, payload)\n remove<FabricRoomSessionMember>(memberId)\n break\n case 'member.talking':\n roomSession.emit(type, payload)\n break\n default:\n break\n }\n\n getLogger().trace('fabricMemberWorker ended')\n}\n","import {\n CallJoinedEvent,\n CallJoinedEventParams,\n CallUpdatedEvent,\n CallUpdatedEventParams,\n FabricLayoutChangedEvent,\n FabricMemberJoinedEvent,\n FabricMemberJoinedEventParams,\n FabricMemberLeftEvent,\n FabricMemberLeftEventParams,\n FabricMemberTalkingEvent,\n FabricMemberTalkingEventParams,\n FabricMemberUpdatedEvent,\n FabricMemberUpdatedEventParams,\n InternalFabricMemberEntity,\n InternalFabricMemberEntityUpdated,\n InternalFabricRoomSessionEntity,\n InternalVideoMemberEntity,\n InternalVideoMemberEntityUpdated,\n InternalVideoRoomEntity,\n InternalVideoRoomSessionEntity,\n MapToPubSubShape,\n VideoLayoutChangedEvent,\n VideoMemberJoinedEvent,\n VideoMemberJoinedEventParams,\n VideoMemberLeftEvent,\n VideoMemberLeftEventParams,\n VideoMemberTalkingEvent,\n VideoMemberTalkingEventParams,\n VideoMemberUpdatedEvent,\n VideoMemberUpdatedEventParams,\n VideoRoomSubscribedEvent,\n VideoRoomSubscribedEventParams,\n VideoRoomUpdatedEvent,\n VideoRoomUpdatedEventParams,\n} from '@signalwire/core'\n\n/**\n * Map the InternalFabricMemberEntity to InternalVideoMemberEntity\n */\nexport const mapInternalFabricMemberToInternalVideoMemberEntity = (\n params: InternalFabricMemberEntity\n): InternalVideoMemberEntity => {\n return {\n id: params.member_id,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n name: params.name,\n type: params.type,\n handraised: params.handraised,\n visible: params.visible,\n audio_muted: params.audio_muted,\n video_muted: params.video_muted,\n deaf: params.deaf,\n input_volume: params.input_volume,\n output_volume: params.output_volume,\n input_sensitivity: params.input_sensitivity,\n meta: params.meta,\n talking: params.talking,\n current_position: params.current_position,\n requested_position: params.requested_position,\n parent_id: params.parent_id,\n }\n}\n\n/**\n * Map the InternalFabricMemberEntityUpdated to InternalVideoMemberEntityUpdated\n */\nexport const mapInternalFabricMemberToInternalVideoMemberUpdatedEntity = (\n params: InternalFabricMemberEntityUpdated\n): InternalVideoMemberEntityUpdated => {\n return {\n ...mapInternalFabricMemberToInternalVideoMemberEntity(params),\n updated: params.updated.map((key) =>\n key === 'member_id' ? 'id' : (key as keyof InternalVideoMemberEntity)\n ),\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomEntity => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n recordings: params.recordings,\n playbacks: params.playbacks,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n }\n}\n\n/**\n * Map InternalFabricRoomSessionEntity to InternalVideoRoomSessionEntity\n */\nexport const mapInternalFabricRoomToInternalVideoRoomSessionEntity = (\n params: InternalFabricRoomSessionEntity\n): InternalVideoRoomSessionEntity => {\n return {\n id: params.id,\n display_name: params.display_name,\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n event_channel: params.event_channel,\n name: params.name,\n recording: params.recording,\n recordings: params.recordings,\n playbacks: params.playbacks,\n hide_video_muted: params.hide_video_muted,\n preview_url: params.preview_url,\n layout_name: params.layout_name,\n locked: params.locked,\n meta: params.meta,\n members: params.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n streaming: params.streaming,\n streams: params.streams,\n prioritize_handraise: params.prioritize_handraise,\n updated: params.updated,\n }\n}\n\n/**\n * Map the \"call.joined\" event params to \"video.room.subscribed\" event params\n */\nexport const mapCallJoinedToRoomSubscribedEventParams = (\n params: CallJoinedEventParams\n): VideoRoomSubscribedEventParams => {\n return {\n call_id: params.call_id,\n member_id: params.member_id,\n room: {\n ...mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n room_session: {\n ...mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n members: params.room_session.members.map(\n mapInternalFabricMemberToInternalVideoMemberEntity\n ),\n },\n }\n}\n\n/**\n * Map the \"call.joined\" action to \"video.room.subscribed\" action\n */\nexport const mapCallJoinedToRoomSubscribedAction = (\n action: MapToPubSubShape<CallJoinedEvent>\n): MapToPubSubShape<VideoRoomSubscribedEvent> => {\n return {\n type: `video.room.subscribed`,\n payload: mapCallJoinedToRoomSubscribedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"call.updated\" event params to \"video.room.updated\" event params\n */\nexport const mapCallUpdatedToRoomUpdatedEventParams = (\n params: CallUpdatedEventParams\n): VideoRoomUpdatedEventParams => {\n return {\n room_id: params.room_id,\n room_session_id: params.room_session_id,\n room: mapInternalFabricRoomToInternalVideoRoomEntity(params.room_session),\n room_session: mapInternalFabricRoomToInternalVideoRoomSessionEntity(\n params.room_session\n ),\n }\n}\n\n/**\n * Map the \"call.updated\" action to \"video.room.updated\" action\n */\nexport const mapCallUpdatedToRoomUpdatedEventAction = (\n action: MapToPubSubShape<CallUpdatedEvent>\n): MapToPubSubShape<VideoRoomUpdatedEvent> => {\n return {\n type: `video.room.updated`,\n payload: mapCallUpdatedToRoomUpdatedEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" event params\n * to \"video.member.joined\" and \"video.member.left\" event params\n */\nexport const mapFabricMemberToVideoMemberJoinAndLeftEventParams = (\n params: FabricMemberJoinedEventParams | FabricMemberLeftEventParams\n): VideoMemberJoinedEventParams | VideoMemberLeftEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberEntity(params.member),\n }\n}\n\n/**\n * Map the \"member.joined\" and \"member.left\" actions\n * to \"video.member.joined\" and \"video.member.left\" actions\n */\nexport const mapFabricMemberActionToVideoMemberJoinAndLeftAction = (\n action: MapToPubSubShape<FabricMemberJoinedEvent | FabricMemberLeftEvent>\n): MapToPubSubShape<VideoMemberJoinedEvent | VideoMemberLeftEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberJoinAndLeftEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"member.updated\" event params to \"video.member.updated\" event params\n */\nexport const mapFabricMemberEventToVideoMemberUpdatedEventParams = (\n params: FabricMemberUpdatedEventParams\n): VideoMemberUpdatedEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: mapInternalFabricMemberToInternalVideoMemberUpdatedEntity(\n params.member\n ),\n }\n}\n\n/**\n * Map the \"member.updated\" action to \"video.member.updated\" action\n */\nexport const mapFabricMemberActionToVideoMemberUpdatedAction = (\n action: MapToPubSubShape<FabricMemberUpdatedEvent>\n): MapToPubSubShape<VideoMemberUpdatedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberEventToVideoMemberUpdatedEventParams(\n action.payload\n ),\n }\n}\n\n/**\n * Map the \"member.talking\" event params to \"video.member.talking\" event params\n */\nexport const mapFabricMemberToVideoMemberTalkingEventParams = (\n params: FabricMemberTalkingEventParams\n): VideoMemberTalkingEventParams => {\n return {\n room_session_id: params.room_session_id,\n room_id: params.room_id,\n member: {\n id: params.member.member_id,\n talking: params.member.talking,\n },\n }\n}\n\n/**\n * Map the \"member.talking\" action to \"video.member.talking\" action\n */\nexport const mapFabricMemberActionToVideoMemberTalkingAction = (\n action: MapToPubSubShape<FabricMemberTalkingEvent>\n): MapToPubSubShape<VideoMemberTalkingEvent> => {\n return {\n type: `video.${action.type}`,\n payload: mapFabricMemberToVideoMemberTalkingEventParams(action.payload),\n }\n}\n\n/**\n * Map the \"layout.changed\" action to \"video.layout.changed\" action\n */\nexport const mapFabricLayoutActionToVideoLayoutAction = (\n action: MapToPubSubShape<FabricLayoutChangedEvent>\n): MapToPubSubShape<VideoLayoutChangedEvent> => {\n return {\n type: `video.${action.type}`,\n payload: action.payload,\n }\n}\n","import { CallCapabilitiesContract, CapabilityOnOffStateContract, MemberCapabilityContract } from \"../interfaces/capabilities\"\n\nclass CapabilityOnOffState implements CapabilityOnOffStateContract {\n constructor(private _flags: string[]) { }\n\n get on() {\n return this._flags.some((flag) => !flag.endsWith('.off'))\n }\n\n get off() {\n return this._flags.some((flag) => !flag.endsWith('.on'))\n }\n}\n\nclass MemberCapability implements MemberCapabilityContract {\n private _muteAudio?: CapabilityOnOffState\n private _muteVideo?: CapabilityOnOffState\n private _deaf?: CapabilityOnOffState\n \n constructor(\n private _flags: string[],\n private _memberType: 'self' | 'member'\n ) { }\n\n get muteAudio() {\n this._muteAudio =\n this._muteAudio ??\n new CapabilityOnOffState(\n this._flags.filter(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.mute` ||\n flag.startsWith(`${this._memberType}.mute.audio`)\n )\n )\n return this._muteAudio\n }\n\n get muteVideo() {\n this._muteVideo =\n this._muteVideo ??\n new CapabilityOnOffState(\n this._flags.filter(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.mute` ||\n flag.startsWith(`${this._memberType}.mute.video`)\n )\n )\n return this._muteVideo\n }\n\n get microphoneVolume() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.microphone` ||\n flag.startsWith(`${this._memberType}.microphone.volume`)\n )\n }\n\n get microphoneSensitivity() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.microphone` ||\n flag.startsWith(`${this._memberType}.microphone.sensitivity`)\n )\n }\n\n get speakerVolume() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag === `${this._memberType}.speaker` ||\n flag.startsWith(`${this._memberType}.speaker.volume`)\n )\n }\n\n get deaf() {\n this._deaf =\n this._deaf ??\n new CapabilityOnOffState(\n this._flags.filter(\n (flag) => flag === this._memberType ||\n flag.startsWith(`${this._memberType}.deaf`)\n )\n )\n return this._deaf\n }\n\n get raisehand() {\n return {\n on: true,\n off: true\n }\n // TODO: uncomment once the server add this capability \n // this._raisehand =\n // this._raisehand ??\n // new CapabilityOnOffState(\n // this._flags.filter(\n // (flag) => flag === this._memberType ||\n // flag.startsWith(`${this._memberType}.raisehand`)\n // )\n // )\n // return this._raisehand\n }\n\n get position() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag.startsWith(`${this._memberType}.position`)\n )\n }\n\n get meta() {\n return this._flags.some(\n (flag) => flag === this._memberType || flag.startsWith(`${this._memberType}.meta`)\n )\n }\n\n get remove() {\n return this._flags.some(\n (flag) => flag === this._memberType ||\n flag.startsWith(`${this._memberType}.remove`)\n )\n }\n}\n\nexport class CallCapabilities implements CallCapabilitiesContract {\n private _self?: MemberCapabilityContract\n private _member?: MemberCapabilityContract\n private _vmutedHide?: CapabilityOnOffState\n private _lock?: CapabilityOnOffState\n\n constructor(private _flags: string[]) { }\n\n private _buildMemberCapability(memberType: 'self' | 'member') {\n return new MemberCapability(\n this._flags.filter((flag) => flag.startsWith(memberType)),\n memberType\n )\n }\n\n get self() {\n this._self = this._self ?? this._buildMemberCapability('self')\n return this._self\n }\n\n get member() {\n this._member = this._member ?? this._buildMemberCapability('member')\n return this._member\n }\n\n get end() {\n return this._flags.some((capability) => capability === 'end')\n }\n\n get setLayout() {\n return this._flags.some((capability) => capability.startsWith('layout'))\n }\n\n get sendDigit() {\n return this._flags.some((capability) => capability.startsWith('digit'))\n }\n\n get vmutedHide() {\n this._vmutedHide =\n this._vmutedHide ??\n new CapabilityOnOffState(\n this._flags.filter((flag) => flag.startsWith('vmuted'))\n )\n return this._vmutedHide\n }\n\n get lock() {\n this._lock =\n this._lock ??\n new CapabilityOnOffState(\n this._flags.filter((flag) => flag.startsWith('lock'))\n )\n return this._lock\n }\n\n get device() {\n return this._flags.some((capability) => capability === 'device')\n }\n\n get screenshare() {\n return this._flags.some((capability) => capability === 'screenshare')\n }\n}\n\nexport const mapCapabilityPayload = (capabilities: string[]) =>\n new CallCapabilities(capabilities)","import {\n getLogger,\n SagaIterator,\n CallJoinedEvent,\n sagaEffects,\n MemberPosition,\n stripNamespacePrefix,\n} from '@signalwire/core'\nimport {\n createFabricRoomSessionMemberObject,\n FabricRoomSessionMember,\n} from '../FabricRoomSessionMember'\nimport { FabricWorkerParams } from './fabricWorker'\nimport { fabricMemberWorker } from './fabricMemberWorker'\nimport { mapCallJoinedToRoomSubscribedEventParams } from '../utils/helpers'\nimport { mapCapabilityPayload } from '../utils/capabilitiesHelpers'\n\nexport const callJoinWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n getLogger().trace('callJoinWorker started')\n const { action, instanceMap, instance: cfRoomSession } = options\n const { payload } = action\n const { get, set } = instanceMap\n\n yield sagaEffects.fork(MemberPosition.memberPositionWorker, {\n ...options,\n /**\n * The {@link memberPositionWorker} worker understands only the Video SDK events.\n * So, we need to map CF SDK event to Video SDK event.\n * Similar to what we do in the {@link callSegmentWorker}, for member events.\n */\n initialState: mapCallJoinedToRoomSubscribedEventParams(payload),\n dispatcher: function* (subType, subPayload) {\n /**\n * The {@link memberPositionWorker} dispatches the Video SDK events.\n * We need to convert it back to CF SDK event before emitting to the user.\n */\n const fabricType = stripNamespacePrefix(subType, 'video') as any\n const fabricPaylod = {\n ...subPayload,\n member: {\n ...subPayload.member,\n member_id: subPayload.member.id,\n },\n }\n\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action: { type: fabricType, payload: fabricPaylod },\n })\n },\n })\n\n payload.room_session.members?.forEach((member: any) => {\n let memberInstance = get<FabricRoomSessionMember>(member.member_id!)\n if (!memberInstance) {\n memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n },\n })\n } else {\n memberInstance.setPayload({\n member: member,\n room_id: payload.room_id,\n room_session_id: payload.room_session_id,\n })\n }\n set<FabricRoomSessionMember>(member.member_id, memberInstance)\n })\n\n cfRoomSession.member = get<FabricRoomSessionMember>(payload.member_id)\n // the server send the capabilities payload as an array of string\n cfRoomSession.capabilities = mapCapabilityPayload(payload.capabilities)\n\n const fabricEvent = {\n ...payload,\n capabilities: cfRoomSession.capabilities,\n }\n\n cfRoomSession.emit('call.joined', fabricEvent)\n\n getLogger().trace('callJoinWorker ended')\n}\n","import {\n FabricAction,\n CallJoinedEvent,\n SDKActions,\n SagaIterator,\n getLogger,\n sagaEffects,\n} from '@signalwire/core'\nimport { callLeftWorker } from './callLeftWorker'\nimport { callJoinWorker } from './callJoinWorker'\nimport { FabricWorkerParams } from './fabricWorker'\nimport {\n mapFabricLayoutActionToVideoLayoutAction,\n mapFabricMemberActionToVideoMemberJoinAndLeftAction,\n mapFabricMemberActionToVideoMemberUpdatedAction,\n} from '../utils/helpers'\nimport { fabricMemberWorker } from './fabricMemberWorker'\n\nexport const callSegmentWorker = function* (\n options: FabricWorkerParams<CallJoinedEvent>\n): SagaIterator {\n const {\n action,\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n const segmentCallId = action.payload.call_id\n const segmentRooSessionId = action.payload.room_session_id\n\n getLogger().debug(\n `callSegmentWorker started for: callId ${segmentCallId}, roomSessionId ${segmentRooSessionId}`\n )\n\n // Handles the `call.joined` event before the worker loop\n yield sagaEffects.fork(callJoinWorker, {\n ...options,\n action,\n })\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined':\n /** NOOP since this event is handled by the {@link fabricWorker} */\n break\n case 'call.left':\n // Wait for the `callLeftWorker` to finish and then stop this particular segment worker\n yield sagaEffects.call(callLeftWorker, {\n ...options,\n action,\n })\n return true\n case 'call.updated':\n cfRoomSession.emit(type, payload)\n cfRoomSession.emit('room.updated', payload)\n break\n case 'call.play':\n cfRoomSession.emit(type, payload)\n break\n case 'call.connect':\n cfRoomSession.emit(type, payload)\n break\n case 'call.room':\n cfRoomSession.emit(type, payload)\n break\n\n /**\n * The Core module includes a generic worker, {@link memberPositionWorker},\n * which listens for member & layout events to add a \"current_position\" parameter\n * and handle member \"updated\" parameter.\n * This worker in CF SDK is initialized by the {@link callJoinWorker} worker.\n *\n * To ensure compatibility, we map these events to Video SDK events and\n * re-publish them on the channel so that they can be processed by the\n * generic worker. Note that the generic worker only dispatches \"member.updated\"\n * and \"member.updated.*\" events.\n *\n * Additionally, the \"member.joined\" event is monitored by another worker,\n * {@link childMemberJoinedWorker}, specifically for the screen share API.\n */\n case 'member.joined':\n case 'member.left': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n const videoAction =\n mapFabricMemberActionToVideoMemberJoinAndLeftAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.updated': {\n const videoAction =\n mapFabricMemberActionToVideoMemberUpdatedAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'layout.changed': {\n // We need to update the layout event which is needed for rootElement.\n cfRoomSession.currentLayoutEvent = action.payload\n cfRoomSession.emit(type, payload)\n const videoAction = mapFabricLayoutActionToVideoLayoutAction(action)\n yield sagaEffects.put(swEventChannel, videoAction)\n break\n }\n case 'member.talking': {\n yield sagaEffects.fork(fabricMemberWorker, {\n ...options,\n action,\n })\n break\n }\n default: {\n getLogger().warn('Got an unknown fabric event', action)\n }\n }\n\n return false\n }\n\n const isSegmentEvent = (action: SDKActions) => {\n const { type, payload } = action as FabricAction\n const shouldWatch =\n type.startsWith('call.') ||\n type.startsWith('member.') ||\n type.startsWith('layout.')\n const hasSegmentCallId =\n 'call_id' in payload && segmentCallId === payload.call_id\n const hasSegmentRoomSessionId =\n segmentRooSessionId === payload.room_session_id\n\n if (shouldWatch && (hasSegmentCallId || hasSegmentRoomSessionId)) {\n return true\n }\n\n return false\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isSegmentEvent\n )\n const task = yield sagaEffects.fork(worker, action)\n\n /**\n * Wait for `worker` to finish and get its return value\n * Stop the `callSegmentWorker' if the returned value is true\n */\n const shouldStop = yield sagaEffects.join(task)\n if (shouldStop) return\n }\n}\n","import {\n SDKWorker,\n SagaIterator,\n getLogger,\n sagaEffects,\n SDKWorkerParams,\n SDKActions,\n FabricAction,\n} from '@signalwire/core'\nimport { FabricRoomSessionConnection } from '../FabricRoomSession'\nimport { createFabricRoomSessionMemberObject } from '../FabricRoomSessionMember'\nimport { callSegmentWorker } from './callSegmentWorker'\nimport { MapToPubSubShape } from 'packages/core/dist/core/src'\n\nexport type FabricWorkerParams<T> =\n SDKWorkerParams<FabricRoomSessionConnection> & {\n action: MapToPubSubShape<T>\n }\n\nexport const fabricWorker: SDKWorker<FabricRoomSessionConnection> = function* (\n options\n): SagaIterator {\n getLogger().trace('fabricWorker started')\n const {\n channels: { swEventChannel },\n instance: cfRoomSession,\n } = options\n\n function* worker(action: FabricAction) {\n const { type, payload } = action\n\n switch (type) {\n case 'call.joined': {\n // since we depend on `cfRoomSession.selfMember` on the take logic\n // we need to make sure we update the `cfRoomSession.selfMember`\n // in this worker or have a race condition.\n if (!cfRoomSession.selfMember) {\n const memberInstance = createFabricRoomSessionMemberObject({\n store: cfRoomSession.store,\n payload: {\n member: action.payload.room_session.members.find(\n (m) => m.member_id === action.payload.member_id\n )!,\n room_id: action.payload.room_id,\n room_session_id: action.payload.room_session_id,\n },\n })\n cfRoomSession.selfMember = memberInstance\n }\n\n // Segment worker for each call_id\n yield sagaEffects.fork(callSegmentWorker, {\n ...options,\n instance: cfRoomSession,\n action,\n })\n break\n }\n case 'call.state':\n cfRoomSession.emit(type, payload)\n break\n }\n }\n\n let firstCallJoinedReceived = false\n const isFirstCallJoinedorCallStateEvent = (action: SDKActions) => {\n if (action.type === 'call.state') {\n return true\n }\n\n if (action.type !== 'call.joined') {\n return false\n }\n\n // If this is the first call.joined event, verify the call origin ID\n if (!firstCallJoinedReceived) {\n const callId = action.payload.call_id\n const originCallId = action.payload.origin_call_id\n if (callId === originCallId) {\n firstCallJoinedReceived = true\n return true\n }\n return false // Discard all the call.joined event until the first call.joined is received\n }\n\n // If first call.joined event already received, only check the action type\n return true\n }\n\n while (true) {\n const action: FabricAction = yield sagaEffects.take(\n swEventChannel,\n isFirstCallJoinedorCallStateEvent\n )\n\n yield sagaEffects.fork(worker, action)\n }\n\n getLogger().trace('fabricWorker ended')\n}\n","import {\n connect,\n BaseComponentContract,\n BaseRPCResult,\n FabricLayoutChangedEventParams,\n ExecuteExtendedOptions,\n Rooms,\n VideoMemberEntity,\n VideoPosition,\n BaseConnectionContract,\n FabricRoomSessionMethods,\n MemberCommandParams,\n} from '@signalwire/core'\nimport {\n BaseRoomSessionConnection,\n BaseRoomSessionOptions,\n} from '../BaseRoomSession'\nimport {\n BaseRoomSessionContract,\n ExecuteMemberActionParams,\n FabricRoomSessionContract,\n FabricRoomSessionEvents,\n MemberCommandWithValueParams,\n MemberCommandWithVolumeParams,\n RequestMemberParams,\n} from '../utils/interfaces'\nimport { getStorage } from '../utils/storage'\nimport { PREVIOUS_CALLID_STORAGE_KEY } from './utils/constants'\nimport { fabricWorker } from './workers'\nimport { FabricRoomSessionMember } from './FabricRoomSessionMember'\nimport { makeAudioElementSaga } from '../features/mediaElements/mediaElementsSagas'\nimport { CallCapabilitiesContract } from './interfaces/capabilities'\n\nexport interface FabricRoomSession\n extends FabricRoomSessionContract,\n FabricRoomSessionMethods,\n BaseRoomSessionContract,\n BaseConnectionContract<FabricRoomSessionEvents>,\n BaseComponentContract {}\n\nexport interface FabricRoomSessionOptions\n extends Omit<BaseRoomSessionOptions, 'customSagas'> {}\n\nexport class FabricRoomSessionConnection\n extends BaseRoomSessionConnection<FabricRoomSessionEvents>\n implements FabricRoomSessionContract\n{\n // this is \"self\" parameter required by the RPC, and is always \"the member\" on the 1st call segment\n private _self?: FabricRoomSessionMember\n // this is \"the member\" on the last/active call segment\n private _member?: FabricRoomSessionMember\n private _currentLayoutEvent: FabricLayoutChangedEventParams\n //describes what are methods are allow for the user in a call segment\n private _capabilities?: CallCapabilitiesContract\n\n constructor(options: FabricRoomSessionOptions) {\n super(options)\n\n this.initWorker()\n }\n\n override get memberId() {\n return this._member?.memberId\n }\n\n set currentLayoutEvent(event: FabricLayoutChangedEventParams) {\n this._currentLayoutEvent = event\n }\n\n get currentLayoutEvent() {\n return this._currentLayoutEvent\n }\n\n get currentLayout() {\n return this._currentLayoutEvent?.layout\n }\n\n get currentPosition() {\n return this._currentLayoutEvent?.layout.layers.find(\n (layer) => layer.member_id === this.memberId\n )?.position\n }\n\n get capabilities(): CallCapabilitiesContract | undefined {\n return this._capabilities\n }\n\n set capabilities(capabilities: CallCapabilitiesContract | undefined) {\n this._capabilities = capabilities\n }\n\n get selfMember(): FabricRoomSessionMember | undefined {\n return this._self\n }\n\n set selfMember(member: FabricRoomSessionMember | undefined) {\n this._self = member\n }\n\n set member(member: FabricRoomSessionMember) {\n this._member = member\n }\n\n get member(): FabricRoomSessionMember {\n return this._member!\n }\n\n private initWorker() {\n this.runWorker('fabricWorker', {\n worker: fabricWorker,\n })\n\n /**\n * By default the SDK attaches the audio to\n * an Audio element (regardless of \"rootElement\")\n */\n this.runWorker('makeAudioElement', {\n worker: makeAudioElementSaga({\n speakerId: this.options.speakerId,\n }),\n })\n }\n\n private async join() {\n if (this.options.attach) {\n this.options.prevCallId =\n getStorage()?.getItem(PREVIOUS_CALLID_STORAGE_KEY) ?? undefined\n }\n this.logger.debug(\n `Tying to reattach to previuos call? ${!!this.options\n .prevCallId} - prevCallId: ${this.options.prevCallId}`\n )\n\n return super.invite<FabricRoomSession>()\n }\n\n private executeAction<\n InputType,\n OutputType = InputType,\n ParamsType extends MemberCommandParams = MemberCommandParams\n >(\n params: ExecuteMemberActionParams,\n options: ExecuteExtendedOptions<InputType, OutputType, ParamsType> = {}\n ) {\n const { method, channel, memberId, extraParams = {} } = params\n\n const targetMember = memberId\n ? this.instanceMap.get<FabricRoomSessionMember>(memberId)\n : this.member\n if (!targetMember) throw new Error('No target param found to execute')\n\n return this.execute<InputType, OutputType, ParamsType>(\n {\n method,\n params: {\n ...(channel && { channels: [channel] }),\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId,\n node_id: targetMember.nodeId,\n },\n ...extraParams,\n },\n },\n options\n )\n }\n\n /** @internal */\n public override async resume() {\n this.logger.warn(`[resume] Call ${this.id}`)\n if (this.peer?.instance) {\n const { connectionState } = this.peer.instance\n this.logger.debug(\n `[resume] connectionState for ${this.id} is '${connectionState}'`\n )\n if (['closed', 'failed', 'disconnected'].includes(connectionState)) {\n this.resuming = true\n this.peer.restartIce()\n }\n }\n }\n\n public async start() {\n return new Promise<void>(async (resolve, reject) => {\n try {\n this.once('room.subscribed', (params) => {\n getStorage()?.setItem(PREVIOUS_CALLID_STORAGE_KEY, params.call_id)\n resolve()\n })\n\n this.once('destroy', () => {\n getStorage()?.removeItem(PREVIOUS_CALLID_STORAGE_KEY)\n })\n\n await this.join()\n } catch (error) {\n this.logger.error('WSClient call start', error)\n reject(error)\n }\n })\n }\n\n public async audioMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteAudio.off\n : !this.capabilities?.member.muteAudio.off\n ) {\n throw Error('Missing audio mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async audioUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteAudio.on\n : !this.capabilities?.member.muteAudio.on\n ) {\n throw Error('Missing audio unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'audio',\n memberId: params?.memberId,\n })\n }\n\n public async videoMute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteVideo.off\n : !this.capabilities?.member.muteVideo.on\n ) {\n throw Error('Missing video mute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.mute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async videoUnmute(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.muteVideo.on\n : !this.capabilities?.member.muteVideo.on\n ) {\n throw Error('Missing video unmute capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unmute',\n channel: 'video',\n memberId: params?.memberId,\n })\n }\n\n public async deaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.deaf.on\n : !this.capabilities?.member.deaf.on\n ) {\n throw Error('Missing deaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.deaf',\n memberId: params?.memberId,\n })\n }\n\n public async undeaf(params: MemberCommandParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.deaf.off\n : !this.capabilities?.member.deaf.off\n ) {\n throw Error('Missing undeaf capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.undeaf',\n memberId: params?.memberId,\n })\n }\n\n public async getLayouts() {\n return this.executeAction<{ layouts: string[] }>(\n {\n method: 'call.layout.list',\n },\n {\n transformResolve: (payload) => ({\n layouts: payload.layouts,\n }),\n }\n )\n }\n\n public async getMembers() {\n return this.executeAction<{ members: VideoMemberEntity[] }>(\n {\n method: 'call.member.list',\n },\n {\n transformResolve: (payload) => ({\n members: payload.members,\n }),\n }\n )\n }\n\n public async removeMember(params: Required<MemberCommandParams>) {\n if (!this.capabilities?.member.remove) {\n throw Error('Missing setLayout capability')\n }\n if (!params?.memberId) {\n throw new TypeError('Invalid or missing \"memberId\" argument')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.member.remove',\n memberId: params.memberId,\n })\n }\n\n public async setRaisedHand(params?: Rooms.SetRaisedHandRoomParams) {\n const { raised = true, memberId } = params || {}\n if (\n memberId == this.member.id && raised\n ? !this.capabilities?.self.raisehand.on\n : !this.capabilities?.member.raisehand.on\n ) {\n throw Error('Missing raisehand capability')\n }\n if (\n memberId == this.member.id && !raised\n ? !this.capabilities?.self.raisehand.off\n : !this.capabilities?.member.raisehand.off\n ) {\n throw Error('Missing lowerhand capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: raised ? 'call.raisehand' : 'call.lowerhand',\n memberId,\n })\n }\n\n public async setLayout(params: Rooms.SetLayoutParams) {\n if (!this.capabilities?.setLayout) {\n throw Error('Missing setLayout capability')\n }\n const extraParams = {\n layout: params.name,\n positions: params.positions,\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.layout.set',\n extraParams,\n })\n }\n\n public async setInputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.microphoneVolume\n : !this.capabilities?.member.microphoneVolume\n ) {\n throw Error('Missing setInputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.volume.set',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setOutputVolume(params: MemberCommandWithVolumeParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.speakerVolume\n : !this.capabilities?.member.speakerVolume\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'video.member.set_output_volume',\n memberId: params?.memberId,\n extraParams: {\n volume: params?.volume,\n },\n })\n }\n\n public async setInputSensitivity(params: MemberCommandWithValueParams) {\n if (\n !params || params.memberId === this.member.id\n ? !this.capabilities?.self.microphoneSensitivity\n : !this.capabilities?.member.microphoneSensitivity\n ) {\n throw Error('Missing setOutputVolume capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.microphone.sensitivity.set',\n memberId: params?.memberId,\n extraParams: {\n value: params?.value,\n },\n })\n }\n\n public async setPositions(params: Rooms.SetPositionsParams) {\n const positions = params.positions\n\n if (positions && !Object.keys(positions).length) {\n throw new Error('Invalid positions')\n }\n\n if (\n Object.keys(positions).some((p) =>\n ['self', `${this.memberId}`].includes(p)\n )\n ? !this.capabilities?.self.position\n : !this.capabilities?.member.position\n ) {\n throw Error('Missing setPositions capability')\n }\n\n const targets: {\n target: RequestMemberParams\n position: VideoPosition\n }[] = []\n\n Object.entries(positions).forEach(([key, value]) => {\n const targetMember =\n key === 'self'\n ? this.member\n : this.instanceMap.get<FabricRoomSessionMember>(key)\n\n if (targetMember) {\n targets.push({\n target: {\n member_id: targetMember.id,\n call_id: targetMember.callId!,\n node_id: targetMember.nodeId!,\n },\n position: value,\n })\n }\n })\n\n if (!targets.length) {\n throw new Error('Invalid targets')\n }\n\n return this.execute({\n method: 'call.member.position.set',\n params: {\n self: {\n member_id: this.selfMember?.id,\n call_id: this.selfMember?.callId,\n node_id: this.selfMember?.nodeId,\n },\n targets,\n },\n })\n }\n\n public async lock() {\n if (!this.capabilities?.lock.on) {\n throw Error('Missing lock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.lock',\n })\n }\n\n public async unlock() {\n if (!this.capabilities?.lock.off) {\n throw Error('Missing unlock capability')\n }\n return this.executeAction<BaseRPCResult>({\n method: 'call.unlock',\n })\n }\n}\n\nexport const isFabricRoomSession = (\n room: unknown\n): room is FabricRoomSession => {\n return room instanceof FabricRoomSessionConnection\n}\n\n/** @internal */\nexport const createFabricRoomSessionObject = (\n params: FabricRoomSessionOptions\n): FabricRoomSession => {\n const room = connect<\n FabricRoomSessionEvents,\n FabricRoomSessionConnection,\n FabricRoomSession\n >({\n store: params.store,\n Component: FabricRoomSessionConnection,\n })(params)\n\n return room\n}\n","import { FabricMemberUpdatedEventParams, getLogger } from '@signalwire/core'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoMemberUpdatedHandlerParams } from './utils/interfaces'\nimport { OVERLAY_PREFIX, SDK_PREFIX } from './utils/roomSession'\n\nexport type OverlayMap = Map<string, UserOverlay>\n\ninterface UserOverlayOptions {\n id: string\n}\n\nexport type OverlayStatus = 'hidden' | 'visible'\n\nexport class UserOverlay {\n public id: string\n private _domElement: HTMLDivElement | undefined\n private _status: OverlayStatus\n\n constructor(options: UserOverlayOptions) {\n this.id = options.id\n this._status = 'hidden'\n }\n\n get userId() {\n return this.id.split(OVERLAY_PREFIX)[1]\n }\n\n get domElement() {\n return this._domElement\n }\n\n set domElement(element: HTMLDivElement | undefined) {\n getLogger().debug('Setting domElement for ', this.id)\n this._domElement = element\n }\n\n get status() {\n return this._status\n }\n\n set status(status: OverlayStatus) {\n this._status = status\n }\n\n public hide() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to hide')\n }\n this.domElement.style.opacity = '0'\n this.status = 'hidden'\n }\n\n public show() {\n if (!this.domElement) {\n return getLogger().warn('Missing overlay to show')\n }\n this.domElement.style.opacity = '1'\n this.status = 'visible'\n }\n}\n\ninterface LocalVideoOverlayOptions {\n id: string\n mirrorLocalVideoOverlay: boolean\n room: FabricRoomSession | VideoRoomSession\n}\n\nexport class LocalVideoOverlay extends UserOverlay {\n private _mirrored: boolean\n private _room: FabricRoomSession | VideoRoomSession\n\n constructor(options: LocalVideoOverlayOptions) {\n super(options)\n this._mirrored = options.mirrorLocalVideoOverlay\n this._room = options.room\n\n // Bind the handler to preserve context\n this.fabricMemberVideoMutedHandler =\n this.fabricMemberVideoMutedHandler.bind(this)\n this.videoMemberVideoMutedHandler =\n this.videoMemberVideoMutedHandler.bind(this)\n\n this.attachListeners()\n }\n\n get userId() {\n return this.id.split(SDK_PREFIX)[1]\n }\n\n get mirrored() {\n return this._mirrored\n }\n\n private attachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.on(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n /** @internal */\n public detachListeners() {\n if (isFabricRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.fabricMemberVideoMutedHandler\n )\n } else if (isVideoRoomSession(this._room)) {\n this._room.off(\n 'member.updated.videoMuted',\n this.videoMemberVideoMutedHandler\n )\n }\n }\n\n private memberVideoMutedHandler(memberId: string, videoMuted: boolean) {\n try {\n if (memberId === this._room.memberId) {\n videoMuted ? this.hide() : this.show()\n }\n } catch (error) {\n getLogger().error('Error handling videoMuted in LocalVideoOverlay', error)\n }\n }\n\n private fabricMemberVideoMutedHandler(\n params: FabricMemberUpdatedEventParams\n ) {\n this.memberVideoMutedHandler(\n params.member.member_id,\n params.member.video_muted\n )\n }\n\n private videoMemberVideoMutedHandler(\n params: VideoMemberUpdatedHandlerParams\n ) {\n this.memberVideoMutedHandler(params.member.id, params.member.video_muted)\n }\n\n public setMediaStream(stream: MediaStream) {\n if (!this.domElement) {\n return getLogger().warn('Missing local overlay to set the stream')\n }\n const localVideo = this.domElement.querySelector('video')\n if (localVideo) {\n localVideo.srcObject = stream\n }\n }\n\n public setMirror(mirror: boolean = this._mirrored) {\n if (!this.domElement || !this.domElement.firstChild) {\n return getLogger().warn('Missing local overlay to set the mirror')\n }\n const videoEl = this.domElement.firstChild as HTMLVideoElement\n videoEl.style.transform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n videoEl.style.webkitTransform = mirror ? 'scale(-1, 1)' : 'scale(1, 1)'\n this._mirrored = mirror\n }\n}\n","import {\n getLogger,\n InternalVideoLayoutLayer,\n InternalVideoLayout,\n debounce,\n uuid,\n} from '@signalwire/core'\nimport { OverlayMap, LocalVideoOverlay, UserOverlay } from '../VideoOverlays'\nimport { addOverlayPrefix } from './roomSession'\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 Remote 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\nconst _updateLayer = ({\n location,\n element,\n}: {\n location: InternalVideoLayoutLayer\n element: HTMLElement\n}) => {\n const { top, left, width, height } = _getLocationStyles(location)\n element.style.top = top\n element.style.left = left\n element.style.width = width\n element.style.height = height\n\n return element\n}\n\ninterface MakeLayoutChangedHandlerParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n mirrorLocalVideoOverlay?: boolean\n rootElement: HTMLElement\n}\n\ninterface LayoutChangedHandlerParams {\n layout: InternalVideoLayout\n memberId: string\n localStream: MediaStream\n}\n\nconst makeLayoutChangedHandler = (params: MakeLayoutChangedHandlerParams) => {\n const {\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n } = params\n\n return async (params: LayoutChangedHandlerParams) => {\n getLogger().debug('Process layout.changed')\n try {\n const { layout, memberId, localStream } = params\n const { layers = [] } = layout\n const mcuLayers = rootElement.querySelector('.mcuLayers')\n\n // To handle the DOM updates in batch\n const fragment = document.createDocumentFragment()\n const currentOverlayIds = new Set()\n\n // Make local video overlay for the self member\n if (applyLocalVideoOverlay) {\n const location = layers.find(({ member_id }) => member_id === memberId)\n const overlayId = localVideoOverlay.id // LocalVideoOverlay ID is already unique\n let myLayerEl = localVideoOverlay.domElement\n currentOverlayIds.add(overlayId)\n\n if (!location) {\n getLogger().warn('Local video overlay location not found')\n localVideoOverlay.status = 'hidden'\n if (myLayerEl) {\n // Should we remove it from the DOM and the OverlayMap?\n localVideoOverlay.hide()\n }\n } else {\n if (myLayerEl) {\n getLogger().debug('Update local video overlay')\n _updateLayer({ location, element: myLayerEl })\n } else {\n getLogger().debug('Build local video overlay')\n myLayerEl = _buildLayer({ location })\n myLayerEl.id = overlayId\n\n const localVideo = buildVideo()\n localVideo.srcObject = localStream\n localVideo.disablePictureInPicture = true\n localVideo.style.width = '100%'\n localVideo.style.height = '100%'\n localVideo.style.pointerEvents = 'none'\n localVideo.style.objectFit = 'cover'\n\n myLayerEl.appendChild(localVideo)\n localVideoOverlay.domElement = myLayerEl\n\n // Mirror the local video if user has requested it\n if (mirrorLocalVideoOverlay) {\n localVideoOverlay.setMirror()\n }\n }\n\n // Show local overlay element only if the localStream has a valid video track\n const hasVideo =\n localStream\n .getVideoTracks()\n .filter((t) => t.enabled && t.readyState === 'live').length > 0\n if (hasVideo && location.visible) {\n localVideoOverlay.setMediaStream(localStream)\n localVideoOverlay.show()\n } else {\n localVideoOverlay.hide()\n }\n\n // Append the local video overlay to the fragment\n fragment.appendChild(myLayerEl)\n }\n }\n\n // Make overlay for all members (including a self member)\n if (applyMemberOverlay) {\n layers.forEach((location) => {\n const memberIdInLocation = location.member_id\n if (!memberIdInLocation) return\n\n const overlayId = addOverlayPrefix(memberIdInLocation)\n currentOverlayIds.add(overlayId)\n\n let overlay = overlayMap.get(overlayId)\n\n if (overlay && overlay.domElement) {\n // If the overlay already exists, modify its styles\n getLogger().debug('Update an overlay for ', memberIdInLocation)\n _updateLayer({ location, element: overlay.domElement })\n } else {\n // If the overlay doesn't exist, create a new overlay\n getLogger().debug('Build an overlay for ', memberIdInLocation)\n overlay = new UserOverlay({ id: overlayId })\n overlayMap.set(overlayId, overlay)\n\n const newLayer = _buildLayer({ location })\n newLayer.id = `${overlayId}-${uuid()}` // Unique DOM ID since user is allowed to build multiple video elements\n\n overlay.domElement = newLayer\n }\n\n if (!location.visible) {\n overlay.hide()\n } else {\n overlay.show()\n }\n\n // Append the overlay element to the fragment\n fragment.appendChild(overlay.domElement)\n })\n }\n\n // Remove overlays that are no longer present\n overlayMap.forEach((overlay, overlayId) => {\n if (!currentOverlayIds.has(overlayId)) {\n if (overlay.domElement && overlay.domElement.parentNode) {\n overlay.domElement.parentNode.removeChild(overlay.domElement)\n }\n overlayMap.delete(overlayId)\n }\n })\n\n // Replace mcuLayers content in batch with the fragment\n if (mcuLayers) {\n mcuLayers.innerHTML = ''\n mcuLayers.appendChild(fragment)\n }\n } catch (error) {\n getLogger().error('Layout Changed Error', error)\n }\n }\n}\n\nconst cleanupElement = (rootElement: HTMLElement) => {\n while (rootElement.firstChild) {\n rootElement.removeChild(rootElement.firstChild)\n }\n}\n\nconst setVideoMediaTrack = ({\n track,\n element,\n}: {\n track: MediaStreamTrack\n element: HTMLVideoElement\n}) => {\n element.srcObject = new MediaStream([track])\n\n track.addEventListener('ended', () => {\n element.srcObject = null\n element.remove()\n })\n}\n\nconst createRootElementResizeObserver = ({\n video,\n rootElement,\n paddingWrapper,\n}: {\n video: HTMLVideoElement\n rootElement: HTMLElement\n paddingWrapper: HTMLDivElement\n}) => {\n const computePaddingWrapperWidth = (width: number, height: number) => {\n const nativeVideoRatio = video.videoWidth / video.videoHeight\n const rootElementRatio = width / height\n if (nativeVideoRatio > rootElementRatio) {\n return '100%'\n } else {\n return `${height * nativeVideoRatio}px`\n }\n }\n\n // Debounce to avoid multiple calls\n const update = debounce(\n ({ width, height }: { width: number; height: number }) => {\n const maxPaddingBottom = (video.videoHeight / video.videoWidth) * 100\n if (paddingWrapper) {\n const pb = (height / width) * 100\n paddingWrapper.style.paddingBottom = `${\n pb > maxPaddingBottom ? maxPaddingBottom : pb\n }%`\n paddingWrapper.style.width = computePaddingWrapperWidth(width, height)\n }\n },\n 100\n )\n\n const observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n // Firefox implements `contentBoxSize` as a single content rect, rather than an array\n const { inlineSize, blockSize } = Array.isArray(entry.contentBoxSize)\n ? entry.contentBoxSize[0]\n : entry.contentBoxSize\n update({ width: inlineSize, height: blockSize })\n } else if (entry.contentRect) {\n update({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n }\n })\n })\n\n /**\n * When the intrinsic dimensions of the video changes, the root element resize may or may not trigger.\n * For example; remote stream from the server changes dimensions from 16/9 (Landscape) to 9/16 (Portrait) mode.\n * For this reason we need to listen for the 'resize' event on the video element.\n */\n const onVideoResize = () => {\n const width = rootElement.clientWidth\n const height = rootElement.clientHeight\n update({ width, height })\n }\n\n return {\n start: () => {\n observer.observe(rootElement)\n video.addEventListener('resize', onVideoResize)\n },\n stop: () => {\n observer.disconnect()\n video.removeEventListener('resize', onVideoResize)\n },\n }\n}\n\nexport {\n buildVideo,\n cleanupElement,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n createRootElementResizeObserver,\n LocalVideoOverlay,\n}\n","import {\n FabricLayoutChangedEventParams,\n VideoLayoutChangedEventParams,\n getLogger,\n uuid,\n} from '@signalwire/core'\nimport {\n buildVideo,\n cleanupElement,\n createRootElementResizeObserver,\n makeLayoutChangedHandler,\n setVideoMediaTrack,\n waitForVideoReady,\n} from './utils/videoElement'\nimport { addSDKPrefix } from './utils/roomSession'\nimport { OverlayMap, LocalVideoOverlay } from './VideoOverlays'\nimport {\n FabricRoomSession,\n isFabricRoomSession,\n} from './fabric/FabricRoomSession'\nimport { VideoRoomSession, isVideoRoomSession } from './video/VideoRoomSession'\n\nexport interface BuildVideoElementParams {\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n mirrorLocalVideoOverlay?: boolean\n room: FabricRoomSession | VideoRoomSession\n rootElement?: HTMLElement\n}\n\nexport interface BuildVideoElementReturnType {\n element: HTMLElement\n overlayMap: OverlayMap\n localVideoOverlay: LocalVideoOverlay\n unsubscribe(): void\n}\n\nexport const buildVideoElement = async (\n params: BuildVideoElementParams\n): Promise<BuildVideoElementReturnType> => {\n try {\n const {\n room,\n rootElement: element,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n } = params\n\n let hasVideoTrack = false\n const overlayMap: OverlayMap = new Map()\n const id = uuid()\n\n let rootElement: HTMLElement\n if (element) {\n rootElement = element\n } else {\n rootElement = document.createElement('div')\n rootElement.id = `rootElement-${id}`\n }\n\n /**\n * We used this `LocalVideoOverlay` class to interact with the localVideo\n * overlay DOM element in here and in the `makeLayoutChangedHandler`.\n */\n const overlayId = addSDKPrefix(id)\n const localVideoOverlay = new LocalVideoOverlay({\n id: overlayId,\n mirrorLocalVideoOverlay,\n room,\n })\n if (applyLocalVideoOverlay) {\n overlayMap.set(overlayId, localVideoOverlay)\n }\n\n const makeLayout = makeLayoutChangedHandler({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n overlayMap,\n localVideoOverlay,\n mirrorLocalVideoOverlay,\n rootElement,\n })\n\n const processLayoutChanged = (params: any) => {\n // @ts-expect-error\n if (room.peer?.hasVideoSender && room.localStream) {\n makeLayout({\n layout: params.layout,\n localStream: room.localStream,\n memberId: room.memberId,\n })\n } else {\n localVideoOverlay.hide()\n }\n }\n\n const layoutChangedHandler = (\n params: FabricLayoutChangedEventParams | VideoLayoutChangedEventParams\n ) => {\n getLogger().debug('Received layout.changed - videoTrack', hasVideoTrack)\n if (hasVideoTrack) {\n processLayoutChanged(params)\n return\n }\n }\n\n const processVideoTrack = async (track: MediaStreamTrack) => {\n hasVideoTrack = true\n\n await videoElementSetup({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n rootElement,\n track,\n })\n\n const roomCurrentLayoutEvent = room.currentLayoutEvent\n // If the `layout.changed` has already been received, process the layout\n if (roomCurrentLayoutEvent) {\n processLayoutChanged(roomCurrentLayoutEvent)\n }\n }\n\n // If the remote video already exist, inject the remote stream to the video element\n // @ts-expect-error\n const videoTrack = room.peer?.remoteVideoTrack as MediaStreamTrack | null\n if (videoTrack) {\n await processVideoTrack(videoTrack)\n }\n\n // Handle the RTCPeer `track` event\n const trackHandler = async function (event: RTCTrackEvent) {\n if (event.track.kind === 'video') {\n await processVideoTrack(event.track)\n }\n }\n\n const unsubscribe = () => {\n cleanupElement(rootElement)\n overlayMap.clear() // Use \"delete\" rather than \"clear\" if we want to update the reference\n room.overlayMap = overlayMap\n if (isFabricRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.off('track', trackHandler)\n room.off('layout.changed', layoutChangedHandler)\n room.off('destroy', unsubscribe)\n }\n localVideoOverlay.detachListeners()\n }\n\n /**\n * Using `on` instead of `once` (or `off` within trackHandler) because\n * there are cases (promote/demote) where we need to handle multiple `track`\n * events and update the videoEl with the new track.\n */\n if (isFabricRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n } else if (isVideoRoomSession(room)) {\n room.on('track', trackHandler)\n room.on('layout.changed', layoutChangedHandler)\n room.once('destroy', unsubscribe)\n }\n\n /**\n * The room object is only being used to listen for events.\n * The \"buildVideoElement\" function does not directly manipulate the room object in order to maintain immutability.\n * Currently, we are overriding the following room properties in case the user calls \"buildVideoElement\" more than once.\n * However, this can be moved out of here easily if we prefer not to override.\n */\n room.overlayMap = overlayMap\n room.localVideoOverlay = localVideoOverlay\n\n return { element: rootElement, overlayMap, localVideoOverlay, unsubscribe }\n } catch (error) {\n getLogger().error('Unable to build the video element')\n throw error\n }\n}\n\ninterface VideoElementSetupWorkerParams {\n rootElement: HTMLElement\n track: MediaStreamTrack\n applyLocalVideoOverlay?: boolean\n applyMemberOverlay?: boolean\n}\n\nconst videoElementSetup = async (options: VideoElementSetupWorkerParams) => {\n try {\n const { applyLocalVideoOverlay, applyMemberOverlay, track, rootElement } =\n options\n\n // Create a video element\n const videoElement = buildVideo()\n\n setVideoMediaTrack({ element: videoElement, track })\n\n videoElement.style.width = '100%'\n videoElement.style.maxHeight = '100%'\n\n if (rootElement.querySelector('.mcuContent')) {\n getLogger().debug('MCU Content already there')\n return\n }\n\n const mcuWrapper = document.createElement('div')\n mcuWrapper.style.position = 'absolute'\n mcuWrapper.style.top = '0'\n mcuWrapper.style.left = '0'\n mcuWrapper.style.right = '0'\n mcuWrapper.style.bottom = '0'\n mcuWrapper.appendChild(videoElement)\n\n const paddingWrapper = document.createElement('div')\n paddingWrapper.classList.add('paddingWrapper')\n paddingWrapper.style.paddingBottom = '56.25%' // (9 / 16) * 100\n paddingWrapper.style.position = 'relative'\n paddingWrapper.style.width = '100%'\n paddingWrapper.appendChild(mcuWrapper)\n\n let layersWrapper: HTMLDivElement | null = null\n\n // If the both flags are false, no need to create the MCU\n if (applyLocalVideoOverlay || applyMemberOverlay) {\n layersWrapper = document.createElement('div')\n layersWrapper.classList.add('mcuLayers')\n layersWrapper.style.display = 'none'\n paddingWrapper.appendChild(layersWrapper)\n }\n\n const relativeWrapper = document.createElement('div')\n relativeWrapper.classList.add('mcuContent')\n relativeWrapper.style.position = 'relative'\n relativeWrapper.style.width = '100%'\n relativeWrapper.style.height = '100%'\n relativeWrapper.style.margin = '0 auto'\n relativeWrapper.style.display = 'flex'\n relativeWrapper.style.alignItems = 'center'\n relativeWrapper.style.justifyContent = 'center'\n relativeWrapper.appendChild(paddingWrapper)\n\n rootElement.style.width = '100%'\n rootElement.style.height = '100%'\n rootElement.appendChild(relativeWrapper)\n\n getLogger().debug('MCU readyState 1 >>', videoElement.readyState)\n if (videoElement.readyState === HTMLMediaElement.HAVE_NOTHING) {\n getLogger().debug('Wait for the MCU to be ready')\n await waitForVideoReady({ element: videoElement })\n }\n getLogger().debug('MCU is ready..')\n\n /**\n * Listen for the rootElement and the videoElement size changes and update the paddingWrapper.\n * The ResizeObserver and the video \"resize\" event make sure:\n * - The video should always maintain the aspect ratio.\n * - The video should not overflow the user passed rootElement.\n * - The video should not be cropped.\n */\n const rootElementResizeObserver = createRootElementResizeObserver({\n rootElement,\n video: videoElement,\n paddingWrapper,\n })\n rootElementResizeObserver.start()\n\n track.addEventListener('ended', () => {\n if (rootElementResizeObserver) {\n rootElementResizeObserver.stop()\n }\n })\n\n if (layersWrapper) {\n layersWrapper.style.display = 'block'\n }\n } catch (error) {\n getLogger().error('Handle video track error', error)\n }\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 { makeAudioElementSaga } from './features/mediaElements/mediaElementsSagas'\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 './video/RoomSession'\nimport { buildVideoElement } from './buildVideoElement'\nimport {\n createVideoRoomSessionObject,\n VideoRoomSessionConnection,\n} from './video/VideoRoomSession'\n\nexport interface Client<RoomSessionType = RoomSession>\n extends ClientContract<Client<RoomSessionType>, ClientEvents> {\n rooms: ClientAPI['rooms']\n chat: ClientAPI['chat']\n pubSub: ClientAPI['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 apply an overlay on top of each member. Default: `true`. */\n applyMemberOverlay?: boolean\n /** Whether to mirror the local video overlay. Default: `false`. */\n mirrorLocalVideoOverlay?: boolean\n /** Whether to stop the camera when the member is muted. Default: `true`. */\n stopCameraWhileMuted?: boolean\n /** Whether to stop the microphone when the member is muted. Default: `true`. */\n stopMicrophoneWhileMuted?: boolean\n /** Local media stream to override the local video and audio stream tracks */\n localStream?: MediaStream\n}\n\nexport class ClientAPI 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 applyMemberOverlay = true,\n mirrorLocalVideoOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n ...options\n } = makeRoomOptions\n\n // TODO: This might not be needed here. We can initiate these sagas in the BaseRoomSession constructor.\n const customSagas: Array<CustomSaga<VideoRoomSessionConnection>> = []\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 const room = createVideoRoomSessionObject({\n ...options,\n store: this.store,\n customSagas,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\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.on('room.subscribed', (params) => {\n const member = params.room_session.members?.find(\n (m) => m.id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\n })\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audio_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'audio_muted' in member) {\n member.audio_muted\n ? room.stopOutboundAudio()\n : room.restoreOutboundAudio()\n }\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n })\n }\n\n /**\n * Stop and Restore outbound video on video_muted event\n */\n if (stopCameraWhileMuted) {\n room.on('member.updated.video_muted', ({ member }) => {\n try {\n if (member.id === room.memberId && 'video_muted' in member) {\n member.video_muted\n ? room.stopOutboundVideo()\n : room.restoreOutboundVideo()\n }\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n })\n }\n\n return room\n },\n }\n }\n\n get chat() {\n if (!this._chat) {\n this._chat = ChatNamespace.createBaseChatObject<ChatClient>({\n store: this.store,\n })\n }\n return this._chat\n }\n\n get pubSub() {\n if (!this._pubSub) {\n this._pubSub = PubSubNamespace.createBasePubSubObject<PubSubClient>({\n store: this.store,\n })\n }\n return this._pubSub\n }\n\n /** @internal */\n get videoManager() {\n if (!this._videoManager) {\n this._videoManager = createVideoManagerObject(this.options)\n }\n return this._videoManager\n }\n\n /**\n * Reauthenticate with the SignalWire network using a new token\n * For now it returns void since with an invalid token the server\n * will close the connection right away so we can hook on the session\n * events in case. Need to improve it.\n *\n * @internal\n */\n reauthenticate(token: string) {\n this.store.dispatch(actions.reauthAction({ token }))\n }\n}\n","import { SWCloseEvent as CoreCloseEvent } from '@signalwire/core'\n\nconst SwCloseEvent =\n typeof CloseEvent === 'function' ? CloseEvent : CoreCloseEvent\n\nexport { SwCloseEvent }\n","import jwtDecode from 'jwt-decode'\nimport {\n BaseJWTSession,\n getLogger,\n SessionOptions,\n SwAuthorizationState,\n type SWCloseEvent,\n} from '@signalwire/core'\nimport { getStorage, sessionStorageManager } from './utils/storage'\nimport { SwCloseEvent } from './utils/CloseEvent'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\nexport class JWTSession extends BaseJWTSession {\n public WebSocketConstructor = WebSocket\n public CloseEventConstructor = SwCloseEvent\n public agent = process.env.SDK_PKG_AGENT!\n\n private tokenTyp: string\n\n constructor(public options: SessionOptions) {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<{ ch?: string; typ: string }>(options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n\n super({\n ...options,\n host: decodedJwt?.ch || options.host,\n })\n this.tokenTyp = decodedJwt.typ ?? 'VRT'\n }\n\n get allowReattach() {\n // @ts-expect-error\n return this.options?.reattach !== false && (this.isVRT() || this.isSAT())\n }\n\n override async retrieveRelayProtocol() {\n if (!this.allowReattach) {\n return ''\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Search protocol for', protocolKey)\n return getStorage()?.getItem(protocolKey) ?? ''\n }\n return ''\n }\n\n override async persistRelayProtocol() {\n if (!this.allowReattach) {\n return\n }\n\n const { protocolKey } = sessionStorageManager(this.options.token)\n if (protocolKey) {\n this.logger.trace('Persist protocol', protocolKey, this.relayProtocol)\n getStorage()?.setItem(protocolKey, this.relayProtocol)\n }\n }\n\n protected override async retrieveSwAuthorizationState() {\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n return getStorage()?.getItem(authStateKey) ?? ''\n }\n return ''\n }\n\n protected override async persistSwAuthorizationState(\n state: SwAuthorizationState\n ) {\n if (!this.allowReattach) {\n return\n }\n\n const { authStateKey } = sessionStorageManager(this.options.token)\n if (authStateKey) {\n this.logger.trace('Persist auth state', authStateKey, state)\n getStorage()?.setItem(authStateKey, state)\n }\n }\n\n protected override _onSocketClose(event: SWCloseEvent) {\n if (this.status === 'unknown' || this.status === 'disconnected') {\n const { protocolKey, authStateKey, callIdKey } = sessionStorageManager(\n this.options.token\n )\n this.logger.debug('Cleaning up storage')\n if (protocolKey) {\n this.logger.debug('Remove protocolKey', protocolKey)\n getStorage()?.removeItem(protocolKey)\n }\n if (authStateKey) {\n this.logger.debug('Remove authStateKey', authStateKey)\n getStorage()?.removeItem(authStateKey)\n }\n if (callIdKey) {\n this.logger.debug('Remove callIdKey', callIdKey)\n getStorage()?.removeItem(callIdKey)\n }\n }\n\n super._onSocketClose(event)\n }\n\n private isVRT() {\n return this.tokenTyp === 'VRT'\n }\n\n private isSAT() {\n return this.tokenTyp === 'SAT'\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<ClientEvents, ClientAPI, Client<RoomSessionType>>({\n store,\n Component: ClientAPI,\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/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'subscribe',\n 'publish',\n 'getMessages',\n 'getMembers',\n 'getMemberState',\n 'getAllowedChannels',\n 'setMemberState',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { Chat } from '@signalwire/js'\n *\n * const chatClient = new Chat.Client({\n * token: '<your_chat_token>', // get this from the REST APIs\n * })\n *\n * await chatClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * chatClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await chatClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a chat\n * Client object.\n */\nexport const Client = function (chatOptions: ClientOptions) {\n const client = createClient(chatOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.chat[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.chat, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (chatOptions: ClientOptions): Client }\n","import type {\n PubSubContract,\n ConsumerContract,\n UserOptions,\n PubSub as PubSubNamespace,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\n\nexport interface ClientApiEvents extends PubSubNamespace.BasePubSubApiEvents {}\n\n/** @ignore */\nexport interface ClientFullState extends Client {}\nexport interface Client\n extends PubSubContract,\n Omit<ConsumerContract<ClientApiEvents, ClientFullState>, 'subscribe'> {}\n\n/** @ignore */\nexport interface ClientOptions extends UserOptions {}\n\ntype ClientMethods = keyof Client\nconst INTERCEPTED_METHODS: ClientMethods[] = [\n 'getAllowedChannels',\n 'subscribe',\n 'publish',\n]\n\n/**\n * You can use the Client object to build a messaging system into the browser.\n *\n * Example usage:\n *\n * ```js\n * import { PubSub } from '@signalwire/js'\n *\n * const pubSubClient = new PubSub.Client({\n * token: '<your pubSub token>', // get this from the REST APIs\n * })\n *\n * await pubSubClient.subscribe([ 'mychannel1', 'mychannel2' ])\n *\n * pubSubClient.on('message', (message) => {\n * console.log(\"Received\", message.content,\n * \"on\", message.channel,\n * \"at\", message.publishedAt)\n * })\n *\n * await pubSubClient.publish({\n * channel: 'mychannel1',\n * content: 'hello world'\n * })\n * ```\n *\n * ## Events\n *\n * Please see {@link ClientApiEvents} for the list of events emitted by a pubSub\n * Client object.\n */\nexport const Client = function (pubSubOptions: ClientOptions) {\n const client = createClient(pubSubOptions)\n\n const createInterceptor = <K extends keyof Client>(prop: K) => {\n return async (...params: Parameters<Client[K]>) => {\n await client.connect()\n\n // @ts-expect-error\n return client.pubSub[prop](...params)\n }\n }\n\n const interceptors = {\n _session: client,\n disconnect: () => client.disconnect(),\n } as const\n\n return new Proxy<Client>(client.pubSub, {\n get(target: Client, prop: keyof Client, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (INTERCEPTED_METHODS.includes(prop)) {\n return createInterceptor(prop)\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (pubSubOptions: ClientOptions): Client }\n","import { PubSub } from '@signalwire/core'\nimport { PagingCursor } from '../utils/interfaces'\nimport PubSubMessage = PubSub.PubSubMessage\n\nexport * from './Client'\n\nexport {\n PubSubMessage,\n PagingCursor\n}\n","import { AuthError, HttpError } from '@signalwire/core'\n\ninterface InternalHttpResponse<T> extends Response {\n parsedBody?: T\n}\n\nasync function http<T>(\n input: string,\n init: RequestInit | undefined\n): Promise<InternalHttpResponse<T>> {\n const response: InternalHttpResponse<T> = await fetch(input, init)\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError(response.status, 'Unauthorized')\n }\n\n let errorResponse\n try {\n errorResponse = await response.json()\n } catch (e) {}\n\n const errorMessage = errorResponse?.errors\n ? JSON.stringify(errorResponse.errors)\n : 'Not Found'\n\n throw new HttpError(response.status, errorMessage, errorResponse)\n }\n\n try {\n // might throw if body is empty\n response.parsedBody = await response.json()\n } catch (e) {}\n\n return response\n}\n\ninterface CreateHttpClientOptions extends RequestInit {\n baseUrl: string\n /**\n * Timeout in milliseconds\n */\n timeout?: number\n}\n\ninterface HttpClientRequestInit extends Omit<RequestInit, 'body'> {\n body?: Record<string, unknown>\n searchParams?: Record<string, any>\n}\n\nexport type CreateHttpClient = ReturnType<typeof createHttpClient>\n\nexport const createHttpClient = (\n { baseUrl, timeout = 30000, ...globalOptions }: CreateHttpClientOptions,\n fetcher = http\n) => {\n const apiClient = async <T>(\n path: string,\n options?: HttpClientRequestInit\n ): Promise<{ body: T }> => {\n const headers = {\n ...(options?.body ? { 'Content-Type': 'application/json' } : {}),\n ...globalOptions.headers,\n ...options?.headers,\n }\n\n const reqInit = getRequestInit({\n ...globalOptions,\n ...options,\n headers,\n })\n // reqInit.mode = 'no-cors'\n // reqInit.credentials = 'include'\n\n let timerId\n if (timeout) {\n const controller = new AbortController()\n const signal = controller.signal\n\n reqInit.signal = signal\n\n timerId = setTimeout(() => {\n controller.abort()\n }, timeout)\n }\n\n try {\n const response = await fetcher<T>(\n getUrl({\n path,\n baseUrl,\n searchParams: options?.searchParams,\n }),\n reqInit\n )\n\n return { body: response.parsedBody as T }\n } catch (e) {\n throw e\n } finally {\n timerId && clearTimeout(timerId)\n }\n }\n\n return apiClient\n}\n\nconst getBody = (body: unknown) => {\n return typeof body === 'string' ? body : JSON.stringify(body)\n}\n\nconst getRequestInit = (options: any): RequestInit => {\n return Object.entries(options).reduce((reducer, [key, value]) => {\n if (key === 'body') {\n return {\n ...reducer,\n body: getBody(value),\n }\n } else if (value != undefined) {\n return {\n ...reducer,\n [key]: value,\n }\n }\n\n return reducer\n }, {} as RequestInit)\n}\n\nconst getUrl = ({\n path,\n baseUrl,\n searchParams,\n}: {\n baseUrl: string\n path: string\n searchParams?: Record<string, any>\n}) => {\n const url = new URL(path, baseUrl)\n\n if (searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => {\n if (value != undefined) {\n url.searchParams.append(key, value)\n }\n })\n }\n return url.toString()\n}\n","import { PaginatedResponse } from '../fabric/interfaces'\nimport { CreateHttpClient } from '../fabric/createHttpClient'\n\nexport function buildPaginatedResult<T>(\n body: PaginatedResponse<T>,\n client: CreateHttpClient\n) {\n const anotherPage = async (url?: string) => {\n if (!url) return Promise.resolve(undefined)\n const { body } = await client<PaginatedResponse<T>>(url)\n return buildPaginatedResult<T>(body, client)\n }\n\n return {\n data: body.data,\n self: async () => {\n const { self } = body.links\n return anotherPage(self)\n },\n nextPage: async () => {\n const { next } = body.links\n return anotherPage(next)\n },\n prevPage: async () => {\n const { prev } = body.links\n return anotherPage(prev)\n },\n firstPage: async () => {\n const { first } = body.links\n return anotherPage(first)\n },\n hasNext: Boolean(body.links.next),\n hasPrev: Boolean(body.links.prev),\n }\n}\n","/**\n * Constructs a URL with query parameters.\n *\n * @param path The base path of the URL.\n * @param queryParams An instance of URLSearchParams containing all query parameters.\n * @returns The constructed URL with query parameters.\n */\nexport function makeQueryParamsUrls(\n path: string,\n queryParams: URLSearchParams\n): string {\n const queryString = queryParams.toString()\n return queryString ? `${path}?${queryString}` : path\n}\n","import jwtDecode from 'jwt-decode'\nimport { getLogger, HttpError, type UserOptions } from '@signalwire/core'\nimport type {\n GetAddressResponse,\n GetAddressesParams,\n RegisterDeviceParams,\n UnregisterDeviceParams,\n RegisterDeviceResponse,\n GetAddressParams,\n GetAddressResult,\n GetAddressesResponse,\n GetAddressesResult,\n RegisterDeviceResult,\n GetSubscriberInfoResponse,\n GetSubscriberInfoResult,\n} from './interfaces'\nimport { CreateHttpClient, createHttpClient } from './createHttpClient'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport {\n isGetAddressByIdParams,\n isGetAddressByNameParams,\n isGetAddressesResponse,\n} from './utils/typeGuard'\nimport { HTTPClientContract } from './interfaces/httpClient'\n\ntype JWTHeader = { ch?: string; typ?: string }\n\n// TODO: extends from a Base class to share from core\nexport class HTTPClient implements HTTPClientContract {\n private httpClient: CreateHttpClient\n\n constructor(public options: UserOptions) {\n this.httpClient = createHttpClient({\n baseUrl: `https://${this.httpHost}`,\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n })\n }\n\n get fetch(): CreateHttpClient {\n return this.httpClient\n }\n\n get httpHost() {\n let decodedJwt: JWTHeader = {}\n try {\n decodedJwt = jwtDecode<JWTHeader>(this.options.token, {\n header: true,\n })\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n getLogger().debug('[JWTSession] error decoding the JWT')\n }\n }\n // Shouldn't this be other way around?\n const host = this.options.host || decodedJwt?.ch\n if (!host) {\n return 'fabric.signalwire.com'\n }\n return `fabric.${host.split('.').splice(1).join('.')}`\n }\n\n public async getAddress(params: GetAddressParams): Promise<GetAddressResult> {\n let path = '/api/fabric/addresses'\n if (isGetAddressByNameParams(params)) {\n path = `${path}?name=${params.name}`\n } else if (isGetAddressByIdParams(params)) {\n path = `${path}/${params.id}`\n }\n\n const { body } = await this.httpClient<\n GetAddressResponse | GetAddressesResponse\n >(path)\n if (isGetAddressesResponse(body)) {\n // FIXME until the server handles a index lookup by name we need to handle it as a search result\n if (!body.data[0]) throw new HttpError(404, 'Not Found')\n return body.data[0]\n }\n return body\n }\n\n public async getAddresses(\n params?: GetAddressesParams\n ): Promise<GetAddressesResult> {\n const { type, displayName, pageSize, sortBy, sortOrder } = params || {}\n\n let path = '/api/fabric/addresses'\n\n const queryParams = new URLSearchParams()\n if (type) {\n queryParams.append('type', type)\n }\n if (displayName) {\n queryParams.append('display_name', displayName)\n }\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n if (sortBy) {\n queryParams.append('sort_by', sortBy)\n }\n\n if (sortOrder) {\n queryParams.append('sort_order', sortOrder)\n }\n\n const queryUrl = makeQueryParamsUrls(path, queryParams)\n getLogger().debug(`[getAddresses] query URL ${queryUrl}`)\n const { body } = await this.httpClient<GetAddressesResponse>(queryUrl)\n\n return buildPaginatedResult(body, this.httpClient)\n }\n\n public async registerDevice(\n params: RegisterDeviceParams\n ): Promise<RegisterDeviceResult> {\n const { deviceType, deviceToken } = params\n\n const path = '/subscriber/devices' as const\n const { body } = await this.httpClient<RegisterDeviceResponse>(path, {\n method: 'POST',\n body: {\n device_type: deviceType,\n device_token: deviceToken,\n },\n })\n\n return body\n }\n\n public async unregisterDevice(params: UnregisterDeviceParams) {\n const { id } = params\n\n const path = `/subscriber/devices/${id}` as const\n await this.httpClient<void>(path, {\n method: 'DELETE',\n })\n }\n\n public async getSubscriberInfo(): Promise<GetSubscriberInfoResult> {\n let path = '/api/fabric/subscriber/info'\n\n const { body } = await this.httpClient<GetSubscriberInfoResponse>(path)\n\n return body\n }\n}\n","import {\n GetAddressParams,\n GetAddressByNameParams,\n GetAddressByIdParams,\n GetAddressResponse,\n GetAddressesResponse,\n} from '../interfaces'\n\nexport const isGetAddressByNameParams = (\n obj: GetAddressParams\n): obj is GetAddressByNameParams => {\n return obj && 'name' in obj\n}\n\nexport const isGetAddressByIdParams = (\n obj: GetAddressParams\n): obj is GetAddressByIdParams => {\n return obj && 'id' in obj\n}\n\nexport const isGetAddressResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressResponse => {\n return obj && 'id' in obj && 'name' in obj\n}\n\nexport const isGetAddressesResponse = (\n obj: GetAddressResponse | GetAddressesResponse\n): obj is GetAddressesResponse => {\n return obj && 'data' in obj\n}\n","import { Conversation } from './Conversation'\nimport {\n ConversationAPIGetMessagesParams,\n ConversationAPISendMessageParams,\n ConversationContract,\n ConversationResponse,\n} from './interfaces'\n\nexport class ConversationAPI implements ConversationContract {\n constructor(\n private conversation: Conversation,\n private payload: ConversationResponse\n ) {}\n\n get id() {\n return this.payload.id\n }\n\n get addressId() {\n return this.payload.address_id\n }\n\n get createdAt() {\n return this.payload.created_at\n }\n\n get lastMessageAt() {\n return this.payload.last_message_at\n }\n\n get metadata() {\n return this.payload.metadata\n }\n\n get name() {\n return this.payload.name\n }\n\n sendMessage(params: ConversationAPISendMessageParams) {\n return this.conversation.sendMessage({\n addressId: this.id,\n text: params.text,\n })\n }\n\n getMessages(params?: ConversationAPIGetMessagesParams) {\n return this.conversation.getConversationMessages({\n addressId: this.id,\n ...params,\n })\n }\n}\n","import { type ConversationEventParams } from '@signalwire/core'\nimport { HTTPClient } from './HTTPClient'\nimport { WSClient } from './WSClient'\nimport type {\n GetConversationsResponse,\n GetMessagesParams,\n GetConversationsParams,\n GetConversationMessagesParams,\n GetConversationMessagesResponse,\n ConversationMessage,\n SendConversationMessageParams,\n SendConversationMessageResponse,\n ConversationChatMessage,\n GetMessagesResult,\n GetConversationMessagesResult,\n SendConversationMessageResult,\n GetConversationChatMessageParams,\n GetConversationsResult,\n ConversationSubscribeCallback,\n ConversationChatMessagesSubscribeParams,\n ConversationChatMessagesSubscribeResult,\n GetConversationChatMessageResult,\n JoinConversationParams,\n JoinConversationResponse,\n JoinConversationResult,\n ConversationSubscribeResult,\n} from './interfaces'\nimport { conversationWorker } from './workers'\nimport { buildPaginatedResult } from '../utils/paginatedResult'\nimport { makeQueryParamsUrls } from '../utils/makeQueryParamsUrl'\nimport { ConversationAPI } from './ConversationAPI'\n\nconst DEFAULT_CHAT_MESSAGES_PAGE_SIZE = 10\n\ninterface ConversationOptions {\n httpClient: HTTPClient\n wsClient: WSClient\n}\n\nexport class Conversation {\n private httpClient: HTTPClient\n private wsClient: WSClient\n private callbacks = new Set<ConversationSubscribeCallback>()\n private chatSubscriptions: Record<\n string,\n Set<ConversationSubscribeCallback>\n > = {}\n\n constructor(options: ConversationOptions) {\n this.httpClient = options.httpClient\n this.wsClient = options.wsClient\n\n this.wsClient.runWorker('conversationWorker', {\n worker: conversationWorker,\n initialState: {\n conversation: this,\n },\n })\n }\n\n /** @internal */\n handleEvent(event: ConversationEventParams) {\n if (event.subtype === 'chat') {\n const chatCallbacks = this.chatSubscriptions[event.conversation_id]\n if (chatCallbacks?.size) {\n chatCallbacks.forEach((cb) => cb(event))\n }\n }\n\n if (this.callbacks.size) {\n this.callbacks.forEach((callback) => {\n callback(event)\n })\n }\n }\n\n public async sendMessage(\n params: SendConversationMessageParams\n ): Promise<SendConversationMessageResult> {\n try {\n const { addressId, text } = params\n const path = '/api/fabric/messages'\n const { body } =\n await this.httpClient.fetch<SendConversationMessageResponse>(path, {\n method: 'POST',\n body: {\n conversation_id: addressId,\n text,\n },\n })\n return body\n } catch (error) {\n throw new Error('Error sending message to conversation!', error)\n }\n }\n\n public async getConversations(\n params?: GetConversationsParams\n ): Promise<GetConversationsResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/conversations'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } = await this.httpClient.fetch<GetConversationsResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n const self = this\n const data = body.data.map(\n (conversation) => new ConversationAPI(self, conversation)\n )\n return buildPaginatedResult({ ...body, data }, this.httpClient.fetch)\n } catch (error) {\n throw new Error('Error fetching the conversation history!', error)\n }\n }\n\n public async getMessages(\n params?: GetMessagesParams\n ): Promise<GetMessagesResult> {\n try {\n const { pageSize } = params || {}\n\n const path = '/api/fabric/messages'\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getConversationMessages(\n params: GetConversationMessagesParams\n ): Promise<GetConversationMessagesResult> {\n try {\n const { addressId, pageSize } = params || {}\n\n const path = `/api/fabric/conversations/${addressId}/messages`\n const queryParams = new URLSearchParams()\n if (pageSize) {\n queryParams.append('page_size', pageSize.toString())\n }\n\n const { body } =\n await this.httpClient.fetch<GetConversationMessagesResponse>(\n makeQueryParamsUrls(path, queryParams)\n )\n\n return buildPaginatedResult<ConversationMessage>(\n body,\n this.httpClient.fetch\n )\n } catch (error) {\n throw new Error('Error fetching the conversation messages!', error)\n }\n }\n\n public async getChatMessages(\n params: GetConversationChatMessageParams\n ): Promise<GetConversationChatMessageResult> {\n const { addressId, pageSize = DEFAULT_CHAT_MESSAGES_PAGE_SIZE } = params\n\n const fetchChatMessagesPage = async (\n fetcherFn?: () => Promise<GetConversationChatMessageResult | undefined>,\n cached: ConversationMessage[] = [],\n isDirectionNext = true\n ): Promise<GetConversationChatMessageResult> => {\n const chatMessages = [...cached]\n const isValid = (item: ConversationMessage) =>\n item.conversation_id === addressId && item.subtype === 'chat'\n\n let conversationMessages: GetConversationChatMessageResult | undefined\n conversationMessages = await fetcherFn?.()\n let chatOnlyMessages = conversationMessages?.data.filter(isValid) ?? []\n let remaining = pageSize - chatMessages.length\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n\n while (chatMessages.length < pageSize && conversationMessages?.hasNext) {\n conversationMessages = await (isDirectionNext\n ? conversationMessages?.nextPage()\n : conversationMessages?.prevPage())\n if (!conversationMessages || !conversationMessages.data.length) {\n //over caution in case of a server error, to prevent an infinite loop.\n break\n }\n\n remaining = pageSize - chatMessages.length\n chatOnlyMessages = conversationMessages.data.filter(isValid)\n for (\n let idx = 0;\n idx < chatOnlyMessages.length && idx < remaining;\n idx++\n ) {\n chatMessages.push(chatOnlyMessages[idx])\n }\n }\n\n let missingReturns: ConversationMessage[] = []\n if (remaining < chatOnlyMessages.length) {\n missingReturns = chatOnlyMessages.slice(remaining)\n }\n\n return {\n data: chatMessages as ConversationChatMessage[],\n hasNext: !!conversationMessages?.hasNext || !!cached.length,\n hasPrev: !!conversationMessages?.hasPrev,\n\n nextPage: () =>\n fetchChatMessagesPage(conversationMessages?.nextPage, missingReturns),\n prevPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.prevPage,\n missingReturns,\n false\n ),\n self: () =>\n fetchChatMessagesPage(conversationMessages?.self, missingReturns),\n firstPage: () =>\n fetchChatMessagesPage(\n conversationMessages?.firstPage,\n missingReturns\n ),\n }\n }\n\n return fetchChatMessagesPage(\n () =>\n this.getConversationMessages({\n addressId,\n pageSize,\n }) as Promise<GetConversationChatMessageResult>\n )\n }\n\n public async subscribe(\n callback: ConversationSubscribeCallback\n ): Promise<ConversationSubscribeResult> {\n this.callbacks.add(callback)\n\n return {\n unsubscribe: () => this.callbacks.delete(callback),\n }\n }\n\n public async subscribeChatMessages(\n params: ConversationChatMessagesSubscribeParams\n ): Promise<ConversationChatMessagesSubscribeResult> {\n const { addressId, onMessage } = params\n\n if (!(addressId in this.chatSubscriptions)) {\n this.chatSubscriptions[addressId] = new Set()\n }\n\n this.chatSubscriptions[addressId].add(onMessage)\n return {\n unsubscribe: () => this.chatSubscriptions[addressId].delete(onMessage),\n }\n }\n\n public async joinConversation(\n params: JoinConversationParams\n ): Promise<JoinConversationResult> {\n try {\n const { addressId } = params\n const path = '/api/fabric/conversations/join'\n const { body } = await this.httpClient.fetch<JoinConversationResponse>(\n path,\n {\n method: 'POST',\n body: {\n conversation_id: addressId,\n },\n }\n )\n return body\n } catch (error) {\n throw new Error('Error joining a conversation!', error)\n }\n }\n}\n","import { FabricRoomSession } from './FabricRoomSession'\nimport {\n CallParams,\n IncomingCallHandlers,\n IncomingCallNotification,\n IncomingInvite,\n IncomingInviteWithSource,\n} from './interfaces'\nimport { WSClient } from './WSClient'\n\ninterface IncomingCallManagerOptions {\n client: WSClient\n buildInboundCall: WSClient['buildInboundCall']\n executeVertoBye: WSClient['executeVertoBye']\n}\n\nexport class IncomingCallManager {\n private _client: WSClient\n private _pendingInvites: Record<string, IncomingInvite> = {}\n private _handlers: IncomingCallHandlers = {}\n\n constructor(private options: IncomingCallManagerOptions) {\n this._client = options.client\n }\n\n private _buildNotification(invite: IncomingInvite): IncomingCallNotification {\n const accept = async (params: CallParams) => {\n return new Promise<FabricRoomSession>((resolve, reject) => {\n delete this._pendingInvites[invite.callID]\n try {\n const call = this.options.buildInboundCall(invite, params)\n call.answer()\n\n resolve(call)\n } catch (e) {\n reject(e)\n }\n })\n }\n\n const reject = () => {\n delete this._pendingInvites[invite.callID]\n return this.options.executeVertoBye(invite.callID, invite.nodeId)\n }\n\n return {\n invite: {\n details: invite,\n accept: (params) => accept(params),\n reject: () => reject(),\n },\n }\n }\n\n setNotificationHandlers(handlers: IncomingCallHandlers) {\n this._handlers.all = handlers.all\n if (\n (handlers.pushNotification &&\n this._handlers.all != handlers.pushNotification) ||\n !handlers.pushNotification\n ) {\n this._handlers.pushNotification = handlers.pushNotification\n }\n if (\n (handlers.websocket && this._handlers.all != handlers.websocket) ||\n !handlers.websocket\n ) {\n this._handlers.websocket = handlers.websocket\n }\n }\n\n handleIncomingInvite(incomingInvite: IncomingInviteWithSource) {\n if (incomingInvite.callID in this._pendingInvites) {\n this._client.logger.debug(\n `skiping nottification for pending invite to callID: ${incomingInvite.callID}`\n )\n return\n }\n this._pendingInvites[incomingInvite.callID] = incomingInvite\n\n if (!(this._handlers.all || this._handlers[incomingInvite.source])) {\n this._client.logger.warn('Skiping nottification due to no listeners')\n return\n }\n\n const notification = this._buildNotification(incomingInvite)\n\n this._handlers.all?.(notification)\n const handler = this._handlers[incomingInvite.source]\n handler?.(notification)\n }\n}\n","import {\n RPCReauthenticate,\n RPCReauthenticateParams,\n SATAuthorization,\n SessionOptions,\n UNIFIED_CONNECT_VERSION,\n} from '@signalwire/core'\nimport { JWTSession } from '../JWTSession'\n\n/**\n * SAT Session is for the Call Fabric SDK\n */\nexport class SATSession extends JWTSession {\n public connectVersion = UNIFIED_CONNECT_VERSION\n\n constructor(public options: SessionOptions) {\n super(options)\n }\n\n override get signature() {\n if (this._rpcConnectResult) {\n const { authorization } = this._rpcConnectResult\n return (authorization as SATAuthorization).jti\n }\n return undefined\n }\n\n override async _checkTokenExpiration() {\n /**\n * noop\n *\n * The Call Fabric SDK does not attach any timer and\n * does not emit any events to inform the user about the token expiry.\n */\n }\n\n /**\n * Reauthenticate with the SignalWire Network using a newer SAT.\n * If the session has expired, this will reconnect it.\n * @return Promise<void>\n */\n override async reauthenticate() {\n this.logger.debug('Session Reauthenticate', {\n ready: this.ready,\n expired: this.expired,\n })\n if (!this.ready || this.expired) {\n return this.connect()\n }\n\n const params: RPCReauthenticateParams = {\n project: this._rpcConnectResult.authorization.project_id,\n jwt_token: this.options.token,\n }\n\n try {\n const reauthResponse = await this.execute(RPCReauthenticate(params))\n\n this._rpcConnectResult = {\n ...this._rpcConnectResult,\n ...reauthResponse,\n }\n } catch (error) {\n throw error\n }\n }\n}\n","import {\n actions,\n BaseClient,\n CallJoinedEventParams as InternalCallJoinedEventParams,\n VertoBye,\n VertoSubscribe,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { MakeRoomOptions } from '../video'\nimport { createFabricRoomSessionObject } from './FabricRoomSession'\nimport { buildVideoElement } from '../buildVideoElement'\nimport {\n CallParams,\n DialParams,\n FabricRoomSession,\n IncomingInvite,\n OnlineParams,\n HandlePushNotificationParams,\n WSClientOptions,\n HandlePushNotificationResult,\n} from './interfaces'\nimport { IncomingCallManager } from './IncomingCallManager'\nimport { wsClientWorker } from './workers'\nimport { createWSClient } from './createWSClient'\nimport { WSClientContract } from './interfaces/wsClient'\n\nexport class WSClient extends BaseClient<{}> implements WSClientContract {\n private _incomingCallManager: IncomingCallManager\n private _disconnected: boolean = false\n\n constructor(private wsClientOptions: WSClientOptions) {\n const client = createWSClient(wsClientOptions)\n super(client)\n\n this._incomingCallManager = new IncomingCallManager({\n client: this,\n buildInboundCall: this.buildInboundCall.bind(this),\n executeVertoBye: this.executeVertoBye.bind(this),\n })\n\n this.runWorker('wsClientWorker', {\n worker: wsClientWorker,\n initialState: {\n handleIncomingInvite: (invite: IncomingInvite) => {\n this._incomingCallManager.handleIncomingInvite({\n source: 'websocket',\n ...invite,\n })\n },\n },\n })\n }\n\n private makeFabricObject(makeRoomOptions: MakeRoomOptions) {\n const {\n rootElement,\n applyLocalVideoOverlay = true,\n applyMemberOverlay = true,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n mirrorLocalVideoOverlay = true,\n ...options\n } = makeRoomOptions\n\n const room = createFabricRoomSessionObject({\n ...options,\n store: this.store,\n })\n\n /**\n * If the user provides a `rootElement` we'll\n * automatically handle the Video element for them\n */\n if (rootElement) {\n try {\n buildVideoElement({\n applyLocalVideoOverlay,\n applyMemberOverlay,\n mirrorLocalVideoOverlay,\n room,\n rootElement,\n })\n } catch (error) {\n this.logger.error('Unable to build the video element automatically')\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 const joinMutedHandler = (\n params: InternalCallJoinedEventParams | VideoRoomSubscribedEventParams\n ) => {\n const member = params.room_session.members?.find(\n // @ts-expect-error FIXME:\n (m) => m.id === room.memberId || m.member_id === room.memberId\n )\n\n if (member?.audio_muted) {\n try {\n room.stopOutboundAudio()\n } catch (error) {\n this.logger.error('Error handling audio_muted', error)\n }\n }\n\n if (member?.video_muted) {\n try {\n room.stopOutboundVideo()\n } catch (error) {\n this.logger.error('Error handling video_muted', error)\n }\n }\n }\n\n room.on('room.subscribed', joinMutedHandler)\n\n /**\n * Stop and Restore outbound audio on audio_muted event\n */\n if (stopMicrophoneWhileMuted) {\n room.on('member.updated.audioMuted', ({ member }) => {\n try {\n if (member.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.videoMuted', ({ member }) => {\n try {\n if (member.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 private buildOutboundCall(params: DialParams & { attach?: boolean }) {\n const [pathname, query] = params.to.split('?')\n if (!pathname) {\n throw new Error('Invalid destination address')\n }\n\n let video = false\n let negotiateVideo = false\n\n const queryParams = new URLSearchParams(query)\n const channel = queryParams.get('channel')\n if (channel === 'video') {\n video = true\n negotiateVideo = true\n }\n\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? video,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? negotiateVideo,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n destinationNumber: params.to,\n nodeId: params.nodeId,\n attach: params.attach ?? false,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private buildInboundCall(payload: IncomingInvite, params: CallParams) {\n const call = this.makeFabricObject({\n audio: params.audio ?? true,\n video: params.video ?? true,\n negotiateAudio: params.negotiateAudio ?? true,\n negotiateVideo: params.negotiateVideo ?? true,\n rootElement: params.rootElement || this.wsClientOptions.rootElement,\n applyLocalVideoOverlay: true,\n applyMemberOverlay: true,\n stopCameraWhileMuted: true,\n stopMicrophoneWhileMuted: true,\n watchMediaPackets: false,\n nodeId: payload.nodeId,\n remoteSdp: payload.sdp,\n prevCallId: payload.callID,\n disableUdpIceServers: params.disableUdpIceServers || false,\n userVariables: params.userVariables || this.wsClientOptions.userVariables,\n })\n\n // WebRTC connection left the room.\n call.once('destroy', () => {\n this.logger.debug('RTC Connection Destroyed')\n call.destroy()\n })\n\n this.session.once('session.disconnected', () => {\n this.logger.debug('Session Disconnected')\n call.destroy()\n this.destroy()\n })\n\n // TODO: This is for memberList.updated event and it is not yet supported in CF SDK\n // @ts-expect-error\n call.attachPreConnectWorkers()\n return call\n }\n\n private async executeVertoBye(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n message: VertoBye({\n cause: 'USER_BUSY',\n causeCode: '17',\n dialogParams: { callID: callId },\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n private async executeVertoSubscribe(callId: string, nodeId: string) {\n try {\n return await this.execute<unknown, void>({\n method: 'webrtc.verto',\n params: {\n callID: callId,\n node_id: nodeId,\n subscribe: [],\n message: VertoSubscribe({\n sessid: callId,\n eventChannel: [],\n }),\n },\n })\n } catch (error) {\n this.logger.warn('The call is not available anymore', callId)\n throw error\n }\n }\n\n public override disconnect() {\n return new Promise<void>((resolve, _reject) => {\n if (this._disconnected) {\n resolve()\n }\n\n this.session.once('session.disconnected', () => {\n this.destroy()\n resolve()\n this._disconnected = true\n })\n\n super.disconnect()\n })\n }\n\n public async dial(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall(params)\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and dial a call', error)\n reject(error)\n }\n })\n }\n\n public async reattach(params: DialParams) {\n return new Promise<FabricRoomSession>(async (resolve, reject) => {\n try {\n const call = this.buildOutboundCall({ ...params, attach: true })\n resolve(call)\n } catch (error) {\n this.logger.error('Unable to connect and reattach a call', error)\n reject(error)\n }\n })\n }\n\n public handlePushNotification(params: HandlePushNotificationParams) {\n return new Promise<HandlePushNotificationResult>(\n async (resolve, reject) => {\n const { decrypted, type } = params\n if (type !== 'call_invite') {\n this.logger.warn('Unknown notification type', params)\n reject('Unknown notification type')\n }\n this.logger.debug('handlePushNotification', params)\n const {\n params: { params: payload },\n node_id: nodeId,\n } = decrypted\n try {\n // Catch the error temporarly\n try {\n // Send verto.subscribe\n await this.executeVertoSubscribe(payload.callID, nodeId)\n } catch (error) {\n this.logger.warn('Verto Subscribe', error)\n }\n\n this._incomingCallManager.handleIncomingInvite({\n source: 'pushNotification',\n nodeId,\n ...payload,\n })\n\n resolve({ resultType: 'inboundCall' })\n } catch (error) {\n reject(error)\n }\n }\n )\n }\n\n public updateToken(token: string) {\n return new Promise<void>((resolve, reject) => {\n this.session.once('session.auth_error', (error) => {\n reject(error)\n })\n this.session.once('session.connected', () => {\n resolve()\n })\n this.store.dispatch(actions.reauthAction({ token }))\n })\n }\n\n /**\n * Mark the client as 'online' to receive calls over WebSocket\n */\n public async online({ incomingCallHandlers }: OnlineParams) {\n this._incomingCallManager.setNotificationHandlers(incomingCallHandlers)\n return this.execute<unknown, void>({\n method: 'subscriber.online',\n params: {},\n })\n }\n\n /**\n * Mark the client as 'offline' to receive calls over WebSocket\n */\n public offline() {\n this._incomingCallManager.setNotificationHandlers({})\n return this.execute<unknown, void>({\n method: 'subscriber.offline',\n params: {},\n })\n }\n}\n","import { configureStore } from '@signalwire/core'\nimport { SATSession } from './SATSession'\nimport { WSClientOptions } from './interfaces'\n\nexport const createWSClient = (options: WSClientOptions) => {\n const store = configureStore({\n userOptions: options,\n SessionConstructor: SATSession,\n })\n\n return { ...options, store }\n}\n","import { HTTPClient } from './HTTPClient'\nimport { Conversation } from './Conversation'\nimport { SignalWireClient, SignalWireClientParams } from './interfaces'\nimport { WSClient } from './WSClient'\n\nexport const SignalWire = (() => {\n let instance: Promise<SignalWireClient> | null = null\n\n return (params: SignalWireClientParams): Promise<SignalWireClient> => {\n if (!instance) {\n instance = new Promise<SignalWireClient>(async (resolve, reject) => {\n try {\n const wsClient = new WSClient(params)\n const httpClient = new HTTPClient(params)\n const conversation = new Conversation({ httpClient, wsClient })\n\n // Connect the WebSocket and authenticate the user\n await wsClient.connect()\n\n resolve({\n registerDevice: httpClient.registerDevice.bind(httpClient),\n unregisterDevice: httpClient.unregisterDevice.bind(httpClient),\n getSubscriberInfo: httpClient.getSubscriberInfo.bind(httpClient),\n disconnect: async () => {\n await wsClient.disconnect()\n instance = null // Reset the singleton instance on disconnect\n },\n online: wsClient.online.bind(wsClient),\n offline: wsClient.offline.bind(wsClient),\n dial: wsClient.dial.bind(wsClient),\n reattach: wsClient.reattach.bind(wsClient),\n handlePushNotification:\n wsClient.handlePushNotification.bind(wsClient),\n updateToken: wsClient.updateToken.bind(wsClient),\n address: {\n getAddresses: httpClient.getAddresses.bind(httpClient),\n getAddress: httpClient.getAddress.bind(httpClient),\n },\n conversation: {\n getConversations:\n conversation.getConversations.bind(conversation),\n getMessages: conversation.getMessages.bind(conversation),\n getConversationMessages:\n conversation.getConversationMessages.bind(conversation),\n subscribe: conversation.subscribe.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n chat: {\n getMessages: conversation.getChatMessages.bind(conversation),\n subscribe: conversation.subscribeChatMessages.bind(conversation),\n sendMessage: conversation.sendMessage.bind(conversation),\n join: conversation.joinConversation.bind(conversation),\n },\n // @ts-expect-error For debugging purposes\n on: wsClient.on.bind(wsClient),\n off: wsClient.off.bind(wsClient),\n __httpClient: httpClient,\n __wsClient: wsClient,\n })\n } catch (error) {\n reject(error)\n }\n }).catch((error) => {\n /**\n * Reset the instance to null explicitly since\n * Promises are immutable: once rejected, a Promise remains rejected forever.\n */\n instance = null\n throw error\n })\n }\n return instance\n }\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({\n ...userOptions,\n })\n await client.connect()\n\n if (!client) {\n return\n }\n\n /**\n * Since `makeRoomObject` now only accepts a\n * `rootElement` the following is to preserve backwards\n * compatibility with the previous syntax\n */\n let rootElement: HTMLElement | undefined\n if (rootElementId) {\n const el = document.getElementById(rootElementId)\n\n if (el) {\n rootElement = el\n } else {\n rootElement = document.body\n\n getLogger().warn(\n `We couldn't find an element with id: ${rootElementId}: using 'document.body' instead.`\n )\n }\n }\n\n const roomObject = client.rooms.makeRoomObject({\n audio,\n video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n })\n\n // WebRTC connection left the room.\n roomObject.once('destroy', () => {\n roomObject.emit('room.left')\n client.disconnect()\n })\n\n const join = () => {\n return new Promise(async (resolve, reject) => {\n try {\n roomObject.once('room.subscribed', (_payload) => {\n resolve(roomObject)\n })\n\n await roomObject.join()\n } catch (error) {\n getLogger().error('Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const room = new Proxy(roomObject, {\n get(target: any, prop: any, receiver: any) {\n if (prop === 'join') {\n return join\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n\n if (autoJoin) {\n try {\n await room.join()\n resolve(room)\n } catch (error) {\n reject(error)\n }\n } else {\n resolve(room)\n }\n })\n}\n","import {\n UserOptions,\n getLogger,\n VideoAuthorization,\n VideoRoomSubscribedEventParams,\n} from '@signalwire/core'\nimport { createClient } from '../createClient'\nimport { checkMediaParams, getJoinMediaParams } from '../utils/roomSession'\nimport type { MakeRoomOptions } from '../Client'\nimport type {\n BaseRoomSessionJoinParams,\n RoomSessionObjectEvents,\n} from '../utils/interfaces'\nimport { getStorage, sessionStorageManager } from '../utils/storage'\nimport { VideoRoomSession } from './VideoRoomSession'\n\n/**\n * List of properties/methods the user shouldn't be able to\n * use until they sucessfully call `roomSession.join()`.\n */\nexport const UNSAFE_PROP_ACCESS = [\n 'audioMute',\n 'audioUnmute',\n 'deaf',\n 'getLayouts',\n 'getMembers',\n 'getRecordings',\n 'hideVideoMuted',\n 'leave',\n 'removerMember',\n 'restoreOutboundAudio',\n 'restoreOutboundVideo',\n 'setInputSensitivity',\n 'setInputVolume',\n 'setLayout',\n 'setPositions',\n 'setMemberPosition',\n 'setOutputVolume',\n 'showVideoMuted',\n 'startRecording',\n 'stopOutboundAudio',\n 'stopOutboundVideo',\n 'undeaf',\n 'videoMute',\n 'videoUnmute',\n 'setMicrophoneVolume',\n 'setSpeakerVolume',\n 'getMeta',\n 'setMeta',\n 'updateMeta',\n 'deleteMeta',\n 'getMemberMeta',\n 'setMemberMeta',\n 'updateMemberMeta',\n 'deleteMemberMeta',\n 'promote',\n 'demote',\n 'lock',\n 'unlock',\n]\n\n/**\n * List of events that the SDK must subscribe at the invite time.\n * ie. ScreenShare/AdditionaDevice are based on the member.joined logic.\n */\nconst REQUIRED_EVENTS: (keyof RoomSessionObjectEvents)[] = [\n 'member.joined',\n 'layout.changed',\n]\nconst noop = () => {}\n\nexport interface RoomSessionOptions extends UserOptions, MakeRoomOptions {}\n\nexport interface RoomSession extends VideoRoomSession {\n new (opts: RoomSessionOptions): this\n}\n\n/**\n * A RoomSession allows you to start and control video sessions.\n *\n * For example, the following code joins a video session and listens for new\n * members joining:\n *\n * ```typescript\n * const roomSession = new SignalWire.Video.RoomSession({\n * token: '<YourRoomToken>',\n * rootElement: document.getElementById('myVideoElement'),\n * audio: true,\n * video: true,\n * })\n *\n * roomSession.on('member.joined', (e) => {\n * console.log(`${e.member.name} joined`)\n * })\n *\n * roomSession.join({ receiveAudio: true, sendVideo: false })\n * ```\n */\nexport const RoomSession = function (roomOptions: RoomSessionOptions) {\n const {\n audio: audioFromConstructor = true,\n video: videoFromConstructor = true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay = true,\n mirrorLocalVideoOverlay = false,\n stopCameraWhileMuted = true,\n stopMicrophoneWhileMuted = true,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n disableUdpIceServers = false,\n ...userOptions\n } = roomOptions\n\n const deprecatedParams = ['audio', 'video']\n deprecatedParams.forEach((param) => {\n if (param in roomOptions) {\n getLogger().warn(\n `The '${param}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`\n )\n }\n })\n\n // @ts-expect-error - true by default\n const allowReattach = roomOptions?.reattach !== false\n\n const { callIdKey } = sessionStorageManager(userOptions.token)\n const reattachManager = {\n joined: ({ call_id }: VideoRoomSubscribedEventParams) => {\n if (allowReattach && callIdKey) {\n getStorage()?.setItem(callIdKey, call_id)\n }\n },\n init: () => {\n if (allowReattach) {\n room.on('room.subscribed', reattachManager.joined)\n }\n room.options.prevCallId = reattachManager.getPrevCallId()\n },\n destroy: () => {\n if (!allowReattach) {\n return\n }\n\n room.off('room.subscribed', reattachManager.joined)\n if (callIdKey) {\n getStorage()?.removeItem(callIdKey)\n }\n },\n getPrevCallId: () => {\n if (!allowReattach || !callIdKey) {\n return\n }\n\n return getStorage()?.getItem(callIdKey) ?? undefined\n },\n }\n\n const client = createClient<RoomSession>(userOptions)\n const room = client.rooms.makeRoomObject({\n // audio,\n // video: video === true ? VIDEO_CONSTRAINTS : video,\n negotiateAudio: true,\n negotiateVideo: true,\n iceServers,\n rootElement,\n applyLocalVideoOverlay,\n mirrorLocalVideoOverlay,\n stopCameraWhileMuted,\n stopMicrophoneWhileMuted,\n speakerId,\n destinationNumber,\n localStream,\n watchMediaPackets,\n watchMediaPacketsTimeout,\n prevCallId: reattachManager.getPrevCallId(),\n disableUdpIceServers,\n })\n\n // WebRTC connection left the room.\n room.once('destroy', () => {\n room.emit('room.left', { reason: room.leaveReason })\n\n // Remove callId to reattach\n reattachManager.destroy()\n client.disconnect()\n })\n\n // @ts-expect-error\n client.session.once('session.disconnected', () => {\n room.destroy()\n })\n\n const join = (params?: BaseRoomSessionJoinParams) => {\n return new Promise(async (resolve, reject) => {\n try {\n // @ts-expect-error\n room.attachPreConnectWorkers()\n\n await client.connect()\n\n // Fallback to the constructor values for backwards compat.\n const audio = params?.audio ?? audioFromConstructor\n const video = params?.video ?? videoFromConstructor\n\n // @ts-expect-error\n const authState: VideoAuthorization = client._sessionAuthState\n getLogger().debug('getJoinMediaParams authState?', authState)\n if (authState && authState.type === 'video') {\n const mediaOptions = getJoinMediaParams({\n authState,\n // constructor values override the send\n sendAudio: Boolean(audio),\n sendVideo: Boolean(video),\n ...params,\n })\n\n if (!checkMediaParams(mediaOptions)) {\n client.disconnect()\n return reject(\n new Error(\n `Invalid arguments to join the room. The token used has join_as: '${\n authState.join_as\n }'. \\n${JSON.stringify(params, null, 2)}\\n`\n )\n )\n }\n getLogger().debug('Set mediaOptions', mediaOptions)\n\n /**\n * audio and video might be objects with MediaStreamConstraints\n * so if we must send media, we make sure to use the user's\n * preferences.\n * Note: params.sendAudio: `true` will override audio: `false` so\n * we're using `||` instead of `??` for that reason.\n */\n // @ts-expect-error\n room.updateMediaOptions({\n audio: mediaOptions.mustSendAudio ? audio || true : false,\n video: mediaOptions.mustSendVideo ? video || true : false,\n negotiateAudio: mediaOptions.mustRecvAudio,\n negotiateVideo: mediaOptions.mustRecvVideo,\n })\n }\n\n room.once('room.subscribed', () => {\n resolve(room)\n })\n\n // Hijack previous callId if present\n reattachManager.init()\n\n REQUIRED_EVENTS.forEach((event) => room.once(event, noop))\n\n await room.join()\n } catch (error) {\n getLogger().error('RoomSession Join', error)\n // Disconnect the underlay client in case of media/signaling errors\n client.disconnect()\n\n reject(error)\n }\n })\n }\n\n const interceptors = {\n join,\n } as const\n\n return new Proxy<Omit<RoomSession, 'new'>>(room, {\n get(target: RoomSession, prop: keyof RoomSession, receiver: any) {\n if (prop in interceptors) {\n // @ts-expect-error\n return interceptors[prop]\n }\n\n if (!target.active && UNSAFE_PROP_ACCESS.includes(prop)) {\n throw new Error(\n `Tried to access the property/method \"${prop}\" before the room was connected. Please call roomSession.join() first.`\n )\n }\n\n return Reflect.get(target, prop, receiver)\n },\n })\n // For consistency with other constructors we'll make TS force the use of `new`\n} as unknown as { new (roomOptions: RoomSessionOptions): RoomSession }\n","import { 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","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","log","trace","replaceLoggingMethods","level","getLevel","i","length","methodFactory","name","debug","levels","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","undefined","realMethod","Logger","factory","inheritedLevel","defaultLevel","userLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","cookieName","encodeURIComponent","location","indexOf","exec","slice","normalizeLevel","input","toUpperCase","TypeError","TRACE","DEBUG","INFO","WARN","ERROR","setLevel","persist","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","rebuild","childName","initialLevel","getLogger","logger","_log","noConflict","getLoggers","module","exports","getRandomValues","rnds8","Uint8Array","rng","crypto","Error","REGEX","byteToHex","push","toString","unsafeStringify","arr","offset","v35","version","hashfunc","generateUUID","value","namespace","buf","_namespace","str","unescape","bytes","charCodeAt","stringToBytes","uuid","validate","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","msg","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","native","randomUUID","v4","options","rnds","random","f","z","ROTL","n","_typeof","o","Symbol","iterator","constructor","_defineProperty","r","toPrimitive","String","toPropertyKey","Object","defineProperty","enumerable","configurable","writable","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread2","forEach","getOwnPropertyDescriptors","defineProperties","formatProdErrorMessage","code","K","H","Array","isArray","N","Math","ceil","M","j","pow","floor","W","T","$$observable","observable","randomString","substring","split","join","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","subscribe","listener","isSubscribed","index","splice","dispatch","action","proto","getPrototypeOf","isPlainObject","type","listeners","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","next","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","key","shapeAssertionError","finalReducerKeys","assertReducerShape","state","hasChanged","nextState","_i","_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","it","throw","pattern","pat","symbol","every","channel","ch","take","close","sym","Boolean","kTrue","konst","identity","assignWithSymbols","target","source","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","JOIN","SELECT","CANCELLED","makeEffect","payload","combinator","patternOrChannel","multicastPattern","warn","channel$1","getFnCallDescriptor","fnDescriptor","args","context","fork","_len3","_key3","select","selector","_len5","_key5","cancelled","queue","semaphore","task","suspend","release","asap","flush","immediately","shift","patterns","some","matcher","predicate","_predicate","wildcard","matcherCreator","string$1","array$1","stringableFunc","symbol$1","END","isEnd","buffer$1","limit","pushIndex","popIndex","items","doubledLimit","ringBuffer","initialSize","closed","takers","cb","taker","eventChannel","buffer","chan","multicastChannel","currentTakers","nextTakers","ensureCanMutateNextTakers","stdChannel","resolvePromise","cancelPromise","_effectRunnerMap","current","nextSagaId","cancelSingleTask","taskToCancel","isRunning","effectRunnerMap","env","_ref3","_ref3$channel","maybe","takeCb","resolve","result","effects","_ref11","digestEffect","effectId","_ref12","response","childCbs","_ref4","_ref5","proc","_ref6","cpsCb","concat","_ref7","_ref8","detached","parent","taskIterator","resolved","createTaskIterator","getIteratorMetaInfo","child","addTask","isAborted","abort","taskOrTasks","_ref9","joinSingleTask","taskToJoin","joiner","joiners","_ref10","_ref13","_ref14","match","CANCELLED$1","data","_ref15","isCancelled","prop","_ref16","props","_ref17","formatLocation","fileName","lineNumber","sagaLocationAsString","sagaMeta","cancelledTasksAsString","cancelledTasks","crashedEffect","addSagaFrame","frame","clear","setCrashedEffect","effect","firstSaga","otherSagas","crashedEffectLocation","iterator$1","parentContext","parentEffectId","isRoot","cont","finalRunEffect","finalizeRunEffect","currCb","effectRunner","executingContext","mainTask","status","_task","taskResult","taskError","deferredEnd","cancelledDueToErrorTasks","create","onAbort","tasks","getTasks","cancelAll","forkQueue","end","onError","reject","id","setContext","toPromise","def","Promise","newTask","label","effectSettled","sagaMonitor","effectRejected","effectResolved","effectTriggered","effectCancelled","runSaga","saga","_ref$channel","_ref$context","effectMiddlewares","_ref$onError","rootSagaStarted","actionDispatched","runEffect","eff","has","prefix","Events","EE","addListener","emitter","event","evt","_events","_eventsCount","clearEvent","EventEmitter","__proto__","eventNames","events","names","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","on","removeAllListeners","off","prefixed","__defProp","__defProps","__getOwnPropDesc","__getOwnPropDescs","__getOwnPropNames","getOwnPropertyNames","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","__spreadValues","__spreadProps","__objRest","exclude","__export","all2","get","__copyProps","to","from","except","desc","__reExport","mod","secondTarget","__publicField","LOCAL_EVENT_PREFIX","SYNTHETIC_EVENT_PREFIX","PRODUCT_PREFIX_PUBSUB","originalFactory","logLevel","loggerName","rawMethod","unshift","Date","toISOString","userLogger","defaultLoggerLevel","debugOptions","getLoggerInstance","wsTraffic","logWsTraffic","shouldStringify","JSON","stringify","info","Proxy","receiver","Reflect","UPPERCASE_REGEX","WEBRTC_EVENT_TYPES","isWebrtcEventType","eventType","includes","whitelistCodeRegex","parseResponse","nodeId","node_id","nestedResult","jsonrpc","DEFAULT_OPTIONS","propsToUpdateValue","toExternalJSON","__sw_symbol","__sw_proxy","entries","fromSnakeToCamelCase","endsWith","isTimestampProperty","timestamp","date","isNaN","getTime","toDateObject","part","fc","trim","remainingChars","substr","toLowerCase","extendComponent","klass","methods","stripNamespacePrefix","regex","RegExp","replace","PROTOCOL_PATTERN","timeoutPromise","time","exception","timer","race","_resolve","setTimeout","finally","clearTimeout","WITH_CUSTOM_EVENT_NAMES","CLIENT_SIDE_EVENT_NAMES","validateEventsToSubscribe","valid","internalEvent","eventParts","cleanupEventNamespace","isSyntheticEvent","isLocalEvent","isSessionEvent","find","withCustomName","startsWith","Set","isSATAuth","makeRPCRequest","params","_a","makeRPCResponse","DEFAULT_CONNECT_VERSION","major","minor","revision","UNIFIED_CONNECT_VERSION","RPCConnect","event_acks","RPCReauthenticate","authentication","tmpMap","destinationNumber","remoteCallerName","remoteCallerNumber","callerName","callerNumber","filterVertoParams","dialogParams","buildVertoRPCMessage","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoAnswer","VertoSubscribe","VertoPong","VertoResult","actions_exports","authErrorAction","authExpiringAction","authSuccessAction","createAction","destroyAction","getCustomSagaActionType","initAction","makeCustomSagaAction","reauthAction","sessionDisconnectedAction","sessionForceCloseAction","sessionReconnectingAction","socketMessageAction","toolkit_exports","prepareAction","prepared","configureStore","redux_star","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","IS_PRODUCTION","curriedGetDefaultMiddleware","devTools","enhancers","rootReducer2","baseProto","finalMiddleware","middlewareEnhancer","finalCompose","compose2","storeEnhancers","formatCustomSagaAction","executeReducerBuilderCallback","builderCallback","actionsMap","actionMatchers","defaultCaseReducer","builder","addCase","typeOrActionCreator","addMatcher","addDefaultCase","createDestroyableSlice","initialState","extraReducers","reducerNames","sliceCaseReducersByName","sliceCaseReducersByType","buildReducer","finalCaseReducers","mapOrBuilderCallback","getInitialState","finalActionMatchers","finalDefaultCaseReducer","caseReducers","reducer2","cr","previousState","caseReducer","createReducer","_reducer","reducerName","maybeReducerWithPrepare","prepareCallback","prepare","actions","createSlice","authorizingAction","sessionSlice","protocol","iceServers","authStatus","authState","authError","authCount","connected","_b","authorization","ice_servers","updateAuthState","sessionActions","sessionReducer","SW_SYMBOL","BaseSession","Map","for","host","sessionChannel","_host","checkWebSocketHost","_sessionChannel","_onSocketOpen","_onSocketError","_onSocketClose","_onSocketMessage","execute","connect","wsOpenHandler","_a2","_socket","removeEventListener","wsCloseHandler","wsErrorHandler","rpcConnectResult","_rpcConnectResult","relayProtocol","signature","connecting","readyState","closing","_status","idle","ready","token","WebSocketConstructor","CloseEventConstructor","_clearTimers","_removeSocketListeners","destroySocket","_clearCheckPingTimer","_createSocket","_addSocketListeners","reason","addEventListener","disconnect","_checkCurrentStatus","message","_requests","rpcRequest","_send","_executeTimeoutMs","_executeTimeoutError","catch","_executeConnectionClosed","_swConnectError","_closeConnection","_addToExecuteQueue","_connectParams","agent","connectVersion","project","authenticate","_relayProtocolIsValid","topics","contexts","forceClose","_flushExecuteQueue","_clearPendingRequests","_reconnectTimer","size","decode","isJSONRPCRequest","isJSONRPCResponse","request","delete","parseRPCResponse","_pingHandler","_eventAcknowledgingHandler","_payload","encode","safeParseJson","onSwAuthorizationState","persistSwAuthorizationState","retrieveSwAuthorizationState","_","send","_executeQueue","add","_checkPingTimer","_checkPingDelay","now","RPCEventAckResponse","BaseJWTSession","super","_checkTokenExpiration","reauthenticate","expiresAt","fabric_subscriber","expires_at","parsed","expiresIn","expired","_expiredDiffSeconds","jwt_token","prevProtocol","retrieveRelayProtocol","authorizationState","authorization_state","persistRelayProtocol","project_id","_checkTokenExpirationTimer","refreshTokenFn","onRefreshToken","_refreshTokenNotificationDiff","_checkTokenExpirationDelay","redux_exports","configureStore2","createCatchableSaga","createRestartableSaga","componentSlice","byId","upsert","cleanup","componentId","ids","componentActions","componentReducer","rootReducer","components","session","sagaHelpers_exports","_len4","_key4","spawn","defaultCatchHandler","errorHandler","sessionChannelWatcher","swEventChannel","swEventWorker","broadcastParams","event_type","vertoRPC","toInternalAction","isWebrtcEvent","isVideoEvent","isSwAuthorizationState","sessionChannelWorkerCatchable","AuthError","_AuthError","setPrototypeOf","HttpError","_HttpError","sessionSaga","initSession","sessionEmitter","userOptions","channels","customTasks","workers","call2","all","sessionChannelTask","fork2","sessionStatusTask","sessionStatusWatcher","take2","reauthenticateWorker","put2","sessionAuthErrorSaga","sessionSelectors_exports","getAuthError","getAuthState","getAuthStatus","getIceServers","getSession","sessionListeners","Component","customSagas","sessionKeys","instance","cacheMap","run","storeUnsubscribe","reduxKey","cacheKey","updatedValue","fnName","taskList","destroyer","getEventEmitter","SessionConstructor","runRootSaga","sagaMiddleware","_temp","boundRunSaga","_objectWithoutPropertiesLoose","createSagaMiddleware","getDefaultMiddleware","instanceMap","getAll","deleteAll","useInstanceMap","getSession2","useSession","setDebugOptions","rootSaga_default","executeActionWorker","onDone","onFail","requestId","RPCExecute","call3","SW_SYMBOL2","BaseComponent","eventEmitter","__uuid","_destroyer","eventName","sessionEventNames","getSubscriptions","destroy","detachWorkers","transformParams","transformResolve","transformReject","runWorker","worker","triggerCustomSaga","dispatchId","_customSagaTriggers","settleCustomSagaTrigger","kind","selectorFn","getStateProperty","param","_sessionAuthStatus","_sessionAuthState","_waitUntilSessionAuthorized","authStatus2","_workers","_setWorker","_attachWorker","_runningWorkers","BaseClient","BaseConsumer","resetLatestExecuteParams","_latestExecuteParams","shouldExecuteSubscribe","execParams","subscriptions","subscribeMethod","subscribeParams","event_channel","async","INTERNAL_MEMBER_UPDATABLE_PROPS","audio_muted","video_muted","deaf","visible","input_volume","output_volume","input_sensitivity","MEMBER_UPDATABLE_PROPS","componentSelectors_exports","getComponent","getComponentsById","getComponentsToCleanup","toCleanup","responses","errors","audioMuted","videoMuted","inputVolume","outputVolume","inputSensitivity","rooms_exports","RoomSessionPlaybackAPI","RoomSessionRecordingAPI","RoomSessionStreamAPI","audioMuteMember","audioUnmuteMember","createRoomSessionPlaybackObject","createRoomSessionRecordingObject","createRoomSessionStreamObject","deafMember","deleteMemberMeta","deleteMeta","demote","getLayouts","getMemberMeta","getMembers","getMeta","getPlaybacks","getRecordings","getStreams","hideVideoMuted","lock","play","promote","removeAllMembers","removeMember","setDeaf","setHideVideoMuted","setInputSensitivityMember","setInputVolumeMember","setLayout","setMemberMeta","setMemberPosition","setMeta","setOutputVolumeMember","setPositions","setPrioritizeHandraise","setRaisedHand","showVideoMuted","startRecording","startStream","undeafMember","unlock","updateMemberMeta","updateMeta","videoMuteMember","videoUnmuteMember","baseCodeTransform","createRoomMethod","room_session_id","roomSessionId","createRoomMemberMethod","memberId","rest","member_id","layouts","members","recordings","recordingInstances","recording","recordingInstance","setPayload","room_id","roomId","playbacks","playbackInstances","playback","playbackInstance","seekPosition","currentTimecode","seek_position","createRoomMetaMethod","streams","streamInstances","stream","streamInstance","enable","mediaAllowed","joinAudioMuted","joinVideoMuted","media_allowed","join_audio_muted","join_video_muted","raised","duration","startedAt","started_at","endedAt","ended_at","pause","recording_id","resume","stop","url","volume","position","seekable","playback_id","setVolume","seek","timecode","abs","forward","rewind","stream_id","chat_exports","BaseChatAPI","BaseChatConsumer","ChatMember","ChatMessage","applyCommonMethods","createBaseChatObject","getMemberState","getMembers2","getMessages","publish","setMemberState","toInternalChatChannels","list","isValidChannels","baseCodeTransform2","createChatMethod","createChatMemberMethod","messages","cursor","member","transformParamChannels","pubSub_exports","BasePubSubConsumer","PubSubMessage","createBasePubSubObject","pubSubWorker","client","channel3","restMessage","externalJSON","pubSubMessage","isPubSubEvent","sagaEffects.take","sagaEffects.fork","toInternalPubSubChannels","initWorker","_getChannelsParam","_channels","_setSubscribeParams","_getSubscribeParams","_getUnsubscribeParams","channelsParam","_checkMissingSubscriptions","eventNamesWithPrefix","updateToken","getAllowedChannels","content","publishedAt","chatWorker","chatMessage","isChatEvent2","transformParamChannels2","baseCodeTransform3","targetClass","_client","_c","_d","memberPosition_exports","memberPositionWorker","memberUpdatedWorker","defaultDispatcher","memberPositionLayoutChangedWorker","memberList","dispatcher","processedMembers","layout","layers","layer","memberEventParams","current_position","mutateMemberCurrentPosition","currentPosition","updatedMemberEventParams","updated","memberUpdatedPayload","initializeMemberList","addToMemberList","action2","fork3","room_session","configureFullStack","configureJestStore","createMockedLogger","createSessionChannel","createSwEventChannel","rpcConnectResultVRT","wait","PROJECT_ID","TOKEN","fatal","jest","mockImplementation","ms","scopes","scope_id","resource","join_as","user_name","room","display_name","audio_allowed","video_allowed","urls","credential","credentialType","username","multicastChannel2","channel2","selectors","supportsMediaDevices","mediaDevices","getMediaDevicesApi","getSupportedConstraints","streamIsValid","MediaStream","supportsMediaOutput","HTMLMediaElement","setMediaElementSinkId","el","deviceId","setSinkId","stopStream","getTracks","stopTrack","track","dispatchEvent","Event","PERMISSIONS_MAPPING","camera","microphone","speaker","_getMediaDeviceKindByName","enumerateDevices","enumerateDevicesByKind","filterByKind","devices","_error","checkPermissions","permissions","query","_legacyCheckPermissions","checkCameraPermissions","checkMicrophonePermissions","checkSpeakerPermissions","getUserMedia","constraints","audio","video","useTimeout","promises","_useTimeoutForGUM","constraint","getDisplayMedia","getDevicesWithPermissions","fullList","getDevices","_filterDevices","found","groupId","targets","checkDefault","excludeDefault","getSpeakerDevices","assureDeviceId","deviceLabel","_deviceInfoToMap","deviceInfo","TARGET_PERMISSIONS_MAP","DEFAULT_TARGETS","ALLOWED_TARGETS_MSG","CHECK_SUPPORT_MAP","createDeviceWatcher","permission","supported","unsupported","checkTargetPermissions","needPermissionsTarget","filteredTargets","unsupportedTargets","needPermissions","validateTargets","currentDevices","kinds","knownDevices","oldDevices","newDevices","changes","removals","updates","additions","newDevice","oldDevice","removed","added","_getDeviceListDiff","hasAddedDevices","hasRemovedDevices","hasUpdatedDevices","createSpeakerDeviceWatcher","isMediaStream","getSpeakerById","SDPUtils","localCName","generateIdentifier","splitLines","blob","line","splitSections","getDescription","sections","getMediaSections","matchPrefix","parseCandidate","parts","candidate","foundation","component","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","sdp","parseIceOptions","parseRtpMap","payloadType","clockRate","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","parameters","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","description","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","sessionVersion","netType","addressType","isValidSDP","_isAudioLine","_isVideoLine","_normalizeSDPLines","sdpHasMediaSection","sdpStereoHack","endOfLine","sdpLines","opusIndex","findIndex","opusPayload","_getCodecPayloadType","fmtpLineIndex","getSdpDirection","inMediaSection","directions","attr","hasMatchingSdpDirection","localSdp","remoteSdp","expectedRemoteDirection","getOppositeSdpDirection","_getUserMedia","getMediaConstraints","negotiateAudio","sdpHasAudio","_shouldNegotiateAudio","_getAudioConstraints","micLabel","micId","newMicId","exact","negotiateVideo","sdpHasVideo","_shouldNegotiateVideo","camId","_getVideoConstraints","camLabel","newCamId","filterIceServers","servers","disableUdpIceServers","filterOutUdpUrls","transportParam","server","RTCPeer","_negotiating","_processingRemoteSDP","_restartingIce","_onIce","_onEndedTrackHandler","prevCallId","localStream","_localStream","rtcConfigPolyfill","config","watchMediaPacketsTimeout","isNegotiating","remoteStream","_remoteStream","isOffer","isAnswer","isSimulcast","simulcast","isSfu","sfu","localVideoTrack","videoSender","_getSenderByKind","localAudioTrack","audioSender","remoteVideoTrack","videoReceiver","_getReceiverByKind","remoteAudioTrack","audioReceiver","hasAudioSender","hasVideoSender","hasAudioReceiver","hasVideoReceiver","rtcPeerConfig","bundlePolicy","sdpSemantics","localDescription","remoteDescription","hasIceServers","getConfiguration","stopTrackSender","sender","removeTrack","stopTrackReceiver","restoreTrackSender","newTrack","replaceTrack","addTrack","getDeviceId","getSettings","getTrackSettings","getDeviceLabel","restartIceWithRelayOnly","iceTransportPolicy","newConfig","setConfiguration","restartIce","triggerResume","_resumeTimer","clearTimers","leaveReason","setState","_closeWSConnection","resetNeedResume","clearResumeTimer","watchMediaPackets","startWatchMediaPackets","stopWatchMediaPackets","_mediaWatcher","rtcPeer","previousAudioValue","previousVideoValue","clearTimer","meter","audioPacketsReceived","videoPacketsReceived","stats","getStats","audioTrackId","videoTrackId","report","trackIdentifier","packetsReceived","lastPacketReceivedTimestamp","connectionState","start","watchRTCPeerMediaPackets","applyMediaConstraints","newConstraints","getConstraints","screenShare","applyConstraints","getSenders","getReceivers","startNegotiation","force","additionalDevice","getTransceivers","tr","offerOptions","voiceActivityDetection","_supportsAddTransceiver","offerToReceiveAudio","offerToReceiveVideo","offer","createOffer","_setLocalDescription","_setRemoteDescription","answer","createAnswer","_sdpReady","iceGatheringState","_iceTimeout","_onIceTimeout","maxIceGatheringTimeout","_pendingNegotiationPromise","onRemoteBye","_rejectStartMethod","onRemoteSdp","_resolveStartMethod","hangup","_setupRTCPeerConnection","RTCPeerConnection","_attachListeners","_retrieveLocalStream","hasLocalTracks","audioTracks","getAudioTracks","videoTracks","getVideoTracks","audioTransceiverParams","addTransceiver","videoTransceiverParams","sendEncodings","rid","active","scaleResolutionDownBy","Number","msStreamsNumber","addStream","_checkMediaToNegotiate","detachAndStop","transceiver","_sdpIsValid","onLocalSDPReady","section","sdpHasValidCandidates","_forceNegotiation","iceGatheringTimeout","useStereo","googleMaxBitrate","googleMinBitrate","googleStartBitrate","max","min","sdpBitrateHack","setLocalDescription","offerLines","offerAudioIndex","offerVideoIndex","answerLines","answerAudioIndex","answerVideoIndex","audioLines","videoLines","sdpMediaOrderHack","sessionDescr","setRemoteDescription","signalingState","emitMediaConnected","_connectionStateTimer","maxConnectionStateTimeout","clearConnectionStateTimer","iceConnectionState","_attachAudioTrackListener","_attachVideoTrackListener","clearWatchMediaPacketsTimer","_watchMediaPacketsTimer","mediaTrack","_detachAudioTrackListener","_detachVideoTrackListener","SuppressedError","isWebrtcAction","vertoEventWorker","rtcPeerId","catchableWorker","sagaHelpers","jsonrpcId","callID","peer","getRTCPeerById","activeRTCPeer","sagaEffects.put","sagaEffects.call","_getRPCMethod","onVertoBye","byeCause","cause","byeCauseCode","causeCode","redirectDestination","pongParams","__rest","mediaParams","setActiveRTCPeer","roomSubscribedWorker","call_id","clonedPayload","previewUrl","preview_url","transformPayload","Rooms","promoteDemoteWorker","sagaEffects.select","updateMediaOptions","_triggerNewRTCPeer","sessionAuthWorker","AUDIO_CONSTRAINTS","echoCancellation","noiseSuppression","autoGainControl","AUDIO_CONSTRAINTS_SCREENSHARE","googAutoGainControl","VIDEO_CONSTRAINTS","width","ideal","height","aspectRatio","DEFAULT_CALL_OPTIONS","attach","userVariables","requestTimeout","autoApplyMediaParams","BaseConnection","gotEarly","prevState","rtcPeerMap","resuming","executeInvite","activeRTCPeerId","_checkDefaultMediaConstraints","_initPeer","trying","callId","componentSelectors","cameraId","cameraLabel","microphoneId","microphoneLabel","withAudio","withVideo","oldPeerId","pingSupported","reattaching","appendRTCPeer","setLocalStream","prevAudioTracks","newAudioTracks","prevVideoTracks","newVideoTracks","updateStream","vertoExecute","_buildPeer","updateCamera","applyConstraintsAndRefreshStream","updateMicrophone","_getTransceiverDirection","manageSendersWithConstraints","stopOutboundAudio","stopOutboundVideo","updateConstraints","attempt","newStream","oldConstraints","prevVideoTrack","prevAudioTrack","tracks","handleTransceiverForTrack","emitDeviceUpdatedEvents","currentDirection","newDirection","replaceOldTrack","oldTrack","previous","runRTCPeerWorkers","workers.vertoEventWorker","workers.roomSubscribedWorker","workers.promoteDemoteWorker","invite","mungedSDP","_mungeSDP","_watchSessionAuth","executeUpdateMedia","executeAnswer","sessionAuthTask","workers.sessionAuthWorker","ssOpts","positions","hangupAll","sendDigits","dtmf","doReinviteWithRelayOnly","restoreOutboundAudio","restoreOutboundVideo","_finalize","sdpRemoveLocalCandidates","_upsertTransceiverByKind","updateMedia","_e","_f","_g","negotiationPromise","shouldEnableAudio","shouldEnableVideo","shouldNegotiateAudio","shouldNegotiateVideo","setAudioDirection","setVideoDirection","hold","unhold","audioSetSpeakerAction","makeAudioElementSaga","speakerId","Audio","audioEl","getAudioEl","audioTask","audioElementSetupWorker","element","audioElementActionsWatcher","setSpeakerActionType","autoplay","playsinline","srcObject","setAudioMediaTrack","videoManagerRoomsWorker","modPayload","rooms","row","videoManagerRoomWorker","videoManagerWorker","VideoManagerAPI","SCREENSHARE_AUDIO_CONSTRAINTS","SDK_PREFIX","OVERLAY_PREFIX","addOverlayPrefix","RoomSessionScreenShareAPI","leave","audioMute","audioUnmute","videoMute","videoUnmute","setMicrophoneVolume","setInputVolume","setInputSensitivity","EXTERNAL_MEMBER_LIST_UPDATED_EVENT","SYNTHETIC_MEMBER_LIST_UPDATED_EVENT","toSyntheticEvent","letter","fromCamelToSnakeCase","getNamespacedEvent","toInternalEventName","MEMBER_LIST_EVENTS","membersListUpdatedWatcher","pubSubAction","actionMembers","getMembersFromAction","values","getUpdatedMembers","memberListUpdatedWorker","shouldHandleMemberList","getMemberListEventsToSubscribe","eventBridgeHandler","initMemberListSubscriptions","childMemberJoinedWorker","parentId","parent_id","videoStreamWorker","roomSession","videoRecordWorker","videoPlaybackWorker","videoWorker","MemberPosition","talking","currentLayoutEvent","BaseRoomSessionConnection","_screenShareList","_audioEl","_overlayMap","_localVideoOverlay","overlayMap","localVideoOverlay","overlay","screenShareList","_attachSpeakerTrackListener","deviceWatcher","sinkId","disconnectedSpeaker","device","payloadDeviceId","defaultSpeakers","attachPreConnectWorkers","workers.memberListUpdatedWorker","getMemberOverlay","startScreenShare","opts","autoJoin","displayStream","recoverCall","memberCallId","workers.childMemberJoinedWorker","updateSpeaker","prevId","newId","prevSpeaker","newSpeaker","isSame","RoomSessionDeviceAPI","VideoRoomSessionConnection","_deviceList","_currentLayoutEvent","currentLayout","deviceList","interactivityMode","workers.videoWorker","getLayoutList","getMemberList","createScreenShareObject","addCamera","addDevice","addMicrophone","roomDevice","VideoRoomSessionAPI","undeaf","setOutputVolume","setSpeakerVolume","isVideoRoomSession","atob","fromCharCode","decodeURIComponent","header","getStorage","sessionStorage","sessionStorageManager","roomName","jwtPayload","jwtDecode","typ","authStateKey","protocolKey","callIdKey","PREVIOUS_CALLID_STORAGE_KEY","wsClientWorker","handleIncomingInvite","fireHoseWorker","vertoInviteWorker","isVertoInvite","conversationWorker","conversation","isConversationEvent","handleEvent","FabricRoomSessionMemberAPI","requestedPosition","requested_position","handraised","subscriberData","subscriber_data","newPayload","createFabricRoomSessionMemberObject","callLeftWorker","cfRoomSession","fabricMemberWorker","memberInstance","clientType","mapInternalFabricMemberToInternalVideoMemberEntity","mapInternalFabricMemberToInternalVideoMemberUpdatedEntity","mapInternalFabricRoomToInternalVideoRoomEntity","hide_video_muted","prioritize_handraise","mapInternalFabricRoomToInternalVideoRoomSessionEntity","layout_name","locked","streaming","CapabilityOnOffState","_flags","flag","MemberCapability","_memberType","_muteAudio","_muteVideo","_deaf","muteAudio","muteVideo","microphoneVolume","microphoneSensitivity","speakerVolume","raisehand","CallCapabilities","_self","_member","_vmutedHide","_lock","_buildMemberCapability","memberType","capability","sendDigit","vmutedHide","screenshare","callJoinWorker","subType","subPayload","fabricType","fabricPaylod","capabilities","fabricEvent","callSegmentWorker","segmentCallId","segmentRooSessionId","videoAction","mapFabricMemberActionToVideoMemberJoinAndLeftAction","mapFabricMemberActionToVideoMemberUpdatedAction","mapFabricLayoutActionToVideoLayoutAction","isSegmentEvent","fabricWorker","selfMember","m","firstCallJoinedReceived","isFirstCallJoinedorCallStateEvent","origin_call_id","FabricRoomSessionConnection","_capabilities","getItem","executeAction","extraParams","targetMember","setItem","isFabricRoomSession","UserOverlay","_domElement","userId","domElement","hide","style","opacity","show","LocalVideoOverlay","_mirrored","_room","mirrorLocalVideoOverlay","fabricMemberVideoMutedHandler","videoMemberVideoMutedHandler","attachListeners","mirrored","detachListeners","memberVideoMutedHandler","setMediaStream","localVideo","querySelector","setMirror","mirror","firstChild","videoEl","transform","webkitTransform","buildVideo","createElement","muted","playsInline","_getLocationStyles","top","left","_buildLayer","overflow","_updateLayer","createRootElementResizeObserver","rootElement","paddingWrapper","update","wait2","callFirst","timeout","debouncedFn","debounceWrapper","callNow","call4","debounce","maxPaddingBottom","videoHeight","videoWidth","pb","paddingBottom","nativeVideoRatio","computePaddingWrapperWidth","ResizeObserver","entry","contentBoxSize","inlineSize","blockSize","contentRect","onVideoResize","clientWidth","clientHeight","observe","buildVideoElement","applyLocalVideoOverlay","applyMemberOverlay","hasVideoTrack","overlayId","addSDKPrefix","makeLayout","mcuLayers","fragment","createDocumentFragment","currentOverlayIds","myLayerEl","disablePictureInPicture","pointerEvents","objectFit","appendChild","hasVideo","enabled","memberIdInLocation","newLayer","parentNode","removeChild","innerHTML","makeLayoutChangedHandler","processLayoutChanged","layoutChangedHandler","processVideoTrack","videoElementSetup","roomCurrentLayoutEvent","videoTrack","trackHandler","cleanupElement","videoElement","setVideoMediaTrack","maxHeight","mcuWrapper","right","bottom","classList","layersWrapper","display","relativeWrapper","margin","alignItems","justifyContent","HAVE_NOTHING","waitForVideoReady","rootElementResizeObserver","ClientAPI","_videoManager","_chat","_pubSub","makeRoomObject","makeRoomOptions","stopCameraWhileMuted","stopMicrophoneWhileMuted","chat","ChatNamespace","pubSub","PubSubNamespace","videoManager","manager","property","createVideoManagerObject","SwCloseEvent","CloseEvent","wasClean","JWTSession","WebSocket","tokenTyp","decodedJwt","allowReattach","reattach","isVRT","isSAT","createClient","baseUserOptions","INTERCEPTED_METHODS","chatOptions","interceptors","_session","createInterceptor","PubSub","pubSubOptions","http","init","fetch","ok","errorResponse","json","errorMessage","parsedBody","createHttpClient","baseUrl","globalOptions","fetcher","path","headers","body","reqInit","getRequestInit","timerId","controller","AbortController","signal","getUrl","searchParams","append","buildPaginatedResult","anotherPage","links","nextPage","prevPage","prev","firstPage","first","hasNext","hasPrev","makeQueryParamsUrls","queryParams","queryString","HTTPClient","httpClient","httpHost","Authorization","getAddress","isGetAddressByIdParams","isGetAddressesResponse","getAddresses","displayName","pageSize","sortBy","sortOrder","URLSearchParams","queryUrl","registerDevice","deviceType","deviceToken","device_type","device_token","unregisterDevice","getSubscriberInfo","ConversationAPI","addressId","address_id","createdAt","created_at","lastMessageAt","last_message_at","metadata","sendMessage","text","getConversationMessages","DEFAULT_CHAT_MESSAGES_PAGE_SIZE","Conversation","wsClient","callbacks","chatSubscriptions","subtype","chatCallbacks","conversation_id","callback","getConversations","getChatMessages","fetchChatMessagesPage","fetcherFn","cached","isDirectionNext","chatMessages","isValid","conversationMessages","chatOnlyMessages","remaining","idx","missingReturns","subscribeChatMessages","onMessage","joinConversation","IncomingCallManager","_pendingInvites","_handlers","_buildNotification","accept","buildInboundCall","executeVertoBye","details","setNotificationHandlers","pushNotification","websocket","incomingInvite","notification","handler","SATSession","jti","reauthResponse","WSClient","wsClientOptions","_incomingCallManager","_disconnected","createWSClient","makeFabricObject","buildOutboundCall","pathname","executeVertoSubscribe","sessid","_reject","dial","handlePushNotification","decrypted","resultType","online","incomingCallHandlers","offline","SignalWire","__httpClient","__wsClient","createRoomObject","roomOptions","rootElementId","getElementById","roomObject","UNSAFE_PROP_ACCESS","REQUIRED_EVENTS","audioFromConstructor","videoFromConstructor","reattachManager","joined","getPrevCallId","mediaOptions","sendAudio","sendVideo","receiveAudio","receiveVideo","canSend","canSendAudio","canSendVideo","canReceiveAudio","canReceiveVideo","reqToSendAudio","reqToSendVideo","reqToReceiveAudio","reqToReceiveVideo","mustSendAudio","mustSendVideo","mustRecvAudio","mustRecvVideo","getJoinMediaParams","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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"}
|