{"version":3,"sources":["jsdelivr-header.js","/npm/@wazo/sdk@0.46.10/dist/index.js"],"names":[],"mappings":"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","file":"/npm/@wazo/sdk@0.46.10/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@wazo/sdk@0.46.10/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __webpack_require__ = {};\n(()=>{\n    __webpack_require__.n = function(module) {\n        var getter = module && module.__esModule ? function() {\n            return module['default'];\n        } : function() {\n            return module;\n        };\n        __webpack_require__.d(getter, {\n            a: getter\n        });\n        return getter;\n    };\n})();\n(()=>{\n    __webpack_require__.d = function(exports1, definition) {\n        for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {\n            enumerable: true,\n            get: definition[key]\n        });\n    };\n})();\n(()=>{\n    __webpack_require__.g = function() {\n        if ('object' == typeof globalThis) return globalThis;\n        try {\n            return this || new Function('return this')();\n        } catch (e) {\n            if ('object' == typeof window) return window;\n        }\n    }();\n})();\n(()=>{\n    __webpack_require__.o = function(obj, prop) {\n        return Object.prototype.hasOwnProperty.call(obj, prop);\n    };\n})();\n(()=>{\n    __webpack_require__.r = function(exports1) {\n        if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {\n            value: 'Module'\n        });\n        Object.defineProperty(exports1, '__esModule', {\n            value: true\n        });\n    };\n})();\nvar __webpack_exports__ = {};\n__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n    setOnRefreshToken: ()=>setOnRefreshToken,\n    Profile: ()=>Profile,\n    getCallableNumber: ()=>getCallableNumber,\n    obfuscateToken: ()=>obfuscateToken,\n    IndirectTransfer: ()=>IndirectTransfer,\n    SipLine: ()=>SipLine,\n    getDisplayableNumber: ()=>getDisplayableNumber,\n    Agent: ()=>domain_Agent,\n    SwitchboardCall: ()=>domain_SwitchboardCall,\n    NotificationOptions: ()=>NotificationOptions,\n    WebSocketClient: ()=>websocket_client,\n    Checker: ()=>checker_Checker,\n    FORWARD_KEYS: ()=>FORWARD_KEYS,\n    Recording: ()=>Recording,\n    COUNTRIES: ()=>Country,\n    getApiClient: ()=>service_getApiClient,\n    MeetingAuthorization: ()=>MeetingAuthorization,\n    Features: ()=>domain_Features,\n    Line: ()=>Line,\n    CallerID: ()=>CallerID,\n    Emitter: ()=>Emitter,\n    Relocation: ()=>domain_Relocation,\n    ChatMessage: ()=>ChatMessage,\n    RECORDING_STATE: ()=>RECORDING_STATE,\n    camelToUnderscore: ()=>camelToUnderscore,\n    WazoApiClient: ()=>ApiClient,\n    BadResponse: ()=>BadResponse,\n    CTIPhone: ()=>CTIPhone,\n    CallSession: ()=>CallSession,\n    Session: ()=>Session,\n    setOnRefreshTokenError: ()=>setOnRefreshTokenError,\n    WebRTCClient: ()=>WebRTCClient,\n    CallLog: ()=>CallLog,\n    BaseApiClient: ()=>BaseApiClient,\n    Call: ()=>Call,\n    LINE_STATE: ()=>LINE_STATE,\n    Meeting: ()=>Meeting,\n    MeetingStatus: ()=>MeetingStatus,\n    ExternalApp: ()=>ExternalApp,\n    PROFILE_STATE: ()=>STATE,\n    Room: ()=>Room,\n    SOCKET_EVENTS: ()=>SOCKET_EVENTS,\n    WebRTCPhone: ()=>WebRTCPhone,\n    Contact: ()=>Contact,\n    setCurrentServer: ()=>setCurrentServer,\n    parsePhoneNumber: ()=>parsePhoneNumber,\n    SessionDescriptionHandler: ()=>lib_WazoSessionDescriptionHandler,\n    default: ()=>src_0,\n    SFUNotAvailableError: ()=>SFUNotAvailableError,\n    Incall: ()=>Incall,\n    setApiToken: ()=>setApiToken,\n    ForwardOption: ()=>ForwardOption,\n    IssueReporter: ()=>IssueReporter,\n    VoicemailFolder: ()=>VoicemailFolder,\n    CallApi: ()=>CallApi,\n    AdHocAPIConference: ()=>AdHocAPIConference,\n    guessParsePhoneNumber: ()=>guessParsePhoneNumber,\n    ServerError: ()=>ServerError,\n    setIsMobile: ()=>setIsMobile,\n    ChatRoom: ()=>ChatRoom,\n    DebugDevice: ()=>DebugDevice,\n    Voicemail: ()=>Voicemail,\n    ApiRequester: ()=>ApiRequester\n});\nvar websocket_client_namespaceObject = {};\n__webpack_require__.r(websocket_client_namespaceObject);\n__webpack_require__.d(websocket_client_namespaceObject, {\n    AGENT_PAUSED: ()=>AGENT_PAUSED,\n    AGENT_QUEUE_LOGGED_IN: ()=>AGENT_QUEUE_LOGGED_IN,\n    AGENT_QUEUE_LOGGED_OUT: ()=>AGENT_QUEUE_LOGGED_OUT,\n    AGENT_STATUS_UPDATE: ()=>AGENT_STATUS_UPDATE,\n    AGENT_UNPAUSED: ()=>AGENT_UNPAUSED,\n    APPLICATION_CALL_ANSWERED: ()=>APPLICATION_CALL_ANSWERED,\n    APPLICATION_CALL_DELETED: ()=>APPLICATION_CALL_DELETED,\n    APPLICATION_CALL_DTMF_RECEIVED: ()=>APPLICATION_CALL_DTMF_RECEIVED,\n    APPLICATION_CALL_ENTERED: ()=>APPLICATION_CALL_ENTERED,\n    APPLICATION_CALL_INITIATED: ()=>APPLICATION_CALL_INITIATED,\n    APPLICATION_CALL_UPDATED: ()=>APPLICATION_CALL_UPDATED,\n    APPLICATION_DESTINATION_NODE_CREATED: ()=>APPLICATION_DESTINATION_NODE_CREATED,\n    APPLICATION_NODE_CREATED: ()=>APPLICATION_NODE_CREATED,\n    APPLICATION_NODE_DELETED: ()=>APPLICATION_NODE_DELETED,\n    APPLICATION_NODE_UPDATED: ()=>APPLICATION_NODE_UPDATED,\n    APPLICATION_PLAYBACK_CREATED: ()=>APPLICATION_PLAYBACK_CREATED,\n    APPLICATION_PLAYBACK_DELETED: ()=>APPLICATION_PLAYBACK_DELETED,\n    APPLICATION_PROGRESS_STARTED: ()=>APPLICATION_PROGRESS_STARTED,\n    APPLICATION_PROGRESS_STOPPED: ()=>APPLICATION_PROGRESS_STOPPED,\n    APPLICATION_SNOOP_CREATED: ()=>APPLICATION_SNOOP_CREATED,\n    APPLICATION_SNOOP_DELETED: ()=>APPLICATION_SNOOP_DELETED,\n    APPLICATION_SNOOP_UPDATED: ()=>APPLICATION_SNOOP_UPDATED,\n    APPLICATION_USER_OUTGOING_CALL_CREATED: ()=>APPLICATION_USER_OUTGOING_CALL_CREATED,\n    AUTH_SESSION_EXPIRE_SOON: ()=>AUTH_SESSION_EXPIRE_SOON,\n    AUTH_USER_EXTERNAL_AUTH_ADDED: ()=>AUTH_USER_EXTERNAL_AUTH_ADDED,\n    AUTH_USER_EXTERNAL_AUTH_DELETED: ()=>AUTH_USER_EXTERNAL_AUTH_DELETED,\n    CALL_ANSWERED: ()=>CALL_ANSWERED,\n    CALL_CREATED: ()=>CALL_CREATED,\n    CALL_DTMF_CREATED: ()=>CALL_DTMF_CREATED,\n    CALL_ENDED: ()=>CALL_ENDED,\n    CALL_HELD: ()=>CALL_HELD,\n    CALL_LOG_USER_CREATED: ()=>CALL_LOG_USER_CREATED,\n    CALL_RESUMED: ()=>CALL_RESUMED,\n    CALL_UPDATED: ()=>CALL_UPDATED,\n    CHATD_PRESENCE_UPDATED: ()=>CHATD_PRESENCE_UPDATED,\n    CHATD_USER_ROOM_CREATED: ()=>CHATD_USER_ROOM_CREATED,\n    CHATD_USER_ROOM_MESSAGE_CREATED: ()=>CHATD_USER_ROOM_MESSAGE_CREATED,\n    CHAT_MESSAGE_RECEIVED: ()=>CHAT_MESSAGE_RECEIVED,\n    CHAT_MESSAGE_SENT: ()=>CHAT_MESSAGE_SENT,\n    CONFERENCE_ADHOC_DELETED: ()=>CONFERENCE_ADHOC_DELETED,\n    CONFERENCE_ADHOC_PARTICIPANT_LEFT: ()=>CONFERENCE_ADHOC_PARTICIPANT_LEFT,\n    CONFERENCE_USER_PARTICIPANT_JOINED: ()=>CONFERENCE_USER_PARTICIPANT_JOINED,\n    CONFERENCE_USER_PARTICIPANT_LEFT: ()=>CONFERENCE_USER_PARTICIPANT_LEFT,\n    CONFERENCE_USER_PARTICIPANT_TALK_STARTED: ()=>CONFERENCE_USER_PARTICIPANT_TALK_STARTED,\n    CONFERENCE_USER_PARTICIPANT_TALK_STOPPED: ()=>CONFERENCE_USER_PARTICIPANT_TALK_STOPPED,\n    ENDPOINT_STATUS_UPDATE: ()=>ENDPOINT_STATUS_UPDATE,\n    FAVORITE_ADDED: ()=>FAVORITE_ADDED,\n    FAVORITE_DELETED: ()=>FAVORITE_DELETED,\n    FAX_OUTBOUND_USER_CREATED: ()=>FAX_OUTBOUND_USER_CREATED,\n    FAX_OUTBOUND_USER_FAILED: ()=>FAX_OUTBOUND_USER_FAILED,\n    FAX_OUTBOUND_USER_SUCCEEDED: ()=>FAX_OUTBOUND_USER_SUCCEEDED,\n    GLOBAL_VOICEMAIL_MESSAGE_CREATED: ()=>GLOBAL_VOICEMAIL_MESSAGE_CREATED,\n    GLOBAL_VOICEMAIL_MESSAGE_DELETED: ()=>GLOBAL_VOICEMAIL_MESSAGE_DELETED,\n    GLOBAL_VOICEMAIL_MESSAGE_UPDATED: ()=>GLOBAL_VOICEMAIL_MESSAGE_UPDATED,\n    HEARTBEAT_ENGINE_VERSION: ()=>HEARTBEAT_ENGINE_VERSION,\n    LINE_STATUS_UPDATED: ()=>LINE_STATUS_UPDATED,\n    MEETING_USER_GUEST_AUTHORIZATION_CREATED: ()=>MEETING_USER_GUEST_AUTHORIZATION_CREATED,\n    MEETING_USER_PARTICIPANT_JOINED: ()=>MEETING_USER_PARTICIPANT_JOINED,\n    MEETING_USER_PARTICIPANT_LEFT: ()=>MEETING_USER_PARTICIPANT_LEFT,\n    MEETING_USER_PROGRESS: ()=>MEETING_USER_PROGRESS,\n    SOCKET_EVENTS: ()=>SOCKET_EVENTS,\n    SWITCHBOARD_HELD_CALLS_UPDATED: ()=>SWITCHBOARD_HELD_CALLS_UPDATED,\n    SWITCHBOARD_HELD_CALL_ANSWERED: ()=>SWITCHBOARD_HELD_CALL_ANSWERED,\n    SWITCHBOARD_QUEUED_CALLS_UPDATED: ()=>SWITCHBOARD_QUEUED_CALLS_UPDATED,\n    SWITCHBOARD_QUEUED_CALL_ANSWERED: ()=>SWITCHBOARD_QUEUED_CALL_ANSWERED,\n    TRUNK_STATUS_UPDATED: ()=>TRUNK_STATUS_UPDATED,\n    USERS_FORWARDS_BUSY_UPDATED: ()=>USERS_FORWARDS_BUSY_UPDATED,\n    USERS_FORWARDS_NOANSWER_UPDATED: ()=>USERS_FORWARDS_NOANSWER_UPDATED,\n    USERS_FORWARDS_UNCONDITIONAL_UPDATED: ()=>USERS_FORWARDS_UNCONDITIONAL_UPDATED,\n    USERS_SERVICES_DND_UPDATED: ()=>USERS_SERVICES_DND_UPDATED,\n    USER_STATUS_UPDATE: ()=>USER_STATUS_UPDATE,\n    USER_VOICEMAIL_MESSAGE_CREATED: ()=>USER_VOICEMAIL_MESSAGE_CREATED,\n    USER_VOICEMAIL_MESSAGE_DELETED: ()=>USER_VOICEMAIL_MESSAGE_DELETED,\n    USER_VOICEMAIL_MESSAGE_UPDATED: ()=>USER_VOICEMAIL_MESSAGE_UPDATED,\n    default: ()=>websocket_client\n});\nvar WebRTCPhone_namespaceObject = {};\n__webpack_require__.r(WebRTCPhone_namespaceObject);\n__webpack_require__.d(WebRTCPhone_namespaceObject, {\n    MESSAGE_TYPE_CHAT: ()=>MESSAGE_TYPE_CHAT,\n    MESSAGE_TYPE_SIGNAL: ()=>MESSAGE_TYPE_SIGNAL,\n    ON_AUDIO_STREAM: ()=>ON_AUDIO_STREAM,\n    ON_CALL_ACCEPTED: ()=>ON_CALL_ACCEPTED,\n    ON_CALL_ANSWERED: ()=>ON_CALL_ANSWERED,\n    ON_CALL_CANCELED: ()=>ON_CALL_CANCELED,\n    ON_CALL_ENDED: ()=>ON_CALL_ENDED,\n    ON_CALL_ENDING: ()=>ON_CALL_ENDING,\n    ON_CALL_ERROR: ()=>ON_CALL_ERROR,\n    ON_CALL_FAILED: ()=>ON_CALL_FAILED,\n    ON_CALL_HELD: ()=>ON_CALL_HELD,\n    ON_CALL_INCOMING: ()=>ON_CALL_INCOMING,\n    ON_CALL_MUTED: ()=>ON_CALL_MUTED,\n    ON_CALL_OUTGOING: ()=>ON_CALL_OUTGOING,\n    ON_CALL_REJECTED: ()=>ON_CALL_REJECTED,\n    ON_CALL_RESUMED: ()=>ON_CALL_RESUMED,\n    ON_CALL_UNHELD: ()=>ON_CALL_UNHELD,\n    ON_CALL_UNMUTED: ()=>ON_CALL_UNMUTED,\n    ON_CAMERA_DISABLED: ()=>ON_CAMERA_DISABLED,\n    ON_CAMERA_RESUMED: ()=>ON_CAMERA_RESUMED,\n    ON_CHAT: ()=>ON_CHAT,\n    ON_EARLY_MEDIA: ()=>WebRTCPhone_ON_EARLY_MEDIA,\n    ON_ICE_DISCONNECTED: ()=>WebRTCPhone_ON_ICE_DISCONNECTED,\n    ON_ICE_RECONNECTED: ()=>WebRTCPhone_ON_ICE_RECONNECTED,\n    ON_ICE_RECONNECTING: ()=>WebRTCPhone_ON_ICE_RECONNECTING,\n    ON_MESSAGE: ()=>ON_MESSAGE,\n    ON_MESSAGE_TRACK_UPDATED: ()=>ON_MESSAGE_TRACK_UPDATED,\n    ON_NETWORK_STATS: ()=>WebRTCPhone_ON_NETWORK_STATS,\n    ON_PLAY_HANGUP_SOUND: ()=>ON_PLAY_HANGUP_SOUND,\n    ON_PLAY_INBOUND_CALL_SIGNAL_SOUND: ()=>ON_PLAY_INBOUND_CALL_SIGNAL_SOUND,\n    ON_PLAY_PROGRESS_SOUND: ()=>ON_PLAY_PROGRESS_SOUND,\n    ON_PLAY_RING_SOUND: ()=>ON_PLAY_RING_SOUND,\n    ON_PROGRESS: ()=>WebRTCPhone_ON_PROGRESS,\n    ON_REGISTERED: ()=>ON_REGISTERED,\n    ON_REINVITE: ()=>WebRTCPhone_ON_REINVITE,\n    ON_REMOVE_STREAM: ()=>ON_REMOVE_STREAM,\n    ON_SHARE_SCREEN_ENDED: ()=>ON_SHARE_SCREEN_ENDED,\n    ON_SHARE_SCREEN_ENDING: ()=>ON_SHARE_SCREEN_ENDING,\n    ON_SHARE_SCREEN_STARTED: ()=>ON_SHARE_SCREEN_STARTED,\n    ON_SIGNAL: ()=>ON_SIGNAL,\n    ON_TERMINATE_SOUND: ()=>ON_TERMINATE_SOUND,\n    ON_TRACK: ()=>WebRTCPhone_ON_TRACK,\n    ON_UNREGISTERED: ()=>ON_UNREGISTERED,\n    ON_USER_AGENT: ()=>ON_USER_AGENT,\n    ON_VIDEO_INPUT_CHANGE: ()=>ON_VIDEO_INPUT_CHANGE,\n    ON_VIDEO_STREAM: ()=>ON_VIDEO_STREAM,\n    default: ()=>WebRTCPhone,\n    events: ()=>WebRTCPhone_events\n});\nconst external_js_base64_namespaceObject = require(\"js-base64\");\nclass BadResponse extends Error {\n    static fromResponse(error, status) {\n        return new BadResponse(error.message || JSON.stringify(error), status, error.timestamp, error.error_id, error.details, error);\n    }\n    static fromText(response, status) {\n        return new BadResponse(response, status);\n    }\n    status;\n    timestamp;\n    errorId;\n    details;\n    error;\n    constructor(message, status, timestamp = null, errorId = null, details = null, error = null){\n        super(message);\n        this.timestamp = timestamp;\n        this.status = status;\n        this.errorId = errorId;\n        this.details = details;\n        this.error = error;\n    }\n}\nclass ServerError extends BadResponse {\n    static fromResponse(error, status) {\n        return new ServerError(error.message || JSON.stringify(error), status, error.timestamp, error.error_id, error.details);\n    }\n    static fromText(response, status) {\n        return new ServerError(response, status);\n    }\n}\nconst external_moment_namespaceObject = require(\"moment\");\nvar external_moment_default = /*#__PURE__*/ __webpack_require__.n(external_moment_namespaceObject);\nconst isMobile_isMobile = ()=>'undefined' != typeof navigator && 'ReactNative' === navigator.product;\nconst utils_isMobile = isMobile_isMobile;\nconst camelToUnderscore = (key)=>{\n    if ('string' != typeof key) throw new Error('Input is not a string');\n    return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();\n};\nconst obfuscateToken = (token)=>{\n    if (!token) return token;\n    return token.split('-').map((part, index)=>0 === index ? part : 'xxxxxx').join('-');\n};\nconst TRACE = 'trace';\nconst DEBUG = 'debug';\nconst INFO = 'info';\nconst LOG = 'log';\nconst WARN = 'warn';\nconst ERROR = 'error';\nconst CONSOLE_METHODS = [\n    INFO,\n    LOG,\n    WARN,\n    ERROR\n];\nconst LOG_LEVELS = [\n    TRACE,\n    DEBUG,\n    INFO,\n    LOG,\n    WARN,\n    ERROR\n];\nconst CATEGORY_PREFIX = 'logger-category=';\nconst MAX_REMOTE_RETRY = 10;\nfunction addLevelsTo(instance, withMethods = false) {\n    instance.TRACE = TRACE;\n    instance.DEBUG = DEBUG;\n    instance.INFO = INFO;\n    instance.LOG = LOG;\n    instance.WARN = WARN;\n    instance.ERROR = ERROR;\n    if (withMethods) {\n        instance.trace = (...args)=>instance.apply(null, [\n                TRACE,\n                ...args\n            ]);\n        instance.debug = (...args)=>instance.apply(null, [\n                DEBUG,\n                ...args\n            ]);\n        instance.info = (...args)=>instance.apply(null, [\n                INFO,\n                ...args\n            ]);\n        instance.log = (...args)=>instance.apply(null, [\n                LOG,\n                ...args\n            ]);\n        instance.warn = (...args)=>instance.apply(null, [\n                WARN,\n                ...args\n            ]);\n        instance.error = (...args)=>instance.apply(null, [\n                ERROR,\n                ...args\n            ]);\n    }\n    return instance;\n}\nconst safeStringify = (object)=>{\n    const result = '{\"message\": \"Not parsable JSON\"}';\n    try {\n        return JSON.stringify(object);\n    } catch (e) {}\n    return result;\n};\nclass IssueReporter_IssueReporter {\n    TRACE;\n    INFO;\n    LOG;\n    WARN;\n    ERROR;\n    oldConsoleMethods;\n    enabled;\n    remoteClientConfiguration;\n    buffer;\n    bufferTimeout;\n    _boundProcessBuffer;\n    _boundParseLoggerBody;\n    _callback;\n    constructor(){\n        addLevelsTo(this);\n        this.oldConsoleMethods = null;\n        this.enabled = false;\n        this.remoteClientConfiguration = null;\n        this.buffer = [];\n        this.bufferTimeout = null;\n        this._boundProcessBuffer = this._processBuffer.bind(this);\n        this._boundParseLoggerBody = this._parseLoggerBody.bind(this);\n        this._callback = null;\n    }\n    init() {\n        this._catchConsole();\n    }\n    setCallback(cb) {\n        this._callback = cb;\n    }\n    configureRemoteClient(configuration = {\n        tag: 'wazo-sdk',\n        host: null,\n        port: null,\n        level: null,\n        extra: {}\n    }) {\n        this.remoteClientConfiguration = configuration;\n    }\n    enable() {\n        if (!this.oldConsoleMethods) this.init();\n        this.enabled = true;\n    }\n    disable() {\n        this.enabled = false;\n    }\n    loggerFor(category) {\n        const logger = (level, ...args)=>{\n            this.log.apply(this, [\n                level,\n                this._makeCategory(category),\n                ...args\n            ]);\n        };\n        return addLevelsTo(logger, true);\n    }\n    removeSlashes(str) {\n        return str.replace(/\"/g, \"'\").replace(/\\\\/g, '');\n    }\n    obfuscateHeaderToken(headers) {\n        const newHeaders = {\n            ...headers\n        };\n        if ('X-Auth-Token' in newHeaders) newHeaders['X-Auth-Token'] = obfuscateToken(newHeaders['X-Auth-Token']);\n        return newHeaders;\n    }\n    log(level, ...args) {\n        if (!this.enabled) return;\n        let category = null;\n        let skipSendToRemote = false;\n        let extra = {};\n        if (0 === args[0].indexOf(CATEGORY_PREFIX)) {\n            category = args[0].split('=')[1];\n            args.splice(0, 1);\n        }\n        const lastArg = args[args.length - 1];\n        if (lastArg && ('object' == typeof lastArg && Object.keys(lastArg).length || lastArg instanceof Error)) {\n            extra = lastArg instanceof Error ? {\n                errorMessage: lastArg.message,\n                errorStack: lastArg.stack,\n                errorType: lastArg.constructor.name,\n                skipSendToRemote: lastArg.skipSendToRemote\n            } : lastArg;\n            args.splice(1, 1);\n        }\n        if (extra.skipSendToRemote) {\n            skipSendToRemote = true;\n            delete extra.skipSendToRemote;\n        }\n        const date = external_moment_default()().format('YYYY-MM-DD HH:mm:ss.SSS');\n        const message = args.join(', ');\n        let consoleMessage = message;\n        if (Object.keys(extra).length) {\n            const parsedExtra = safeStringify(extra);\n            consoleMessage = `${consoleMessage} (${parsedExtra})`;\n        }\n        if (category) consoleMessage = `[${category}] ${consoleMessage}`;\n        const consoleLevel = utils_isMobile() && 'error' === level ? WARN : level;\n        const oldMethod = this.oldConsoleMethods?.[consoleLevel] || this.oldConsoleMethods?.log;\n        oldMethod.apply(oldMethod, [\n            date,\n            consoleMessage\n        ]);\n        if (this._callback) this._callback(level, consoleMessage);\n        if (!skipSendToRemote) this._sendToRemoteLogger(level, {\n            date,\n            message,\n            category,\n            ...extra\n        });\n    }\n    logRequest(url, options, response, start) {\n        if (!this.enabled) return;\n        const { status } = response;\n        const duration = +new Date() - +start;\n        let level = TRACE;\n        if (status >= 400 && status < 500) level = WARN;\n        else if (status >= 500) level = ERROR;\n        this.log(level, this._makeCategory('http'), url, {\n            status,\n            body: this.removeSlashes(JSON.stringify(options.body)),\n            method: options.method,\n            headers: this.obfuscateHeaderToken(options.headers),\n            duration\n        });\n    }\n    getLogs() {\n        console.warn('IssueReporter\\'s logs aren\\'t stored anymore. Please use fluentd to store them');\n        return [];\n    }\n    getParsedLogs() {\n        console.warn('IssueReporter\\'s logs aren\\'t stored anymore. Please use fluentd to store them');\n        return [];\n    }\n    getReport() {\n        return this.getParsedLogs().join('\\r\\n');\n    }\n    _catchConsole() {\n        this.oldConsoleMethods = {};\n        CONSOLE_METHODS.forEach((methodName)=>{\n            if (this.oldConsoleMethods) this.oldConsoleMethods[methodName] = console[methodName];\n            const parent = 'undefined' != typeof window ? window : __webpack_require__.g;\n            parent.console[methodName] = (...args)=>{\n                try {\n                    this.log(methodName, args.join(' '));\n                    if (this.oldConsoleMethods) this.oldConsoleMethods[methodName].apply(null, args);\n                } catch (e) {}\n            };\n        });\n    }\n    _sendToRemoteLogger(level, payload = {}) {\n        if (!this.remoteClientConfiguration) return;\n        const { level: minLevel, bufferSize } = this.remoteClientConfiguration;\n        if (!minLevel || this._isLevelAbove(minLevel, level)) return;\n        payload.level = level;\n        if (bufferSize > 0) return this._addToBuffer(payload);\n        this._sendDebugToGrafana(payload);\n    }\n    _parseLoggerBody(payload) {\n        const { level } = payload;\n        const { maxMessageSize, extra } = this.remoteClientConfiguration || {};\n        delete payload.level;\n        if (maxMessageSize && 'string' == typeof payload.message && payload.message.length > maxMessageSize) payload.message = `${payload.message.substr(0, maxMessageSize)}...`;\n        return safeStringify({\n            level,\n            ...payload,\n            ...extra\n        });\n    }\n    _addToBuffer(payload) {\n        if (this.bufferTimeout) {\n            clearTimeout(this.bufferTimeout);\n            this.bufferTimeout = null;\n        }\n        this.buffer.push(payload);\n        const { bufferSize, bufferTimeout } = this.remoteClientConfiguration;\n        if (this.buffer.length > bufferSize) return this._processBuffer();\n        if (bufferTimeout > 0) this.bufferTimeout = setTimeout(this._boundProcessBuffer, bufferTimeout);\n    }\n    _processBuffer() {\n        this._sendDebugToGrafana(this.buffer);\n        this.buffer = [];\n        if (this.bufferTimeout) {\n            clearTimeout(this.bufferTimeout);\n            this.bufferTimeout = null;\n        }\n    }\n    _computeRetryDelay(attempt, initial = 1000, maxWait = 50000) {\n        const base = 1.5;\n        const wait = Math.min(initial * base ** attempt, maxWait);\n        const jitterWait = Math.max(initial, Math.random() * wait);\n        return jitterWait;\n    }\n    _sendDebugToGrafana(payload, retry = 0) {\n        if (!this.remoteClientConfiguration || retry >= MAX_REMOTE_RETRY) return;\n        const { tag, host, port } = this.remoteClientConfiguration;\n        const isSecure = 443 === +port;\n        const url = `http${isSecure ? 's' : ''}://${host}${isSecure ? '' : `:${port}`}/${tag}`;\n        const body = Array.isArray(payload) ? `[${payload.map(this._boundParseLoggerBody).join(',')}]` : this._parseLoggerBody(payload);\n        fetch(url, {\n            method: 'POST',\n            headers: {\n                Accept: 'application/json',\n                'Content-Type': 'application/json'\n            },\n            body\n        }).catch((e)=>{\n            e.skipSendToRemote = true;\n            this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);\n            const wait = this._computeRetryDelay(retry, 1000, 50000);\n            setTimeout(()=>{\n                if (Array.isArray(payload)) payload = payload.map((message)=>this._writeRetryCount(message, retry + 1));\n                else if (payload && 'object' == typeof payload) payload = this._writeRetryCount(payload, retry + 1);\n                this._sendDebugToGrafana(payload, retry + 1);\n            }, wait);\n        });\n    }\n    _writeRetryCount(message, count) {\n        if (message && 'object' == typeof message) message._retry = count;\n        return message;\n    }\n    _isLevelAbove(level1, level2) {\n        const index1 = LOG_LEVELS.indexOf(level1);\n        const index2 = LOG_LEVELS.indexOf(level2);\n        if (-1 === index1 || -1 === index2) return false;\n        return index1 > index2;\n    }\n    _makeCategory(category) {\n        return `${CATEGORY_PREFIX}${category}`;\n    }\n}\nconst IssueReporter = new IssueReporter_IssueReporter();\nconst methods = [\n    'head',\n    'get',\n    'post',\n    'put',\n    'delete',\n    'options'\n];\nconst api_requester_logger = IssueReporter ? IssueReporter.loggerFor('api') : console;\nconst REQUEST_TIMEOUT_MS = 300000;\nclass ApiRequester {\n    server;\n    agent;\n    clientId;\n    token;\n    tenant;\n    fetchOptions;\n    refreshTokenCallback;\n    refreshTokenPromise;\n    shouldLogErrors;\n    requestTimeout;\n    head;\n    get;\n    post;\n    put;\n    delete;\n    options;\n    static successResponseParser(response) {\n        return 204 === response.status || 201 === response.status || 200 === response.status;\n    }\n    static defaultParser(response) {\n        return response.json().then((data)=>({\n                ...data,\n                _headers: response.headers\n            }));\n    }\n    static getQueryString(obj) {\n        return Object.keys(obj).filter((key)=>obj[key]).map((key)=>`${key}=${encodeURIComponent(obj[key])}`).join('&');\n    }\n    static base64Encode(str) {\n        if ('undefined' != typeof btoa) try {\n            return btoa(str);\n        } catch (error) {}\n        return external_js_base64_namespaceObject.Base64.encode(str);\n    }\n    constructor({ server, refreshTokenCallback, clientId, agent = null, token = null, fetchOptions, requestTimeout = REQUEST_TIMEOUT_MS }){\n        this.server = server;\n        this.agent = agent;\n        this.clientId = clientId;\n        this.refreshTokenCallback = refreshTokenCallback;\n        this.refreshTokenPromise = null;\n        this.fetchOptions = fetchOptions || {};\n        this.requestTimeout = requestTimeout || REQUEST_TIMEOUT_MS;\n        if (token) this.token = token;\n        this.shouldLogErrors = true;\n        methods.forEach((method)=>{\n            this[method] = (pathOrParams, body, headers, parse, firstCall)=>{\n                if (pathOrParams && 'object' == typeof pathOrParams && pathOrParams.path) return this.call({\n                    ...pathOrParams,\n                    method\n                });\n                return this.call({\n                    path: pathOrParams,\n                    method,\n                    body,\n                    headers,\n                    parse,\n                    firstCall\n                });\n            };\n        });\n    }\n    setRequestTimeout(requestTimeout) {\n        this.requestTimeout = requestTimeout;\n    }\n    setTenant(tenant) {\n        this.tenant = tenant;\n    }\n    setToken(token) {\n        this.token = token;\n    }\n    setFetchOptions(options) {\n        this.fetchOptions = options;\n    }\n    disableErrorLogging() {\n        this.shouldLogErrors = false;\n    }\n    enableErrorLogging() {\n        this.shouldLogErrors = true;\n    }\n    async call({ path, method = 'get', body = null, headers = null, parse = ApiRequester.defaultParser, firstCall = true }) {\n        const url = this.computeUrl(method, path, body);\n        const newHeaders = this.getHeaders(headers);\n        let newBody = 'get' === method ? null : body;\n        if (newBody && 'application/json' === newHeaders['Content-Type']) newBody = JSON.stringify(newBody);\n        const isHead = 'head' === method;\n        const hasEmptyResponse = 'delete' === method || isHead;\n        const newParse = hasEmptyResponse && parse === ApiRequester.defaultParser ? ApiRequester.successResponseParser : parse;\n        const fetchOptions = {\n            ...this.fetchOptions || {}\n        };\n        const controller = new AbortController();\n        const extraHeaders = fetchOptions.headers || {};\n        delete fetchOptions.headers;\n        const options = {\n            method,\n            body: newBody,\n            signal: controller ? controller.signal : null,\n            headers: {\n                ...this.getHeaders(headers),\n                ...extraHeaders\n            },\n            agent: this.agent,\n            ...fetchOptions\n        };\n        if (this.refreshTokenPromise) {\n            api_requester_logger.info('A token is already refreshing, waiting ...', {\n                url\n            });\n            await this.refreshTokenPromise;\n        }\n        const start = new Date();\n        const requestPromise = fetch(url, options).then((response)=>{\n            const contentType = response.headers.get('content-type') || '';\n            const isJson = -1 !== contentType.indexOf('application/json');\n            IssueReporter.logRequest(url, options, response, start);\n            if (isHead && response.status >= 500 || !isHead && response.status >= 400) {\n                const promise = isJson ? response.json() : response.text();\n                const exceptionClass = response.status >= 500 ? ServerError : BadResponse;\n                return promise.then(async (err)=>{\n                    if (firstCall && this._checkTokenExpired(response, err)) {\n                        api_requester_logger.warn('token expired', {\n                            error: err.reason\n                        });\n                        return this._replayWithNewToken(err, path, method, body, headers, parse);\n                    }\n                    const error = 'string' == typeof err ? exceptionClass.fromText(err, response.status) : exceptionClass.fromResponse(err, response.status);\n                    if (this.shouldLogErrors) api_requester_logger.error('API error', error);\n                    throw error;\n                });\n            }\n            return newParse(response, isJson);\n        }).catch((error)=>{\n            if (this.shouldLogErrors) api_requester_logger.error('Fetch failed', {\n                url,\n                options,\n                message: error.message,\n                stack: error.stack\n            });\n            throw error;\n        });\n        const requestTimeout = new Promise((resolve, reject)=>{\n            setTimeout(()=>{\n                controller.abort();\n                reject(new Error(`Request timed out after ${this.requestTimeout} ms`));\n            }, this.requestTimeout);\n        });\n        return Promise.race([\n            requestPromise,\n            requestTimeout\n        ]);\n    }\n    _checkTokenExpired(response, err) {\n        const isTokenNotFound = 404 === response.status && this._isTokenNotFound(err);\n        return 401 === response.status || isTokenNotFound;\n    }\n    _isTokenNotFound(err) {\n        return err && err.reason && 'No such token' === err.reason[0];\n    }\n    _replayWithNewToken(err, path, method, body = null, headers = null, parse) {\n        const isTokenNotFound = this._isTokenNotFound(err);\n        let newPath = path;\n        api_requester_logger.info('refreshing token', {\n            inProgress: !!this.refreshTokenPromise\n        });\n        this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();\n        return this.refreshTokenPromise?.then(()=>{\n            this.refreshTokenPromise = null;\n            api_requester_logger.info('token refreshed', {\n                isTokenNotFound\n            });\n            if (isTokenNotFound) {\n                const pathParts = path.split('/');\n                pathParts.pop();\n                pathParts.push(this.token);\n                newPath = pathParts.join('/');\n            }\n            return this.call({\n                path: newPath,\n                method,\n                body,\n                headers,\n                parse,\n                firstCall: false\n            });\n        }).catch((e)=>{\n            this.refreshTokenPromise = null;\n            throw e;\n        });\n    }\n    getHeaders(header) {\n        const isObject = header instanceof Object;\n        const isWazoTenantOnly = isObject && void 0 !== header['Wazo-Tenant'] && 1 === Object.keys(header).length;\n        if (isObject && !isWazoTenantOnly) return header;\n        const headers = {\n            'X-Auth-Token': this.token,\n            ...this.tenant ? {\n                'Wazo-Tenant': header?.['Wazo-Tenant'] || this.tenant\n            } : null,\n            Accept: 'application/json',\n            'Content-Type': 'application/json'\n        };\n        if (isWazoTenantOnly && !header?.['Wazo-Tenant']) delete headers['Wazo-Tenant'];\n        return headers;\n    }\n    computeUrl(method, path, body) {\n        const url = `${this.baseUrl}/${path}`;\n        return 'get' === method && 'object' == typeof body && body && Object.keys(body).length ? `${url}?${ApiRequester.getQueryString(body)}` : url;\n    }\n    get baseUrl() {\n        return `https://${this.server}/api`;\n    }\n}\nconst application = (client, baseUrl)=>({\n        bridgeCall (applicationUuid, callId, context, exten, autoanswer, displayed_caller_id_number) {\n            const url = `${baseUrl}/${applicationUuid}/nodes`;\n            const body = {\n                calls: [\n                    {\n                        id: callId\n                    }\n                ]\n            };\n            return client.post(url, body, null, (res)=>res.json().then((response)=>response.uuid)).then((nodeUuid)=>client.post(`${url}/${nodeUuid}/calls`, {\n                    context,\n                    exten,\n                    autoanswer,\n                    displayed_caller_id_number\n                }).then((data)=>({\n                        nodeUuid,\n                        data\n                    })));\n        },\n        answerCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/answer`, {}, null, ApiRequester.successResponseParser),\n        calls: (applicationUuid)=>client.get(`${baseUrl}/${applicationUuid}/calls`),\n        hangupCall: (applicationUuid, callId)=>client.delete(`${baseUrl}/${applicationUuid}/calls/${callId}`),\n        startPlaybackCall: (applicationUuid, callId, language, uri)=>client.post(`${baseUrl}/${applicationUuid}/calls/${callId}/playbacks`, {\n                language,\n                uri\n            }),\n        stopPlaybackCall: (applicationUuid, playbackUuid)=>client.delete(`${baseUrl}/${applicationUuid}/playbacks/${playbackUuid}`),\n        startProgressCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/progress/start`, {}, null, ApiRequester.successResponseParser),\n        stopProgressCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/progress/stop`, {}, null, ApiRequester.successResponseParser),\n        startMohCall: (applicationUuid, callId, mohUuid)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/moh/${mohUuid}/start`, {}, null, ApiRequester.successResponseParser),\n        stopMohCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/moh/stop`, {}, null, ApiRequester.successResponseParser),\n        startHoldCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/hold/start`, {}, null, ApiRequester.successResponseParser),\n        stopHoldCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/hold/stop`, {}, null, ApiRequester.successResponseParser),\n        startMuteCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/mute/start`, {}, null, ApiRequester.successResponseParser),\n        stopMuteCall: (applicationUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/mute/stop`, {}, null, ApiRequester.successResponseParser),\n        sendDTMFCall: (applicationUuid, callId, digits)=>client.put(`${baseUrl}/${applicationUuid}/calls/${callId}/dtmf`, {\n                digits\n            }, null, ApiRequester.successResponseParser),\n        addCallNodes: (applicationUuid, nodeUuid, callId)=>client.put(`${baseUrl}/${applicationUuid}/nodes/${nodeUuid}/calls/${callId}`, {}, null, ApiRequester.successResponseParser),\n        createNewNodeWithCall: (applicationUuid, calls)=>client.post(`${baseUrl}/${applicationUuid}/nodes`, {\n                calls\n            }),\n        addNewCallNodes: (applicationUuid, nodeUuid, context, exten, autoanswer)=>client.post(`${baseUrl}/${applicationUuid}/nodes/${nodeUuid}/calls`, {\n                context,\n                exten,\n                autoanswer\n            }),\n        listCallsNodes: (applicationUuid, nodeUuid)=>client.get(`${baseUrl}/${applicationUuid}/nodes/${nodeUuid}`),\n        listNodes: (applicationUuid)=>client.get(`${baseUrl}/${applicationUuid}/nodes`),\n        removeNode: (applicationUuid, nodeUuid)=>client.delete(`${baseUrl}/${applicationUuid}/nodes/${nodeUuid}`),\n        removeCallNodes: (applicationUuid, nodeUuid, callId)=>client.delete(`${baseUrl}/${applicationUuid}/nodes/${nodeUuid}/calls/${callId}`),\n        listSnoop: (applicationUuid)=>client.get(`${baseUrl}/${applicationUuid}/snoops`),\n        removeSnoop: (applicationUuid, snoopUuid)=>client.delete(`${baseUrl}/${applicationUuid}/snoops/${snoopUuid}`),\n        viewSnoop: (applicationUuid, snoopUuid)=>client.get(`${baseUrl}/${applicationUuid}/snoops/${snoopUuid}`),\n        createSnoop: (applicationUuid, callId, snoopingCallId, whisperMode)=>client.post(`${baseUrl}/${applicationUuid}/calls/${callId}/snoops`, {\n                snooping_call_id: snoopingCallId,\n                whisper_mode: whisperMode\n            }),\n        updateSnoop: (applicationUuid, snoopUuid, whisperMode)=>client.put(`${baseUrl}/${applicationUuid}/snoops/${snoopUuid}`, {\n                whisper_mode: whisperMode\n            }, null, ApiRequester.successResponseParser)\n    });\nconst new_from = (instance, ToClass)=>{\n    const args = {};\n    Object.getOwnPropertyNames(instance).forEach((prop)=>{\n        args[prop] = instance[prop];\n    });\n    return new ToClass(args);\n};\nclass CallerID {\n    number;\n    idType;\n    type;\n    static parse(plain) {\n        return new CallerID({\n            number: plain.number,\n            type: plain.type\n        });\n    }\n    static parseMany(plain) {\n        return plain.items.map((item)=>CallerID.parse(item));\n    }\n    static newFrom(profile) {\n        return new_from(profile, CallerID);\n    }\n    constructor({ type, number }){\n        this.idType = type;\n        this.number = number;\n        this.type = 'CallerID';\n    }\n}\nclass Line {\n    type;\n    id;\n    extensions;\n    endpointCustom;\n    endpointSccp;\n    endpointSip;\n    static parse(plain) {\n        return new Line({\n            id: plain.id,\n            extensions: plain.extensions,\n            endpointCustom: plain.endpoint_custom || null,\n            endpointSccp: plain.endpoint_sccp || null,\n            endpointSip: plain.endpoint_sip || null\n        });\n    }\n    static newFrom(profile) {\n        return new_from(profile, Line);\n    }\n    is(line) {\n        return !!line && this.id === line.id;\n    }\n    hasExtension(extension) {\n        if (!this.extensions) return false;\n        return this.extensions.some((ext)=>ext.exten === extension);\n    }\n    constructor({ id, extensions, endpointCustom, endpointSccp, endpointSip } = {}){\n        this.id = id;\n        this.extensions = extensions;\n        this.endpointCustom = endpointCustom || null;\n        this.endpointSccp = endpointSccp || null;\n        this.endpointSip = endpointSip || null;\n        this.type = 'Line';\n    }\n}\nconst FORWARD_KEYS = {\n    BUSY: 'busy',\n    NO_ANSWER: 'noanswer',\n    UNCONDITIONAL: 'unconditional'\n};\nclass ForwardOption {\n    destination;\n    enabled;\n    key;\n    static parse(plain, key) {\n        return new ForwardOption({\n            destination: plain.destination || '',\n            enabled: plain.enabled,\n            key\n        });\n    }\n    static newFrom(profile) {\n        return new_from(profile, ForwardOption);\n    }\n    constructor({ destination, enabled, key } = {}){\n        this.destination = destination;\n        this.enabled = enabled;\n        this.key = key;\n    }\n    setDestination(number) {\n        this.destination = number;\n        return this;\n    }\n    setEnabled(enabled) {\n        this.enabled = enabled;\n        return this;\n    }\n    is(other) {\n        return this.key === other.key;\n    }\n}\nclass Incall {\n    id;\n    extensions;\n    extension;\n    type = 'Incall';\n    constructor({ id, extensions } = {}){\n        this.id = id;\n        this.extensions = extensions;\n        this.extension = extensions?.[0]?.exten;\n    }\n    static parse(plain) {\n        return new Incall({\n            id: plain.id,\n            extensions: plain.extensions\n        });\n    }\n    static newFrom(profile) {\n        return new_from(profile, Incall);\n    }\n    hasExtension(extension) {\n        if (!this.extensions) return false;\n        return this.extensions.some((ext)=>ext.exten === extension);\n    }\n}\nconst STATE = {\n    AVAILABLE: 'available',\n    UNAVAILABLE: 'unavailable',\n    INVISIBLE: 'invisible',\n    DISCONNECTED: 'disconnected',\n    AWAY: 'away'\n};\nconst LINE_STATE = {\n    AVAILABLE: 'available',\n    HOLDING: 'holding',\n    RINGING: 'ringing',\n    TALKING: 'talking',\n    UNAVAILABLE: 'unavailable',\n    PROGRESSING: 'progressing'\n};\nclass Profile {\n    id;\n    firstName;\n    lastName;\n    email;\n    lines;\n    sipLines;\n    incalls;\n    username;\n    mobileNumber;\n    forwards;\n    doNotDisturb;\n    onlineCallRecordEnabled;\n    state;\n    ringSeconds;\n    voicemail;\n    status;\n    subscriptionType;\n    agent;\n    switchboards;\n    callPickupTargetUsers;\n    static parse(plain) {\n        return new Profile({\n            id: plain.uuid,\n            firstName: plain.firstName || plain.firstname || '',\n            lastName: plain.lastName || plain.lastname || '',\n            email: plain.email,\n            lines: plain.lines.map((line)=>Line.parse(line)),\n            incalls: plain.incalls,\n            username: plain.username,\n            mobileNumber: plain.mobile_phone_number || '',\n            ringSeconds: plain.ring_seconds,\n            forwards: [\n                ForwardOption.parse(plain.forwards.unconditional, FORWARD_KEYS.UNCONDITIONAL),\n                ForwardOption.parse(plain.forwards.noanswer, FORWARD_KEYS.NO_ANSWER),\n                ForwardOption.parse(plain.forwards.busy, FORWARD_KEYS.BUSY)\n            ],\n            doNotDisturb: plain.services.dnd.enabled,\n            subscriptionType: plain.subscription_type,\n            voicemail: plain.voicemail,\n            switchboards: plain.switchboards || [],\n            agent: plain.agent,\n            status: '',\n            callPickupTargetUsers: plain.call_pickup_target_users || [],\n            onlineCallRecordEnabled: plain.online_call_record_enabled\n        });\n    }\n    static newFrom(profile) {\n        return new_from(profile, Profile);\n    }\n    constructor({ id, firstName, lastName, email, lines, username, mobileNumber, forwards, doNotDisturb, state, subscriptionType, voicemail, switchboards, agent, status, ringSeconds, sipLines, callPickupTargetUsers, onlineCallRecordEnabled, incalls }){\n        this.id = id;\n        this.firstName = firstName;\n        this.lastName = lastName;\n        this.email = email;\n        this.lines = lines;\n        this.username = username;\n        this.mobileNumber = mobileNumber;\n        this.forwards = forwards;\n        this.doNotDisturb = doNotDisturb;\n        this.state = state;\n        this.voicemail = voicemail;\n        this.subscriptionType = subscriptionType;\n        this.switchboards = switchboards;\n        this.agent = agent;\n        this.status = status;\n        this.callPickupTargetUsers = callPickupTargetUsers;\n        this.onlineCallRecordEnabled = onlineCallRecordEnabled;\n        this.ringSeconds = ringSeconds;\n        this.sipLines = sipLines || [];\n        this.incalls = incalls?.map(Incall.parse) || [];\n    }\n    static getLinesState(lines) {\n        let result = LINE_STATE.UNAVAILABLE;\n        for (const line of lines){\n            if (line.state === LINE_STATE.RINGING) {\n                result = LINE_STATE.RINGING;\n                break;\n            }\n            if (line.state === LINE_STATE.TALKING) {\n                result = LINE_STATE.TALKING;\n                break;\n            }\n            if (line.state === LINE_STATE.AVAILABLE) result = LINE_STATE.AVAILABLE;\n        }\n        return result;\n    }\n    hasId(id) {\n        return id === this.id;\n    }\n    setMobileNumber(number) {\n        this.mobileNumber = number;\n        return this;\n    }\n    setForwardOption(forwardOption) {\n        const updatedForwardOptions = this.forwards.slice();\n        const index = updatedForwardOptions.findIndex((forward)=>forward.is(forwardOption));\n        updatedForwardOptions.splice(index, 1, forwardOption);\n        this.forwards = updatedForwardOptions;\n        return this;\n    }\n    setDoNotDisturb(enabled) {\n        this.doNotDisturb = enabled;\n        return this;\n    }\n    setState(state) {\n        this.state = state;\n        return this;\n    }\n}\nconst availableCodecs = [\n    'vp8',\n    'vp9',\n    'h264'\n];\nclass SipLine {\n    id;\n    uuid;\n    tenantUuid;\n    username;\n    secret;\n    type;\n    host;\n    options;\n    endpointSectionOptions;\n    links;\n    trunk;\n    line;\n    static parse(plain) {\n        let { username, secret, host } = plain;\n        if (plain.auth_section_options) {\n            const findOption = (options, name)=>options.find((option)=>option[0] === name);\n            const usernameOption = findOption(plain.auth_section_options, 'username');\n            const secretOption = findOption(plain.auth_section_options, 'password');\n            const hostOption = findOption(plain.endpoint_section_options, 'media_address');\n            username = usernameOption ? usernameOption[1] : '';\n            secret = secretOption ? secretOption[1] : '';\n            host = hostOption ? hostOption[1] : '';\n        }\n        return new SipLine({\n            id: plain.id,\n            uuid: plain.uuid,\n            tenantUuid: plain.tenant_uuid,\n            username,\n            secret,\n            type: plain.type,\n            host,\n            options: plain.options,\n            endpointSectionOptions: plain.endpoint_section_options,\n            links: plain.links,\n            trunk: plain.trunk,\n            line: plain.line\n        });\n    }\n    static newFrom(sipLine) {\n        return new_from(sipLine, SipLine);\n    }\n    is(line) {\n        if (line.uuid) return this.uuid === line.uuid;\n        return this.id === line.id;\n    }\n    getOptions() {\n        return this.endpointSectionOptions || this.options || [];\n    }\n    isWebRtc() {\n        return this.getOptions().some((option)=>'webrtc' === option[0] && 'yes' === option[1]);\n    }\n    hasVideo() {\n        const allow = this.getOptions().find((option)=>'allow' === option[0]);\n        return Array.isArray(allow) && allow[1].split(',').some((codec)=>availableCodecs.some((c)=>c === codec));\n    }\n    hasVideoConference() {\n        return this.getOptions().some((option)=>'max_audio_streams' === option[0] && parseInt(option[1], 10) > 0) && this.getOptions().some((option)=>'max_video_streams' === option[0] && parseInt(option[1], 10) > 1);\n    }\n    constructor({ id, uuid, tenantUuid, username, secret, type, host, options, endpointSectionOptions, links, trunk, line }){\n        this.id = id;\n        this.uuid = uuid;\n        this.tenantUuid = tenantUuid;\n        this.username = username;\n        this.secret = secret;\n        this.type = type;\n        this.host = host;\n        this.options = options;\n        this.endpointSectionOptions = endpointSectionOptions;\n        this.links = links;\n        this.trunk = trunk;\n        this.line = line;\n        this.type = 'SipLine';\n    }\n}\nclass ExternalApp {\n    name;\n    type;\n    configuration;\n    static parse(plain) {\n        return new ExternalApp({\n            name: plain.name,\n            configuration: plain.configuration\n        });\n    }\n    static parseMany(plain) {\n        return plain.items.map((item)=>ExternalApp.parse(item));\n    }\n    static newFrom(profile) {\n        return new_from(profile, ExternalApp);\n    }\n    constructor({ name, configuration } = {}){\n        this.name = name;\n        this.configuration = configuration;\n        this.type = 'ExternalApp';\n    }\n}\nclass Meeting {\n    type;\n    guestSipAuthorization;\n    uri;\n    uuid;\n    name;\n    port;\n    extension;\n    persistent;\n    ownerUuids;\n    creationTime;\n    pendingAuthorizations;\n    requireAuthorization;\n    static parse(plain) {\n        return new Meeting({\n            guestSipAuthorization: plain.guest_sip_authorization,\n            uri: plain.ingress_http_uri,\n            name: plain.name,\n            ownerUuids: plain.owner_uuids,\n            port: plain.port,\n            uuid: plain.uuid,\n            extension: plain.exten,\n            persistent: plain.persistent,\n            creationTime: external_moment_default()(plain.creation_time).toDate(),\n            requireAuthorization: plain.require_authorization\n        });\n    }\n    static parseMany(items) {\n        if (!items) return [];\n        return items.map((plain)=>Meeting.parse(plain));\n    }\n    static newFrom(meeting) {\n        return new_from(meeting, Meeting);\n    }\n    constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, extension, persistent, creationTime, requireAuthorization } = {}){\n        this.guestSipAuthorization = guestSipAuthorization;\n        this.uri = uri;\n        this.name = name;\n        this.ownerUuids = ownerUuids;\n        this.port = port;\n        this.uuid = uuid;\n        this.extension = extension;\n        this.persistent = persistent;\n        this.creationTime = creationTime;\n        this.requireAuthorization = requireAuthorization;\n        this.type = 'Meeting';\n    }\n    getGuestSipCredentials() {\n        const [username, secret] = Buffer.from(this.guestSipAuthorization, 'base64').toString('ascii').split(':');\n        return {\n            username,\n            secret\n        };\n    }\n}\nconst PENDING = 'pending';\nconst ACCEPTED = 'accepted';\nconst REJECTED = 'rejected';\nconst POST_PROCESSING = 'post_processing';\nconst POST_PROCESSED_SUCCESS = 'post_processed_success';\nconst POST_PROCESSED_ERROR = 'post_processed_error';\nclass MeetingAuthorization {\n    static PENDING = PENDING;\n    static ACCEPTED = ACCEPTED;\n    static REJECTED = REJECTED;\n    static POST_PROCESSING = POST_PROCESSING;\n    static POST_PROCESSED_SUCCESS = POST_PROCESSED_SUCCESS;\n    static POST_PROCESSED_ERROR = POST_PROCESSED_ERROR;\n    meetingUuid;\n    uuid;\n    userUuid;\n    userName;\n    status;\n    constructor({ meetingUuid, uuid, userUuid, userName } = {}){\n        this.meetingUuid = meetingUuid;\n        this.uuid = uuid;\n        this.userUuid = userUuid;\n        this.userName = userName;\n    }\n    setStatus(status) {\n        this.status = status;\n    }\n    getStatus() {\n        return this.status;\n    }\n    static parse(plain) {\n        const { meeting_uuid: meetingUuid, uuid, guest_uuid: userUuid, guest_name: userName } = plain;\n        return new MeetingAuthorization({\n            meetingUuid,\n            uuid,\n            userUuid,\n            userName\n        });\n    }\n    static parseMany(items) {\n        if (!items) return [];\n        return items.map(MeetingAuthorization.parse);\n    }\n}\nconst convertKeysFromCamelToUnderscore = (args)=>{\n    if (!args || 'object' != typeof args || Array.isArray(args)) throw new Error('Input is not an object');\n    return Object.keys(args).reduce((acc, key)=>{\n        acc[camelToUnderscore(key)] = 'object' != typeof args[key] || Array.isArray(args[key]) ? args[key] : convertKeysFromCamelToUnderscore(args[key]);\n        return acc;\n    }, {});\n};\nconst confd = (client, baseUrl)=>({\n        listUsers: ()=>client.get(`${baseUrl}/users`, null),\n        getUser: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}`, null).then(Profile.parse),\n        updateUser: (userUuid, profile)=>{\n            const body = {\n                firstname: profile.firstName,\n                lastname: profile.lastName,\n                email: profile.email,\n                mobile_phone_number: profile.mobileNumber\n            };\n            return client.put(`${baseUrl}/users/${userUuid}`, body, null, ApiRequester.successResponseParser);\n        },\n        updateForwardOption: (userUuid, key, destination, enabled)=>{\n            const url = `${baseUrl}/users/${userUuid}/forwards/${key}`;\n            return client.put(url, {\n                destination,\n                enabled\n            }, null, ApiRequester.successResponseParser);\n        },\n        updateForwardOptions: (userUuid, options)=>{\n            const url = `${baseUrl}/users/${userUuid}/forwards`;\n            return client.put(url, options, null, ApiRequester.successResponseParser);\n        },\n        updateDoNotDisturb: (userUuid, enabled)=>client.put(`${baseUrl}/users/${userUuid}/services/dnd`, {\n                enabled\n            }, null, ApiRequester.successResponseParser),\n        getUserLineSip: (userUuid, lineId)=>client.get(`${baseUrl}/users/${userUuid}/lines/${lineId}/associated/endpoints/sip?view=merged`).then(SipLine.parse),\n        getUserLinesSip (userUuid, lineIds) {\n            return Promise.all(lineIds.map((lineId)=>this.getUserLineSip(userUuid, lineId).catch(()=>null)));\n        },\n        getUserLineSipFromToken (userUuid) {\n            return this.getUser(userUuid).then((user)=>{\n                if (!user.lines.length) {\n                    console.warn(`No sip line for user: ${userUuid}`);\n                    return null;\n                }\n                const line = user.lines[0];\n                return this.getUserLineSip(userUuid, line.uuid || line.id);\n            });\n        },\n        listApplications: ()=>client.get(`${baseUrl}/applications`, null),\n        getInfos: ()=>client.get(`${baseUrl}/infos`, null),\n        getExternalApps: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}/external/apps`).then(ExternalApp.parseMany),\n        getExternalApp: async (userUuid, name)=>{\n            const url = `${baseUrl}/users/${userUuid}/external/apps/${name}?view=fallback`;\n            try {\n                return await client.get(url).then(ExternalApp.parse);\n            } catch (e) {\n                return null;\n            }\n        },\n        getMyMeetings: ()=>client.get(`${baseUrl}/users/me/meetings`).then((response)=>Meeting.parseMany(response.items)),\n        createMyMeeting: (args)=>client.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args)).then(Meeting.parse),\n        updateMyMeeting: (meetingUuid, data)=>client.put(`${baseUrl}/users/me/meetings/${meetingUuid}`, convertKeysFromCamelToUnderscore(data), null, ApiRequester.successResponseParser),\n        deleteMyMeeting: (meetingUuid)=>client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),\n        getMeeting: (meetingUuid)=>client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),\n        meetingAuthorizations: (meetingUuid)=>client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then((response)=>MeetingAuthorization.parseMany(response.items)),\n        meetingAuthorizationReject: (meetingUuid, authorizationUuid)=>client.put(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`, {}, null, ApiRequester.successResponseParser),\n        meetingAuthorizationAccept: (meetingUuid, authorizationUuid)=>client.put(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`, {}, null, ApiRequester.successResponseParser),\n        guestGetMeeting: (meetingUuid)=>client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),\n        guestAuthorizationRequest: (userUuid, meetingUuid, username)=>client.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, {\n                guest_name: username\n            }).then(MeetingAuthorization.parse),\n        guestAuthorizationCheck: (userUuid, meetingUuid, authorizationUuid)=>client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),\n        getOutgoingCallerIDs: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}/callerids/outgoing`, null).then(CallerID.parseMany),\n        getBlockNumbers: (opts = {})=>client.get(`${baseUrl}/users/me/blocklist/numbers`, opts),\n        getBlockNumber: (uuid)=>client.get(`${baseUrl}/users/me/blocklist/numbers/${uuid}`),\n        createBlockNumber: (body)=>client.post(`${baseUrl}/users/me/blocklist/numbers`, body),\n        updateBlockNumber: (uuid, body)=>client.put(`${baseUrl}/users/me/blocklist/numbers/${uuid}`, body, null, ApiRequester.successResponseParser),\n        deleteBlockNumber: (uuid)=>client.delete(`${baseUrl}/users/me/blocklist/numbers/${uuid}`)\n    });\nclass Relocation {\n    static MIN_ENGINE_VERSION_REQUIRED;\n    relocatedCall;\n    initiatorCall;\n    recipientCall;\n    static parse(response) {\n        return new Relocation({\n            initiatorCall: response.initiator_call,\n            recipientCall: response.recipient_call,\n            relocatedCall: response.relocated_call\n        });\n    }\n    constructor({ relocatedCall, initiatorCall, recipientCall }){\n        this.initiatorCall = initiatorCall || '';\n        this.relocatedCall = relocatedCall || '';\n        this.recipientCall = recipientCall || '';\n    }\n}\nRelocation.MIN_ENGINE_VERSION_REQUIRED = '19.09';\nconst domain_Relocation = Relocation;\nclass ChatMessage {\n    type;\n    uuid;\n    content;\n    date;\n    alias;\n    userUuid;\n    roomUuid;\n    read;\n    static parseMany(plain) {\n        if (!plain || !plain.items) return [];\n        return plain.items.map((item)=>ChatMessage.parse(item));\n    }\n    static parse(plain) {\n        return new ChatMessage({\n            uuid: plain.uuid,\n            date: external_moment_default()(plain.created_at).toDate(),\n            content: plain.content,\n            alias: plain.alias,\n            userUuid: plain.user_uuid,\n            read: true,\n            roomUuid: plain.room ? plain.room.uuid : null\n        });\n    }\n    static newFrom(message) {\n        return new_from(message, ChatMessage);\n    }\n    constructor({ uuid, date, content, userUuid, alias, roomUuid, read } = {}){\n        this.uuid = uuid;\n        this.date = date;\n        this.content = content;\n        this.userUuid = userUuid;\n        this.alias = alias;\n        this.roomUuid = roomUuid;\n        this.read = read;\n        this.type = 'ChatMessage';\n    }\n    is(other) {\n        return this.uuid === other.uuid;\n    }\n    isIncoming(userUuid) {\n        return this.userUuid !== userUuid;\n    }\n    acknowledge() {\n        this.read = true;\n        return this;\n    }\n}\nconst VoicemailFolder = {\n    NEW: 'new',\n    OLD: 'old',\n    URGENT: 'urgent',\n    OTHER: 'other'\n};\nconst VoicemailFolderMapping = {\n    [VoicemailFolder.NEW]: 1,\n    [VoicemailFolder.OLD]: 2,\n    [VoicemailFolder.URGENT]: 3,\n    [VoicemailFolder.OTHER]: 4\n};\nclass Voicemail {\n    type;\n    id;\n    date;\n    duration;\n    unread;\n    mailbox;\n    caller;\n    static parse(plain) {\n        return new Voicemail({\n            id: plain.id,\n            date: external_moment_default()(1000 * plain.timestamp).toDate(),\n            duration: 1000 * plain.duration,\n            caller: {\n                name: plain.caller_id_name,\n                number: plain.caller_id_num\n            },\n            unread: plain.folder ? plain.folder.type === VoicemailFolder.NEW : null,\n            mailbox: plain.voicemail\n        });\n    }\n    static parseMany(plain) {\n        if (!plain) return [];\n        const plainUnread = plain.folders.filter((folder)=>folder.type === VoicemailFolder.NEW)[0].messages;\n        const plainRead = plain.folders.filter((folder)=>folder.type === VoicemailFolder.OLD)[0].messages;\n        const unread = plainUnread.map((message)=>Voicemail.parse(message)).map((voicemail)=>voicemail.makeAsUnRead());\n        const read = plainRead.map((message)=>Voicemail.parse(message)).map((voicemail)=>voicemail.acknowledge());\n        return [\n            ...unread,\n            ...read\n        ];\n    }\n    static parseListData(plain) {\n        if (!plain || !plain.items) return [];\n        return plain.items.filter((item)=>null != item && 'string' == typeof item.id && 'number' == typeof item.duration && 'number' == typeof item.timestamp).map((item)=>Voicemail.parse({\n                id: item.id,\n                caller_id_name: item.caller_id_name ?? '',\n                caller_id_num: item.caller_id_num ?? '',\n                duration: item.duration,\n                timestamp: item.timestamp,\n                folder: item.folder,\n                voicemail: item.voicemail ? {\n                    id: String(item.voicemail.id ?? ''),\n                    name: item.voicemail.name ?? '',\n                    accesstype: item.voicemail.accesstype ?? ''\n                } : void 0\n            }));\n    }\n    static newFrom(profile) {\n        return new_from(profile, Voicemail);\n    }\n    static getFolderMappingFromType(folder) {\n        return VoicemailFolderMapping[folder];\n    }\n    constructor({ id, date, duration, caller, unread, mailbox }){\n        this.id = id;\n        this.date = date;\n        this.duration = duration;\n        this.caller = caller;\n        this.unread = unread;\n        this.mailbox = mailbox;\n        this.type = 'Voicemail';\n    }\n    is(other) {\n        return other && this.id === other.id;\n    }\n    acknowledge() {\n        this.unread = false;\n        return this;\n    }\n    makeAsUnRead() {\n        this.unread = true;\n        return this;\n    }\n    isPersonal() {\n        return !this.mailbox || this.mailbox?.accesstype === 'personal';\n    }\n    contains(query) {\n        if (!query) return true;\n        return this.caller.name.toUpperCase().includes(query.toUpperCase()) || this.caller.number.includes(query);\n    }\n}\nconst RECORDING_STATE = {\n    ACTIVE: 'active',\n    INACTIVE: 'inactive',\n    PAUSED: 'paused'\n};\nclass Call {\n    type;\n    id;\n    sipCallId;\n    callerName;\n    callerNumber;\n    calleeName;\n    calleeNumber;\n    dialedExtension;\n    lineId;\n    isCaller;\n    isVideo;\n    onHold;\n    muted;\n    status;\n    startingTime;\n    answerTime;\n    hangupTime;\n    talkingToIds;\n    recording;\n    recordingPaused;\n    recordingState;\n    static parseMany(plain) {\n        if (!plain) return [];\n        return plain.map((plainCall)=>Call.parse(plainCall));\n    }\n    static parse(plain) {\n        return new Call({\n            id: plain.call_id,\n            sipCallId: plain.sip_call_id,\n            callerName: plain.caller_id_name,\n            callerNumber: plain.caller_id_number,\n            calleeName: plain.peer_caller_id_name,\n            calleeNumber: plain.peer_caller_id_number,\n            dialedExtension: plain.dialed_extension,\n            isCaller: plain.is_caller,\n            isVideo: plain.is_video,\n            muted: plain.muted,\n            onHold: plain.on_hold,\n            status: plain.status,\n            lineId: plain.line_id,\n            startingTime: external_moment_default()(plain.creation_time).toDate(),\n            answerTime: external_moment_default()(plain.answer_time).toDate(),\n            hangupTime: external_moment_default()(plain.hangup_time).toDate(),\n            talkingToIds: Object.keys(plain.talking_to || {}),\n            recording: plain.record_state === RECORDING_STATE.ACTIVE,\n            recordingPaused: plain.record_state === RECORDING_STATE.PAUSED,\n            recordingState: plain.record_state\n        });\n    }\n    static newFrom(call) {\n        return new_from(call, Call);\n    }\n    constructor({ id, sipCallId, callerName, callerNumber, calleeName, calleeNumber, dialedExtension, isCaller, isVideo, lineId, muted, onHold, status, startingTime, answerTime, hangupTime, talkingToIds, recording, recordingPaused, recordingState }){\n        this.id = id;\n        this.sipCallId = sipCallId;\n        this.callerName = callerName;\n        this.callerNumber = callerNumber;\n        this.calleeName = calleeName;\n        this.calleeNumber = calleeNumber;\n        this.dialedExtension = dialedExtension;\n        this.muted = muted;\n        this.onHold = onHold;\n        this.isCaller = isCaller;\n        this.lineId = lineId;\n        this.status = status;\n        this.startingTime = startingTime;\n        this.answerTime = answerTime;\n        this.hangupTime = hangupTime;\n        this.talkingToIds = talkingToIds || [];\n        this.recording = recording;\n        this.recordingPaused = recordingPaused;\n        this.recordingState = recordingState || RECORDING_STATE.INACTIVE;\n        this.isVideo = !!isVideo;\n        this.type = 'Call';\n    }\n    getElapsedTimeInSeconds() {\n        const now = Date.now();\n        return (now - +this.startingTime) / 1000;\n    }\n    separateCalleeName() {\n        const names = this.calleeName.split(' ');\n        const firstName = names[0];\n        const lastName = names.slice(1).join(' ');\n        return {\n            firstName,\n            lastName\n        };\n    }\n    is(other) {\n        return !!other && this.id === other.id;\n    }\n    hasACalleeName() {\n        return this.calleeName.length > 0;\n    }\n    hasNumber(number) {\n        return this.calleeNumber === number;\n    }\n    isUp() {\n        return 'Up' === this.status;\n    }\n    isDown() {\n        return 'Down' === this.status;\n    }\n    isRinging() {\n        return this.isRingingIncoming() || this.isRingingOutgoing();\n    }\n    isRingingIncoming() {\n        return 'Ringing' === this.status;\n    }\n    isRingingOutgoing() {\n        return 'Ring' === this.status;\n    }\n    isFromTransfer() {\n        return 'Down' === this.status || 'Ringing' === this.status;\n    }\n    isOnHold() {\n        return this.onHold;\n    }\n    putOnHold() {\n        this.onHold = true;\n    }\n    resume() {\n        this.onHold = false;\n    }\n    isRecording() {\n        return this.recording;\n    }\n    isRecordingPaused() {\n        return !!this.recordingPaused;\n    }\n}\nconst session_state_namespaceObject = require(\"sip.js/lib/api/session-state\");\nconst update_from = (instance, from)=>{\n    Object.keys(from).forEach((key)=>{\n        if (!instance[key] && from[key] || void 0 !== instance[key] && void 0 !== from[key] && instance[key] !== from[key]) instance[key] = from[key];\n    });\n};\nclass CallSession {\n    call;\n    callId;\n    displayName;\n    realDisplayName;\n    updatedNumber;\n    number;\n    callerNumber;\n    creationTime;\n    startTime;\n    answerTime;\n    endTime;\n    isCaller;\n    answeredBySystem;\n    dialedExtension;\n    ringing;\n    paused;\n    sipCallId;\n    sipStatus;\n    muted;\n    videoMuted;\n    videoRemotelyDowngraded;\n    cameraEnabled;\n    autoAnswer;\n    ignored;\n    screensharing;\n    type;\n    recording;\n    recordingPaused;\n    recordingState;\n    sipSession;\n    conference;\n    constructor({ answered, answeredBySystem, isCaller, displayName, callId, muted, videoMuted, number, paused, ringing, startTime, creationTime, endTime, cameraEnabled, dialedExtension, sipCallId, sipStatus, callerNumber, call, autoAnswer, ignored, screensharing, recording, recordingPaused, recordingState, videoRemotelyDowngraded, sipSession, answerTime, conference }){\n        this.callId = callId;\n        this.sipCallId = sipCallId;\n        this.displayName = displayName;\n        this.number = number;\n        this.creationTime = creationTime;\n        this.startTime = startTime;\n        this.endTime = endTime;\n        this.isCaller = isCaller;\n        this.answered = answered;\n        this.answeredBySystem = answeredBySystem;\n        this.ringing = ringing;\n        this.paused = paused;\n        this.muted = muted;\n        this.videoMuted = videoMuted;\n        this.callerNumber = callerNumber;\n        this.cameraEnabled = cameraEnabled;\n        this.dialedExtension = dialedExtension || '';\n        this.call = call;\n        this.sipStatus = sipStatus;\n        this.autoAnswer = autoAnswer || false;\n        this.ignored = ignored || false;\n        this.screensharing = screensharing || false;\n        this.recording = recording || false;\n        this.recordingPaused = recordingPaused || false;\n        this.recordingState = recordingState || RECORDING_STATE.INACTIVE;\n        this.videoRemotelyDowngraded = videoRemotelyDowngraded;\n        this.sipSession = sipSession;\n        this.answerTime = answerTime || this.answerTime;\n        this.conference = conference;\n        this.type = 'CallSession';\n    }\n    resume() {\n        this.paused = false;\n    }\n    hold() {\n        this.paused = true;\n    }\n    mute() {\n        this.muted = true;\n    }\n    unmute() {\n        this.muted = false;\n    }\n    muteVideo() {\n        this.videoMuted = true;\n    }\n    unmuteVideo() {\n        this.videoMuted = false;\n    }\n    answer() {\n        this.answerTime = new Date();\n    }\n    systemAnswer() {\n        this.answeredBySystem = true;\n    }\n    enableCamera() {\n        this.cameraEnabled = true;\n    }\n    disableCamera() {\n        this.cameraEnabled = false;\n    }\n    ignore() {\n        this.ignored = true;\n    }\n    startScreenSharing() {\n        this.screensharing = true;\n    }\n    stopScreenSharing() {\n        this.screensharing = false;\n    }\n    setIsConference(conference) {\n        this.conference = conference;\n    }\n    isIncoming() {\n        return !this.isCaller && !this.answered;\n    }\n    isOutgoing() {\n        return this.isCaller && !this.answered;\n    }\n    isActive() {\n        return this.answered || this.isOutgoing();\n    }\n    isAnswered() {\n        return this.answered;\n    }\n    isAnsweredBySystem() {\n        return this.answeredBySystem;\n    }\n    isRinging() {\n        return this.ringing;\n    }\n    isOnHold() {\n        return this.paused;\n    }\n    isMuted() {\n        return this.muted;\n    }\n    isVideoMuted() {\n        return this.videoMuted;\n    }\n    isCameraEnabled() {\n        return this.cameraEnabled;\n    }\n    isIgnored() {\n        return this.ignored;\n    }\n    isScreenSharing() {\n        return this.screensharing;\n    }\n    isRecording() {\n        return this.recording;\n    }\n    isRecordingPaused() {\n        return this.recordingPaused;\n    }\n    hasAnInitialInterceptionNumber() {\n        return this.number.startsWith('*8');\n    }\n    isAnInterception() {\n        return this.dialedExtension.startsWith('*8');\n    }\n    isEstablished() {\n        return this.sipStatus === session_state_namespaceObject.SessionState.Established;\n    }\n    isTerminating() {\n        return this.sipStatus === session_state_namespaceObject.SessionState.Terminating;\n    }\n    isTerminated() {\n        return this.sipStatus === session_state_namespaceObject.SessionState.Terminated;\n    }\n    isConference() {\n        return this.conference;\n    }\n    getElapsedTimeInSeconds() {\n        if (!this.startTime) return 0;\n        return (Date.now() - this.startTime) / 1000;\n    }\n    getId() {\n        return this.sipCallId || this.callId;\n    }\n    is(callSession) {\n        if (!callSession) return false;\n        return this.isId(callSession.sipCallId) || this.isId(callSession.callId);\n    }\n    isId(id) {\n        return this.getId() === id || !!this.sipCallId && this.sipCallId === id || !!this.callId && this.callId === id;\n    }\n    updateFrom(session) {\n        update_from(this, session);\n    }\n    separateDisplayName() {\n        const names = this.displayName.split(' ');\n        const firstName = names[0];\n        const lastName = names.slice(1).join(' ');\n        return {\n            firstName,\n            lastName\n        };\n    }\n    getTalkingToIds() {\n        return this.call ? this.call.talkingToIds : [];\n    }\n    setVideoRemotelyDowngraded(value) {\n        this.videoRemotelyDowngraded = value;\n    }\n    isVideoRemotelyDowngraded() {\n        return this.videoRemotelyDowngraded;\n    }\n    static newFrom(callSession) {\n        return new_from(callSession, CallSession);\n    }\n    set answered(value) {\n        this.answerTime = value ? this.answerTime || new Date() : null;\n    }\n    get answered() {\n        return !!this.answerTime;\n    }\n    toJSON() {\n        const jsonObj = {\n            ...this\n        };\n        jsonObj.answered = this.answered;\n        return jsonObj;\n    }\n    static parseCall(call) {\n        return new CallSession({\n            callId: call.id,\n            sipCallId: call.sipCallId,\n            displayName: call.calleeName || call.calleeNumber,\n            number: call.calleeNumber,\n            callerNumber: call.callerNumber,\n            startTime: +call.startingTime,\n            paused: call.isOnHold(),\n            isCaller: call.isCaller,\n            muted: call.muted,\n            videoMuted: false,\n            screensharing: false,\n            recording: call.isRecording(),\n            recordingPaused: call.isRecordingPaused(),\n            recordingState: call.recordingState,\n            ringing: call.isRinging(),\n            answered: call.isUp(),\n            answeredBySystem: call.isUp() && 0 === call.talkingToIds.length,\n            cameraEnabled: call.isVideo,\n            dialedExtension: call.dialedExtension,\n            call,\n            conference: false\n        });\n    }\n}\nconst external_events_namespaceObject = require(\"events\");\nvar external_events_default = /*#__PURE__*/ __webpack_require__.n(external_events_namespaceObject);\nclass Emitter {\n    eventEmitter;\n    constructor(){\n        this.eventEmitter = new (external_events_default())();\n    }\n    on(event, callback) {\n        this.eventEmitter.on(event, callback);\n    }\n    once(event, callback) {\n        this.eventEmitter.once(event, callback);\n    }\n    off(event, callback) {\n        this.eventEmitter.removeListener(event, callback);\n    }\n    unbind() {\n        this.eventEmitter.removeAllListeners();\n    }\n}\n__webpack_require__.g.wazoClients = __webpack_require__.g.wazoClients || {};\n__webpack_require__.g.wazoClientId = __webpack_require__.g.wazoClientId || {};\n__webpack_require__.g.wazoClientToken = __webpack_require__.g.wazoClientToken || {};\n__webpack_require__.g.wazoRefreshToken = __webpack_require__.g.wazoRefreshToken || {};\n__webpack_require__.g.wazoRefreshTenantId = __webpack_require__.g.wazoRefreshTenantId || {};\n__webpack_require__.g.wazoRefreshDomainName = __webpack_require__.g.wazoRefreshDomainName || {};\n__webpack_require__.g.wazoOnRefreshToken = __webpack_require__.g.wazoOnRefreshToken || {};\n__webpack_require__.g.wazoOnRefreshTokenError = __webpack_require__.g.wazoOnRefreshTokenError || {};\n__webpack_require__.g.wazoRefreshExpiration = __webpack_require__.g.wazoRefreshExpiration || {};\n__webpack_require__.g.wazoRefreshBackend = __webpack_require__.g.wazoRefreshBackend || {};\n__webpack_require__.g.wazoIsMobile = __webpack_require__.g.wazoIsMobile || {};\n__webpack_require__.g.wazoRequestApiTimeout = __webpack_require__.g.wazoRequestApiTimeout || {};\n__webpack_require__.g.wazoFetchOptions = __webpack_require__.g.wazoFetchOptions || {};\nconst setApiClientId = (clientId, forServer = null)=>{\n    __webpack_require__.g.wazoClientId[String(forServer)] = clientId;\n};\nconst setCurrentServer = (newServer)=>{\n    __webpack_require__.g.wazoCurrentServer = newServer;\n};\nconst setApiToken = (newToken, forServer = null)=>{\n    __webpack_require__.g.wazoClientToken[String(forServer)] = newToken;\n};\nconst setRefreshToken = (newRefreshToken, forServer = null)=>{\n    __webpack_require__.g.wazoRefreshToken[String(forServer)] = newRefreshToken;\n};\nconst setRefreshTenantId = (refreshTenantId, forServer = null)=>{\n    console.warn('Use of `setRefreshTenantId` is deprecated, please use `setRefreshDomainName` instead');\n    __webpack_require__.g.wazoRefreshTenantId[String(forServer)] = refreshTenantId;\n};\nconst setRefreshDomainName = (refreshDomainName, forServer = null)=>{\n    __webpack_require__.g.wazoRefreshDomainName[String(forServer)] = refreshDomainName;\n};\nconst setOnRefreshToken = (onRefreshToken, forServer = null)=>{\n    __webpack_require__.g.wazoOnRefreshToken[String(forServer)] = onRefreshToken;\n};\nconst setOnRefreshTokenError = (callback, forServer = null)=>{\n    __webpack_require__.g.wazoOnRefreshTokenError[String(forServer)] = callback;\n};\nconst setRefreshExpiration = (refreshExpiration, forServer = null)=>{\n    __webpack_require__.g.wazoRefreshExpiration[String(forServer)] = refreshExpiration;\n};\nconst setIsMobile = (isMobile, forServer = null)=>{\n    __webpack_require__.g.wazoIsMobile[String(forServer)] = isMobile;\n};\nconst setRequestTimeout = (requestTimeout, forServer = null)=>{\n    __webpack_require__.g.wazoRequestApiTimeout[String(forServer)] = requestTimeout;\n};\nconst setFetchOptions = (fetchOptions, forServer = null)=>{\n    __webpack_require__.g.wazoFetchOptions[String(forServer)] = fetchOptions;\n};\nconst getFetchOptions = (forServer = null)=>(forServer ? __webpack_require__.g.wazoFetchOptions[forServer] : __webpack_require__.g.wazoFetchOptions.null) || __webpack_require__.g.wazoFetchOptions.null;\nconst fillClient = (apiClient)=>{\n    const { server, token, clientId } = apiClient.client;\n    const tenantId = __webpack_require__.g.wazoRefreshTenantId[server] || __webpack_require__.g.wazoRefreshTenantId.null || apiClient.refreshTenantId;\n    const requestTimeout = __webpack_require__.g.wazoRequestApiTimeout[server] || __webpack_require__.g.wazoRequestApiTimeout.null;\n    apiClient.setToken(__webpack_require__.g.wazoClientToken[server] || __webpack_require__.g.wazoClientToken.null || token);\n    apiClient.setClientId(__webpack_require__.g.wazoClientId[server] || __webpack_require__.g.wazoClientId.null || clientId);\n    apiClient.setRefreshToken(__webpack_require__.g.wazoRefreshToken[server] || __webpack_require__.g.wazoRefreshToken.null || apiClient.refreshToken);\n    if (tenantId) apiClient.setRefreshTenantId(tenantId);\n    apiClient.setRefreshDomainName(__webpack_require__.g.wazoRefreshDomainName[server] || __webpack_require__.g.wazoRefreshDomainName.null || apiClient.refreshDomainName);\n    apiClient.setFetchOptions(__webpack_require__.g.wazoFetchOptions[server] || __webpack_require__.g.wazoFetchOptions.null || apiClient.fetchOptions);\n    apiClient.setOnRefreshToken(__webpack_require__.g.wazoOnRefreshToken[server] || __webpack_require__.g.wazoOnRefreshToken.null || apiClient.onRefreshToken);\n    apiClient.setOnRefreshTokenError(__webpack_require__.g.wazoOnRefreshTokenError[server] || __webpack_require__.g.wazoOnRefreshTokenError.null || apiClient.onRefreshTokenError);\n    apiClient.setRefreshExpiration(__webpack_require__.g.wazoRefreshExpiration[server] || __webpack_require__.g.wazoRefreshExpiration.null || apiClient.refreshExpiration);\n    apiClient.setRefreshBackend(__webpack_require__.g.wazoRefreshBackend[server] || __webpack_require__.g.wazoRefreshBackend.null || apiClient.refreshBackend);\n    apiClient.setIsMobile(__webpack_require__.g.wazoIsMobile[server] || __webpack_require__.g.wazoIsMobile.null || apiClient.isMobile);\n    if (requestTimeout) apiClient.setRequestTimeout(requestTimeout);\n};\nconst getApiClient = (forServer, Client = ApiClient)=>{\n    const server = forServer || __webpack_require__.g.wazoCurrentServer || '';\n    if (server in __webpack_require__.g.wazoClients) {\n        fillClient(__webpack_require__.g.wazoClients[server]);\n        return __webpack_require__.g.wazoClients[server];\n    }\n    __webpack_require__.g.wazoClients[server] = new Client({\n        server\n    });\n    fillClient(__webpack_require__.g.wazoClients[server]);\n    return __webpack_require__.g.wazoClients[server];\n};\nconst service_getApiClient = getApiClient;\nclass CallApi {\n    static async fetchCallLogs(offset, limit) {\n        return service_getApiClient().callLogd.listCallLogs(offset, limit);\n    }\n    static async fetchDistinctCallLogs(offset, limit, distinct = 'peer_exten') {\n        return service_getApiClient().callLogd.listDistinctCallLogs(offset, limit, distinct);\n    }\n    static async fetchActiveCalls() {\n        return service_getApiClient().calld.listCalls();\n    }\n    static async fetchCallLogsFromDate(from, number) {\n        return service_getApiClient().callLogd.listCallLogsFromDate(from, number);\n    }\n    static async search(query, limit) {\n        return service_getApiClient().callLogd.search(query, limit);\n    }\n    static async searchBy(field, value, limit) {\n        return service_getApiClient().callLogd.searchBy(field, value, limit);\n    }\n    static async fetchSIP(session, line) {\n        const lineToUse = line || session.primaryLine();\n        return service_getApiClient().confd.getUserLineSip(session.uuid, lineToUse ? lineToUse.id : '');\n    }\n    static async cancelCall(callSession) {\n        return service_getApiClient().calld.cancelCall(callSession.callId);\n    }\n    static async makeCall(callFromLine, extension, isMobile = false, callbackAllLines = false) {\n        const lineId = callFromLine ? callFromLine.id : null;\n        const response = await service_getApiClient().calld.makeCall(extension, isMobile, lineId, callbackAllLines);\n        return Call.parse(response);\n    }\n    static async relocateCall(callId, line, contactIdentifier) {\n        return service_getApiClient().calld.relocateCall(callId, 'line', line, contactIdentifier);\n    }\n    static async hold(callId) {\n        return service_getApiClient().calld.hold(callId);\n    }\n    static async resume(callId) {\n        return service_getApiClient().calld.resume(callId);\n    }\n    static async mute(callId) {\n        return service_getApiClient().calld.mute(callId);\n    }\n    static async sendDTMF(callId, digits) {\n        return service_getApiClient().calld.sendDTMF(callId, digits);\n    }\n    static async unmute(callId) {\n        return service_getApiClient().calld.unmute(callId);\n    }\n    static async transferCall(callId, number, flow) {\n        return service_getApiClient().calld.transferCall(callId, number, flow);\n    }\n    static async cancelCallTransfer(transferId) {\n        return service_getApiClient().calld.cancelCallTransfer(transferId);\n    }\n    static async confirmCallTransfer(transferId) {\n        return service_getApiClient().calld.confirmCallTransfer(transferId);\n    }\n}\nconst TRANSFER_FLOW_ATTENDED = 'attended';\nconst TRANSFER_FLOW_BLIND = 'blind';\nconst CTIPhone_logger = IssueReporter ? IssueReporter.loggerFor('cti-phone') : console;\nclass CTIPhone extends Emitter {\n    session;\n    isMobile;\n    callbackAllLines;\n    currentCall;\n    client = null;\n    constructor(session, isMobile = false, callbackAllLines = false){\n        super();\n        CTIPhone_logger.info('CTI Phone created');\n        this.session = session;\n        this.isMobile = isMobile;\n        this.callbackAllLines = callbackAllLines;\n    }\n    getOptions() {\n        return {\n            accept: false,\n            decline: true,\n            mute: true,\n            hold: false,\n            transfer: true,\n            sendKey: true,\n            addParticipant: false,\n            record: true,\n            merge: false\n        };\n    }\n    hasAnActiveCall() {\n        return !!this.currentCall;\n    }\n    callCount() {\n        return this.currentCall ? 1 : 0;\n    }\n    isWebRTC() {\n        return false;\n    }\n    getUserAgent() {\n        return 'cti-phone';\n    }\n    startHeartbeat() {}\n    setOnHeartbeatTimeout() {}\n    setOnHeartbeatCallback() {}\n    stopHeartbeat() {}\n    bindClientEvents() {}\n    onConnect() {\n        return Promise.resolve();\n    }\n    onDisconnect() {}\n    async makeCall(number, line) {\n        CTIPhone_logger.info('make CTI call', {\n            number\n        });\n        if (!number) return null;\n        try {\n            this.currentCall = await CallApi.makeCall(line, number, this.isMobile, this.callbackAllLines);\n        } catch (_) {}\n        if (!this.currentCall) return null;\n        const callSession = CallSession.parseCall(this.currentCall);\n        this.eventEmitter.emit('onCallOutgoing', callSession);\n        return callSession;\n    }\n    accept(callSession) {\n        if (!callSession) return Promise.resolve(null);\n        CTIPhone_logger.info('accept CTI call', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        if (!this.currentCall) this.currentCall = callSession.call;\n        return Promise.resolve(callSession.getId());\n    }\n    endCurrentCall(callSession) {\n        if (!callSession) return;\n        CTIPhone_logger.info('end current CTI call', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        this.currentCall = void 0;\n        this.eventEmitter.emit('onCallEnded', callSession);\n    }\n    async hangup(callSession) {\n        if (!callSession) return Promise.resolve(false);\n        CTIPhone_logger.info('hangup CTI call', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        try {\n            await CallApi.cancelCall(callSession);\n            if (this.currentCall && callSession.callId === this.currentCall.id) this.endCurrentCall(callSession);\n            this.eventEmitter.emit('onCallEnded', callSession);\n            return true;\n        } catch (e) {\n            CTIPhone_logger.error('hangup CTI call, error', e);\n            this.eventEmitter.emit('onCallFailed', callSession);\n            return false;\n        }\n    }\n    ignore() {}\n    async reject(callSession) {\n        if (!callSession) return;\n        CTIPhone_logger.info('reject CTI call', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        await CallApi.cancelCall(callSession);\n        this.eventEmitter.emit('onCallEnded', callSession);\n    }\n    async transfer(callSession, number) {\n        if (!callSession) return;\n        CTIPhone_logger.info('transfer CTI call', {\n            callId: callSession.getId(),\n            number: callSession.number,\n            to: number\n        });\n        await CallApi.transferCall(callSession.callId, number, TRANSFER_FLOW_BLIND);\n    }\n    indirectTransfer() {\n        return Promise.resolve(false);\n    }\n    async initiateCTIIndirectTransfer(callSession, number) {\n        if (!callSession) return Promise.resolve(null);\n        CTIPhone_logger.info('indirect CTI transfer', {\n            callId: callSession.getId(),\n            number: callSession.number,\n            to: number\n        });\n        return CallApi.transferCall(callSession.callId, number, TRANSFER_FLOW_ATTENDED);\n    }\n    async cancelCTIIndirectTransfer(transferId) {\n        CTIPhone_logger.info('cancel CTI transfer', {\n            transferId\n        });\n        return CallApi.cancelCallTransfer(transferId);\n    }\n    async confirmCTIIndirectTransfer(transferId) {\n        CTIPhone_logger.info('confirm CTI transfer', {\n            transferId\n        });\n        return CallApi.confirmCallTransfer(transferId);\n    }\n    sendKey(callSession, digits) {\n        if (!callSession) return;\n        CTIPhone_logger.info('send CTI key', {\n            callId: callSession.getId(),\n            number: callSession.number,\n            digits\n        });\n        CallApi.sendDTMF(callSession.callId, digits);\n    }\n    onConnectionMade() {\n        CTIPhone_logger.info('on CTI connection made');\n        this.eventEmitter.emit('onCallAccepted');\n    }\n    async close() {\n        CTIPhone_logger.info('CTI close');\n        return Promise.resolve();\n    }\n    async hold(callSession) {\n        if (!callSession) return false;\n        CTIPhone_logger.info('CTI hold', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        return CallApi.hold(callSession.callId);\n    }\n    async resume(callSession) {\n        if (!callSession) return false;\n        CTIPhone_logger.info('CTI resume', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        return CallApi.resume(callSession.callId);\n    }\n    async mute(callSession) {\n        if (!callSession) return;\n        CTIPhone_logger.info('CTI mute', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        await CallApi.mute(callSession.callId);\n    }\n    async unmute(callSession) {\n        if (!callSession) return;\n        CTIPhone_logger.info('CTI unmute', {\n            callId: callSession.getId(),\n            number: callSession.number\n        });\n        await CallApi.unmute(callSession.callId);\n    }\n    putOnSpeaker() {}\n    putOffSpeaker() {}\n    turnCameraOff() {}\n    turnCameraOn() {}\n    changeAudioInputDevice() {\n        return Promise.resolve(null);\n    }\n    changeVideoInputDevice() {\n        return Promise.resolve(null);\n    }\n    changeAudioDevice() {\n        return Promise.resolve();\n    }\n    changeRingDevice() {}\n    changeAudioVolume() {}\n    changeRingVolume() {}\n    hasVideo() {\n        return false;\n    }\n    hasAVideoTrack() {\n        return false;\n    }\n    getLocalStreamForCall() {\n        return null;\n    }\n    getRemoteStreamForCall() {\n        return null;\n    }\n    getLocalVideoStream() {\n        return null;\n    }\n    setActiveSipSession() {}\n    isRegistered() {\n        return true;\n    }\n    hasIncomingCallSession() {\n        return true;\n    }\n    hasActiveRemoteVideoStream() {\n        return false;\n    }\n    getCurrentCallSession() {\n        return this.currentCall ? CallSession.parseCall(this.currentCall) : null;\n    }\n    enableRinging() {}\n    sendMessage() {}\n    disableRinging() {}\n    getLocalStream() {\n        return null;\n    }\n    getRemoteStream() {\n        return null;\n    }\n    getRemoteVideoStream() {\n        return null;\n    }\n    getRemoteAudioStream() {\n        return null;\n    }\n    hasLocalVideo() {\n        return false;\n    }\n    useLocalVideoElement() {}\n    setMediaConstraints() {}\n    register() {\n        return Promise.resolve(null);\n    }\n}\nconst ctid_ng = (client, baseUrl)=>({\n        updatePresence: (presence)=>client.put(`${baseUrl}/users/me/presences`, {\n                presence\n            }, null, ApiRequester.successResponseParser),\n        listMessages: (participantUuid, limit)=>{\n            const query = {};\n            if (participantUuid) query.participant_user_uuid = participantUuid;\n            if (limit) query.limit = limit;\n            return client.get(`${baseUrl}/users/me/chats`, query).then(ChatMessage.parseMany);\n        },\n        sendMessage: (alias, msg, toUserId)=>{\n            const body = {\n                alias,\n                msg,\n                to: toUserId\n            };\n            return client.post(`${baseUrl}/users/me/chats`, body, null, ApiRequester.successResponseParser);\n        },\n        makeCall: (extension, fromMobile, lineId, allLines = false)=>{\n            const query = {\n                from_mobile: fromMobile,\n                extension\n            };\n            if (lineId) query.line_id = lineId;\n            if (allLines) query.all_lines = true;\n            return client.post(`${baseUrl}/users/me/calls`, query);\n        },\n        cancelCall: (callId)=>client.delete(`${baseUrl}/users/me/calls/${callId}`),\n        listCalls: ()=>client.get(`${baseUrl}/users/me/calls`).then((response)=>Call.parseMany(response.items)),\n        relocateCall (callId, destination, lineId, contact) {\n            const body = {\n                completions: [\n                    'answer'\n                ],\n                destination,\n                initiator_call: callId,\n                auto_answer: true\n            };\n            if (lineId || contact) body.location = {};\n            if (lineId) body.location.line_id = lineId;\n            if (contact) body.location.contact = contact;\n            return client.post(`${baseUrl}/users/me/relocates`, body).then(domain_Relocation.parse);\n        },\n        transferCall (callId, number, flow = TRANSFER_FLOW_BLIND) {\n            const body = {\n                exten: number,\n                flow,\n                initiator_call: callId\n            };\n            return client.post(`${baseUrl}/users/me/transfers`, body);\n        },\n        cancelCallTransfer: (transferId)=>client.delete(`${baseUrl}/users/me/transfers/${transferId}`),\n        confirmCallTransfer: (transferId)=>client.put(`${baseUrl}/users/me/transfers/${transferId}/complete`),\n        listVoicemails: ()=>client.get(`${baseUrl}/users/me/voicemails`, null).then((response)=>Voicemail.parseMany(response)),\n        deleteVoicemail: (voicemailId)=>client.delete(`${baseUrl}/users/me/voicemails/messages/${voicemailId}`, null),\n        getPresence: (contactUuid)=>client.get(`${baseUrl}/users/${contactUuid}/presences`, null),\n        getStatus: (lineUuid)=>client.get(`${baseUrl}/lines/${lineUuid}/presences`, null),\n        fetchSwitchboardHeldCalls: (switchboardUuid)=>client.get(`${baseUrl}/switchboards/${switchboardUuid}/calls/held`, null),\n        holdSwitchboardCall: (switchboardUuid, callId)=>client.put(`${baseUrl}/switchboards/${switchboardUuid}/calls/held/${callId}`, null, null, ApiRequester.successResponseParser),\n        answerSwitchboardHeldCall: (switchboardUuid, callId)=>client.put(`${baseUrl}/switchboards/${switchboardUuid}/calls/held/${callId}/answer`, null),\n        fetchSwitchboardQueuedCalls: (switchboardUuid)=>client.get(`${baseUrl}/switchboards/${switchboardUuid}/calls/queued`, null),\n        answerSwitchboardQueuedCall: (switchboardUuid, callId)=>client.put(`${baseUrl}/switchboards/${switchboardUuid}/calls/queued/${callId}/answer`, null),\n        sendFax: (extension, fax, callerId = null)=>{\n            const headers = {\n                'Content-type': 'application/pdf',\n                'X-Auth-Token': client.token\n            };\n            const params = ApiRequester.getQueryString({\n                extension,\n                caller_id: callerId\n            });\n            return client.post(`${baseUrl}/users/me/faxes?${params}`, fax, headers);\n        }\n    });\nconst jsonToGraphQLQuery_namespaceObject = require(\"json-to-graphql-query/lib/jsonToGraphQLQuery\");\nconst getContactPayload = (contact)=>({\n        email: contact.email,\n        firstname: contact.firstName ? contact.firstName : '',\n        lastname: contact.lastName ? contact.lastName : '',\n        number: contact.phoneNumber ? contact.phoneNumber : '',\n        entreprise: contact.entreprise ? contact.entreprise : '',\n        birthday: contact.birthday ? contact.birthday : '',\n        address: contact.address ? contact.address : '',\n        note: contact.note ? contact.note : ''\n    });\nconst dird = (client, baseUrl)=>({\n        search: (context, term, offset = 0, limit = null)=>client.get(`${baseUrl}/directories/lookup/${context}`, {\n                term\n            }).then((response)=>Contact.parseMany(response, offset, limit)),\n        listPersonalContacts: (queryParams)=>client.get(`${baseUrl}/personal`, queryParams).then((response)=>Contact.parseManyPersonal(response.items)),\n        fetchPersonalContact: (contactUuid)=>client.get(`${baseUrl}/personal/${contactUuid}`).then(Contact.parsePersonal),\n        addContact: (contact)=>client.post(`${baseUrl}/personal`, getContactPayload(contact)).then(Contact.parsePersonal),\n        editContact: (contact)=>client.put(`${baseUrl}/personal/${contact.sourceId || contact.id || ''}`, getContactPayload(contact)).then(Contact.parsePersonal),\n        importContacts: async (csv)=>{\n            const headers = {\n                'Content-Type': 'text/csv; charset=utf-8',\n                'X-Auth-Token': client.token\n            };\n            return client.post(`${baseUrl}/personal/import`, csv, headers).then((result)=>Contact.parseManyPersonal(result.created));\n        },\n        deleteContact: (contactUuid)=>client.delete(`${baseUrl}/personal/${contactUuid}`),\n        listFavorites: (context)=>client.get(`${baseUrl}/directories/favorites/${context}`).then(Contact.parseMany),\n        markAsFavorite: (source, sourceId)=>{\n            const url = `${baseUrl}/directories/favorites/${source}/${sourceId}`;\n            return client.put(url, null, null, ApiRequester.successResponseParser);\n        },\n        removeFavorite: (source, sourceId)=>client.delete(`${baseUrl}/directories/favorites/${source}/${sourceId}`),\n        fetchOffice365Source: (context)=>client.get(`${baseUrl}/directories/${context}/sources`, {\n                backend: 'office365'\n            }),\n        fetchOffice365Contacts: async (source, queryParams)=>{\n            if (!source) return Promise.resolve([]);\n            return client.get(`${baseUrl}/backends/office365/sources/${source.uuid}/contacts`, queryParams).then((response)=>Contact.parseManyOffice365(response.items, source));\n        },\n        fetchWazoSource: (context)=>client.get(`${baseUrl}/directories/${context}/sources`, {\n                backend: 'wazo'\n            }),\n        fetchWazoContacts: async (source, queryParams, options)=>{\n            if (!source) return [];\n            const defaultParser = (response, src)=>Contact.parseManyWazo(response.items, src);\n            const parser = options?.parser ?? defaultParser;\n            return client.get(`${baseUrl}/backends/wazo/sources/${source.uuid}/contacts`, queryParams).then((response)=>parser(response, source));\n        },\n        fetchGoogleSource: (context)=>client.get(`${baseUrl}/directories/${context}/sources`, {\n                backend: 'google'\n            }),\n        fetchGoogleContacts: async (source, queryParams)=>{\n            if (!source) return Promise.resolve([]);\n            return client.get(`${baseUrl}/backends/google/sources/${source.uuid}/contacts`, queryParams).then((response)=>Contact.parseManyGoogle(response.items, source));\n        },\n        fetchConferenceSource: (context)=>client.get(`${baseUrl}/directories/${context}/sources`, {\n                backend: 'conference'\n            }),\n        fetchSourcesFor: (context, backend)=>client.get(`${baseUrl}/directories/${context}/sources`, {\n                backend\n            }),\n        fetchPhonebookContacts: async (source, queryParams)=>{\n            if (!source) return Promise.resolve({\n                items: [],\n                total: 0\n            });\n            return client.get(`${baseUrl}/backends/phonebook/sources/${source.uuid}/contacts`, queryParams);\n        },\n        fetchConferenceContacts: async (source, queryParams)=>{\n            if (!source) return Promise.resolve([]);\n            return client.get(`${baseUrl}/backends/conference/sources/${source.uuid}/contacts`, queryParams).then((response)=>Contact.parseManyConference(response.items, source));\n        },\n        findMultipleContactsByNumber: (numbers, fields)=>{\n            const query = (0, jsonToGraphQLQuery_namespaceObject.jsonToGraphQLQuery)({\n                me: {\n                    contacts: {\n                        __args: {\n                            profile: 'default',\n                            extens: numbers\n                        },\n                        edges: {\n                            node: fields || {\n                                firstname: true,\n                                lastname: true,\n                                wazoReverse: true,\n                                wazoBackend: true,\n                                email: true,\n                                wazoSourceEntryId: true,\n                                wazoSourceName: true,\n                                '... on WazoContact': {\n                                    userUuid: true\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            return client.post(`${baseUrl}/graphql`, {\n                query: `{${query}}`\n            }).then(Contact.manyGraphQlWithNumbersParser(numbers));\n        }\n    });\nclass Recording {\n    deleted;\n    end;\n    fileName;\n    start;\n    uuid;\n    static parseMany(recordings = []) {\n        if (!recordings) return [];\n        return recordings.map((item)=>Recording.parse(item));\n    }\n    static parse(plain) {\n        return new Recording({\n            deleted: plain.deleted,\n            fileName: plain.filename,\n            end: plain.end_time ? external_moment_default()(plain.end_time).toDate() : null,\n            start: external_moment_default()(plain.start_time).toDate(),\n            uuid: plain.uuid\n        });\n    }\n    constructor({ deleted, end, fileName, start, uuid }){\n        this.deleted = deleted;\n        this.end = end;\n        this.fileName = fileName;\n        this.start = start;\n        this.uuid = uuid;\n    }\n}\nconst CALL_LOG_VALID_REQUESTED_VERSION = '24.14';\nclass CallLog {\n    type;\n    answer;\n    answered;\n    newMissedCall;\n    callDirection;\n    callStatus;\n    destination;\n    requested;\n    recordings;\n    source;\n    id;\n    duration;\n    start;\n    end;\n    static merge(current, toMerge) {\n        const onlyUnique = (value, index, self)=>self.indexOf(value) === index;\n        const allLogs = current.concat(toMerge);\n        const onlyUniqueIds = allLogs.map((c)=>c.id).filter(onlyUnique);\n        return onlyUniqueIds.map((id)=>allLogs.find((log)=>log && log.id === id));\n    }\n    static parseMany(plain) {\n        if (!plain || !plain.items) return [];\n        return plain.items.map((item)=>CallLog.parse(item));\n    }\n    static parse(plain) {\n        return new CallLog({\n            answer: plain.answer ? external_moment_default()(plain.answer).toDate() : null,\n            answered: plain.answered,\n            callDirection: plain.call_direction,\n            callStatus: plain.call_status || (plain?.answered ? 'answered' : 'unknown'),\n            destination: {\n                uuid: plain.destination_user_uuid,\n                name: plain.requested_name || plain.destination_name || '',\n                extension: plain.requested_extension || plain.destination_extension || `meeting-${plain.requested_name || plain.destination_name || ''}`,\n                plainExtension: plain.destination_extension,\n                plainName: plain.destination_name\n            },\n            requested: {\n                uuid: plain.requested_user_uuid,\n                name: plain.requested_name || '',\n                extension: plain.requested_extension\n            },\n            source: {\n                uuid: plain.source_user_uuid,\n                name: plain.source_name,\n                extension: plain.source_extension\n            },\n            id: plain.id,\n            duration: 1000 * (plain.duration || 0),\n            start: external_moment_default()(plain.start).toDate(),\n            end: plain.end ? external_moment_default()(plain.end).toDate() : null,\n            recordings: Recording.parseMany(plain.recordings || [])\n        });\n    }\n    static parseNew(plain, session) {\n        const callLog = CallLog.parse(plain);\n        callLog.newMissedCall = session && plain.destination_user_uuid === session.uuid && !plain.answered;\n        return callLog;\n    }\n    static newFrom(profile) {\n        return new_from(profile, CallLog);\n    }\n    constructor({ answer, answered, callDirection, callStatus = 'unknown', destination, requested, source, id, duration, start, end, recordings }){\n        this.answer = answer;\n        this.answered = answered;\n        this.callDirection = callDirection;\n        this.callStatus = callStatus;\n        this.destination = destination;\n        this.requested = requested;\n        this.source = source;\n        this.id = id;\n        this.duration = duration;\n        this.start = start;\n        this.end = end;\n        this.recordings = recordings || [];\n        this.type = 'CallLog';\n    }\n    isFromSameParty(other, session) {\n        return this.theOtherParty(session).extension === other.theOtherParty(session).extension;\n    }\n    theOtherParty(session) {\n        if ('inbound' === this.callDirection) return this.source;\n        if ('outbound' === this.callDirection) return this.destination;\n        return session?.hasExtension(this.source.extension) ? this.destination : this.source;\n    }\n    isNewMissedCall() {\n        return this.newMissedCall;\n    }\n    acknowledgeCall() {\n        this.newMissedCall = false;\n        return this;\n    }\n    isAcknowledged() {\n        return this.newMissedCall;\n    }\n    isAnswered() {\n        return this.answered;\n    }\n    isOutgoing(session) {\n        if ('internal' === this.callDirection) return session.hasExtension(this.source.extension);\n        return 'outbound' === this.callDirection;\n    }\n    isIncoming(session) {\n        if ('internal' === this.callDirection) return session.hasExtension(this.destination.plainExtension) || session.hasExtension(this.requested.extension) || session.uuid === this.destination.uuid || session.uuid === this.requested.uuid;\n        return 'inbound' === this.callDirection;\n    }\n    isIncomingAndForwarded(session) {\n        if (!session.hasEngineVersionGte(CALL_LOG_VALID_REQUESTED_VERSION) || !this.isIncoming(session)) return false;\n        return this.requested.extension !== this.destination.plainExtension;\n    }\n    isAnOutgoingCall(session) {\n        console.warn(`@wazo/sdk\n      CallLog.isAnOutgoingcall(session) method is obsolete.\n      Please use CallLog.isOutgoing(session).\n    `);\n        return session.hasExtension(this.source.extension) && this.answered;\n    }\n    isAMissedOutgoingCall(session) {\n        return session.hasExtension(this.source.extension) && !this.answered;\n    }\n    isAnIncomingCall(session) {\n        console.warn(`@wazo/sdk\n      CallLog.isAnIncomingCall(session) method is obsolete.\n      Please use CallLog.isIncoming(session).\n    `);\n        return session.hasExtension(this.destination.extension) && this.answered;\n    }\n    isADeclinedCall(session) {\n        return !this.answered && session.hasExtension(this.destination.extension);\n    }\n    getRecordings() {\n        return this.recordings;\n    }\n}\nconst call_logd = (client, baseUrl)=>({\n        search: (search, limit = 5)=>client.get(`${baseUrl}/users/me/cdr`, {\n                search,\n                limit\n            }).then(CallLog.parseMany),\n        searchBy: (field, value, limit = 5)=>client.get(`${baseUrl}/users/me/cdr`, {\n                [field]: value,\n                limit\n            }).then(CallLog.parseMany),\n        listCallLogs: (offset, limit = 5, queryParameters = {})=>client.get(`${baseUrl}/users/me/cdr`, {\n                offset,\n                limit,\n                ...queryParameters\n            }).then(CallLog.parseMany),\n        listDistinctCallLogs: (offset, limit = 5, distinct)=>client.get(`${baseUrl}/users/me/cdr`, {\n                offset,\n                limit,\n                distinct\n            }).then(CallLog.parseMany),\n        listCallLogsFromDate: (from, number)=>client.get(`${baseUrl}/users/me/cdr`, {\n                from: from.toISOString(),\n                number\n            }).then(CallLog.parseMany)\n    });\nclass ChatRoom {\n    type;\n    uuid;\n    name;\n    users;\n    kind;\n    static parseMany(plain) {\n        if (!plain || !plain.items) return [];\n        return plain.items.map((item)=>ChatRoom.parse(item));\n    }\n    static parse(plain) {\n        return new ChatRoom({\n            uuid: plain.uuid,\n            name: plain.name,\n            users: plain.users,\n            kind: plain.kind\n        });\n    }\n    static newFrom(room) {\n        return new_from(room, ChatRoom);\n    }\n    constructor({ uuid, name, users, kind } = {}){\n        this.uuid = uuid;\n        this.name = name;\n        this.users = users;\n        this.kind = kind;\n        this.type = 'ChatRoom';\n    }\n}\nconst MAX_PRESENCE_FETCHED = 30;\nconst chatd = (client, baseUrl)=>({\n        updateState: (contactUuid, state)=>client.put(`${baseUrl}/users/${contactUuid}/presences`, {\n                state\n            }, null, ApiRequester.successResponseParser),\n        updateStatus: (contactUuid, state, status)=>{\n            const body = {\n                state,\n                status\n            };\n            return client.put(`${baseUrl}/users/${contactUuid}/presences`, body, null, ApiRequester.successResponseParser);\n        },\n        getState: async (contactUuid)=>client.get(`${baseUrl}/users/${contactUuid}/presences`).then((response)=>response.state),\n        getContactStatusInfo: async (contactUuid)=>client.get(`${baseUrl}/users/${contactUuid}/presences`).then((response)=>response),\n        getLineState: async (contactUuid)=>client.get(`${baseUrl}/users/${contactUuid}/presences`).then((response)=>Profile.getLinesState(response.lines)),\n        async getMultipleLineState (contactUuids) {\n            const body = {};\n            const uuids = contactUuids || [];\n            if (uuids.length > MAX_PRESENCE_FETCHED) {\n                const requests = uuids.reduce((acc, _, i)=>{\n                    if (i % MAX_PRESENCE_FETCHED === 0) acc.push(this.getMultipleLineState(uuids.slice(i, i + MAX_PRESENCE_FETCHED)));\n                    return acc;\n                }, []);\n                const splittedStatuses = await Promise.all(requests);\n                return splittedStatuses.flat();\n            }\n            if (uuids.length) body.user_uuid = uuids.join(',');\n            return client.get(`${baseUrl}/users/presences`, body).then((response)=>response.items);\n        },\n        getUserRooms: async ()=>client.get(`${baseUrl}/users/me/rooms`).then(ChatRoom.parseMany),\n        createRoom: async (name, users, kind)=>client.post(`${baseUrl}/users/me/rooms`, {\n                name,\n                users,\n                kind\n            }).then(ChatRoom.parse),\n        getRoomMessages: async (roomUuid, params)=>{\n            const qs = ApiRequester.getQueryString(params || {});\n            return client.get(`${baseUrl}/users/me/rooms/${roomUuid}/messages${qs.length ? `?${qs}` : ''}`).then((response)=>ChatMessage.parseMany(response));\n        },\n        sendRoomMessage: async (roomUuid, message)=>client.post(`${baseUrl}/users/me/rooms/${roomUuid}/messages`, message).then(ChatMessage.parse),\n        getMessages: async (options)=>client.get(`${baseUrl}/users/me/rooms/messages`, options)\n    });\nclass IndirectTransfer {\n    status;\n    id;\n    sourceId;\n    destinationId;\n    constructor({ sourceId, destinationId, status, id }){\n        this.sourceId = sourceId;\n        this.destinationId = destinationId;\n        this.status = status;\n        this.id = id;\n    }\n    static parseFromCallSession(source, destination) {\n        return new IndirectTransfer({\n            sourceId: source.getId(),\n            destinationId: destination.getId()\n        });\n    }\n    static parseFromApi(plain) {\n        return new IndirectTransfer({\n            id: plain.id,\n            status: plain.status,\n            sourceId: plain.initiator_call,\n            destinationId: plain.recipient_call\n        });\n    }\n    destinationIs(callSession) {\n        return callSession.isId(this.destinationId);\n    }\n    sourceIs(callSession) {\n        return callSession.isId(this.sourceId);\n    }\n    updateFrom(indirectTransfer) {\n        update_from(this, indirectTransfer);\n    }\n    static newFrom(indirectTransfer) {\n        return new_from(indirectTransfer, IndirectTransfer);\n    }\n}\nclass MeetingStatus {\n    type;\n    full;\n    constructor({ full } = {}){\n        this.full = full;\n        this.type = 'MeetingStatus';\n    }\n    static parse(plain) {\n        return new MeetingStatus({\n            full: plain.full\n        });\n    }\n}\nconst calld = (client, baseUrl)=>({\n        updatePresence: (presence)=>client.put(`${baseUrl}/users/me/presences`, {\n                presence\n            }, null, ApiRequester.successResponseParser),\n        listMessages: (participantUuid, limit)=>{\n            const query = {};\n            if (participantUuid) query.participant_user_uuid = participantUuid;\n            if (limit) query.limit = limit;\n            return client.get(`${baseUrl}/users/me/chats`, query).then((response)=>ChatMessage.parseMany(response));\n        },\n        sendMessage: (alias, msg, toUserId)=>{\n            const body = {\n                alias,\n                msg,\n                to: toUserId\n            };\n            return client.post(`${baseUrl}/users/me/chats`, body, null, ApiRequester.successResponseParser);\n        },\n        makeCall: (extension, fromMobile, lineId, allLines = false)=>{\n            const query = {\n                from_mobile: fromMobile,\n                extension\n            };\n            if (lineId) query.line_id = lineId;\n            if (allLines) query.all_lines = true;\n            return client.post(`${baseUrl}/users/me/calls`, query);\n        },\n        cancelCall: (callId)=>client.delete(`${baseUrl}/users/me/calls/${callId}`, null),\n        listCalls: ()=>client.get(`${baseUrl}/users/me/calls`, null).then((response)=>Call.parseMany(response.items)),\n        relocateCall (callId, destination, lineId, contact) {\n            const body = {\n                completions: [\n                    'answer'\n                ],\n                destination,\n                initiator_call: callId,\n                auto_answer: true\n            };\n            if (lineId || contact) body.location = {};\n            if (lineId) body.location.line_id = lineId;\n            if (contact) body.location.contact = contact;\n            return client.post(`${baseUrl}/users/me/relocates`, body).then((response)=>domain_Relocation.parse(response));\n        },\n        listVoicemails: ()=>client.get(`${baseUrl}/users/me/voicemails`).then((response)=>Voicemail.parseMany(response)),\n        listVoicemailsMessages: (params = {})=>client.get({\n                path: `${baseUrl}/users/me/voicemails/messages`,\n                body: params\n            }).then((response)=>params.raw ? response : Voicemail.parseListData(response)),\n        deleteVoicemail: (voicemailId)=>client.delete(`${baseUrl}/users/me/voicemails/messages/${voicemailId}`),\n        getVoicemailUrl: (voicemail)=>{\n            const body = {\n                token: client.token\n            };\n            return client.computeUrl('get', `${baseUrl}/users/me/voicemails/messages/${voicemail.id}/recording`, body);\n        },\n        updateVoicemailFolder: (voicemail, folder)=>client.put(`${baseUrl}/users/me/voicemails/messages/${voicemail.id}`, {\n                folder_id: Voicemail.getFolderMappingFromType(folder)\n            }, null, ApiRequester.successResponseParser),\n        fetchSwitchboardHeldCalls: (switchboardUuid)=>client.get(`${baseUrl}/switchboards/${switchboardUuid}/calls/held`),\n        holdSwitchboardCall: (switchboardUuid, callId)=>client.put(`${baseUrl}/switchboards/${switchboardUuid}/calls/held/${callId}`, null, null, ApiRequester.successResponseParser),\n        answerSwitchboardHeldCall: (switchboardUuid, callId, lineId = null)=>client.put(`${baseUrl}/switchboards/${switchboardUuid}/calls/held/${callId}/answer${lineId ? `?line_id=${lineId}` : ''}`),\n        fetchSwitchboardQueuedCalls: (switchboardUuid)=>client.get(`${baseUrl}/switchboards/${switchboardUuid}/calls/queued`),\n        answerSwitchboardQueuedCall: (switchboardUuid, callId, lineId = null)=>client.put(`${baseUrl}/switchboards/${switchboardUuid}/calls/queued/${callId}/answer${lineId ? `?line_id=${lineId}` : ''}`),\n        sendFax: (extension, fax, callerId)=>{\n            const headers = {\n                'Content-type': 'application/pdf',\n                'X-Auth-Token': client.token\n            };\n            const params = ApiRequester.getQueryString({\n                extension,\n                caller_id: callerId\n            });\n            return client.post(`${baseUrl}/users/me/faxes?${params}`, fax, headers);\n        },\n        getConferenceParticipantsAsUser: async (conferenceId)=>client.get(`${baseUrl}/users/me/conferences/${conferenceId}/participants`),\n        getMeetingParticipantsAsUser: async (meetingUuid)=>client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),\n        banMeetingParticipant: (meetingUuid, participantUuid)=>client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`, null, null, ApiRequester.successResponseParser),\n        listTrunks: ()=>client.get(`${baseUrl}/trunks`),\n        mute: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/mute/start`, null, null, ApiRequester.successResponseParser),\n        unmute: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/mute/stop`, null, null, ApiRequester.successResponseParser),\n        hold: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/hold/start`, null, null, ApiRequester.successResponseParser),\n        resume: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/hold/stop`, null, null, ApiRequester.successResponseParser),\n        transferCall: (initiator_call, exten, flow)=>client.post(`${baseUrl}/users/me/transfers`, {\n                initiator_call,\n                exten,\n                flow\n            }).then(IndirectTransfer.parseFromApi),\n        confirmCallTransfer: (transferId)=>client.put(`${baseUrl}/users/me/transfers/${transferId}/complete`, null, null, ApiRequester.successResponseParser),\n        cancelCallTransfer: (transferId)=>client.delete(`${baseUrl}/users/me/transfers/${transferId}`, null, null, ApiRequester.successResponseParser),\n        sendDTMF: (callId, digits)=>client.put(`${baseUrl}/users/me/calls/${callId}/dtmf?digits=${encodeURIComponent(digits)}`, null, null, ApiRequester.successResponseParser),\n        isAhHocConferenceAPIEnabled: ()=>client.head(`${baseUrl}/users/me/conferences/adhoc`, null, null, ApiRequester.successResponseParser),\n        createAdHocConference: (hostCallId, participantCallIds)=>client.post(`${baseUrl}/users/me/conferences/adhoc`, {\n                host_call_id: hostCallId,\n                participant_call_ids: participantCallIds\n            }),\n        addAdHocConferenceParticipant: (conferenceId, callId)=>client.put(`${baseUrl}/users/me/conferences/adhoc/${conferenceId}/participants/${callId}`, null, null, ApiRequester.successResponseParser),\n        removeAdHocConferenceParticipant: (conferenceId, participantCallId)=>client.delete(`${baseUrl}/users/me/conferences/adhoc/${conferenceId}/participants/${participantCallId}`, null, null, ApiRequester.successResponseParser),\n        deleteAdHocConference: (conferenceId)=>client.delete(`${baseUrl}/users/me/conferences/adhoc/${conferenceId}`, null, null, ApiRequester.successResponseParser),\n        startRecording: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/record/start`, null, null, ApiRequester.successResponseParser),\n        stopRecording: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/record/stop`, null, null, ApiRequester.successResponseParser),\n        pauseRecording: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/record/pause`, null, null, ApiRequester.successResponseParser),\n        resumeRecording: (callId)=>client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null, ApiRequester.successResponseParser),\n        guestGetMeetingStatus: (meetingUuid)=>client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse)\n    });\nclass Agent {\n    context;\n    extension;\n    id;\n    logged;\n    number;\n    originUuid;\n    paused;\n    pausedReason;\n    queues;\n    stateInterface;\n    tenantUuid;\n    static parse(plain) {\n        return new Agent({\n            context: plain.context,\n            extension: plain.extension,\n            id: plain.id,\n            logged: plain.logged,\n            number: plain.number,\n            originUuid: plain.origin_uuid ?? '',\n            paused: plain.paused,\n            pausedReason: plain.paused_reason,\n            queues: plain.queues ? plain.queues.map((queue)=>({\n                    displayName: queue.display_name,\n                    id: queue.id,\n                    logged: queue.logged,\n                    name: queue.name,\n                    paused: queue.paused,\n                    pausedReason: queue.paused_reason\n                })) : [],\n            stateInterface: plain.state_interface ?? '',\n            tenantUuid: plain.tenant_uuid ?? ''\n        });\n    }\n    constructor({ context, extension, id, logged, number, originUuid = '', paused, pausedReason, queues = [], stateInterface = '', tenantUuid = '' }){\n        this.context = context;\n        this.extension = extension;\n        this.id = id;\n        this.logged = logged;\n        this.number = number;\n        this.originUuid = originUuid;\n        this.paused = paused;\n        this.pausedReason = pausedReason;\n        this.queues = queues;\n        this.stateInterface = stateInterface;\n        this.tenantUuid = tenantUuid;\n    }\n}\nconst domain_Agent = Agent;\nconst agentd = (client, baseUrl)=>({\n        getAgent: (agentId)=>client.get(`${baseUrl}/agents/by-id/${agentId}`, null).then(domain_Agent.parse),\n        login: (agentNumber, context, extension)=>client.post(`${baseUrl}/agents/by-number/${agentNumber}/login`, {\n                context,\n                extension\n            }, null, ApiRequester.successResponseParser),\n        loginWithLineId: (lineId)=>client.post(`${baseUrl}/users/me/agents/login`, {\n                line_id: lineId\n            }, null, ApiRequester.successResponseParser),\n        logout: (agentNumber)=>client.post(`${baseUrl}/agents/by-number/${agentNumber}/logoff`, null, null, ApiRequester.successResponseParser),\n        pause: (agentNumber, reason = 'songbird_reason')=>client.post(`${baseUrl}/agents/by-number/${agentNumber}/pause`, {\n                reason\n            }, null, ApiRequester.successResponseParser),\n        resume: (agentNumber)=>client.post(`${baseUrl}/agents/by-number/${agentNumber}/unpause`, null, null, ApiRequester.successResponseParser),\n        getStatus: ()=>client.get(`${baseUrl}/users/me/agents`, null).then(domain_Agent.parse),\n        staticLogout: ()=>client.post(`${baseUrl}/users/me/agents/logoff`, null, null, ApiRequester.successResponseParser),\n        staticPause: (reason = 'songbird_reason')=>client.post(`${baseUrl}/users/me/agents/pause`, {\n                reason\n            }, null, ApiRequester.successResponseParser),\n        staticResume: ()=>client.post(`${baseUrl}/users/me/agents/unpause`, null, null, ApiRequester.successResponseParser),\n        loginToQueue: (queueId)=>client.put(`${baseUrl}/users/me/agents/queues/${queueId}/login`, null, null, ApiRequester.successResponseParser),\n        logoffFromQueue: (queueId)=>client.put(`${baseUrl}/users/me/agents/queues/${queueId}/logoff`, null, null, ApiRequester.successResponseParser)\n    });\nclass Subscription {\n    name;\n    events;\n    config;\n    uuid;\n    service;\n    eventsUserUuid;\n    eventsWazoUuid;\n    metadata;\n    ownerTenantUuid;\n    ownerUserUuid;\n    static parse(plain) {\n        return new Subscription({\n            name: plain.name,\n            events: plain.events,\n            config: plain.config,\n            uuid: plain.uuid,\n            service: plain.service,\n            eventsUserUuid: plain.events_user_uuid,\n            eventsWazoUuid: plain.events_wazo_uuid,\n            metadata: plain.metadata,\n            ownerTenantUuid: plain.owner_tenant_uuid,\n            ownerUserUuid: plain.owner_user_uuid\n        });\n    }\n    static parseMany(response) {\n        return response.items.map((payload)=>Subscription.parse(payload));\n    }\n    constructor({ name, events, config, uuid, service, eventsUserUuid, eventsWazoUuid, metadata, ownerTenantUuid, ownerUserUuid }){\n        this.name = name;\n        this.events = events;\n        this.config = config;\n        this.uuid = uuid;\n        this.service = service;\n        this.eventsUserUuid = eventsUserUuid;\n        this.eventsWazoUuid = eventsWazoUuid;\n        this.metadata = metadata;\n        this.ownerTenantUuid = ownerTenantUuid;\n        this.ownerUserUuid = ownerUserUuid;\n    }\n}\nconst domain_Subscription = Subscription;\nconst webhookd = (client, baseUrl)=>({\n        getSubscriptions: ()=>client.get(`${baseUrl}/users/me/subscriptions`).then(domain_Subscription.parseMany),\n        getSubscription: (uuid)=>client.get(`${baseUrl}/users/me/subscriptions/${uuid}`).then(domain_Subscription.parse),\n        createSubscription: (payload)=>client.post(`${baseUrl}/users/me/subscriptions`, payload),\n        removeSubscription: (uuid)=>client.delete(`${baseUrl}/users/me/subscriptions/${uuid}`)\n    });\nconst amid = (client, baseUrl)=>({\n        action: (action, args = {})=>client.post(`${baseUrl}/action/${action}`, args),\n        getAors: async (endpoint)=>{\n            try {\n                const rawEvents = await client.post(`${baseUrl}/action/PJSIPShowEndpoint`, {\n                    Endpoint: endpoint\n                }) || [];\n                if (!rawEvents) return [];\n                return rawEvents.filter((event)=>'ContactStatusDetail' === event.Event);\n            } catch  {\n                return [];\n            }\n        }\n    });\nconst AUTH_VERSION = '0.1';\nconst APPLICATION_VERSION = '1.0';\nconst CONFD_VERSION = '1.1';\nconst CTIDNG_VERSION = '1.0';\nconst DIRD_VERSION = '0.1';\nconst CALL_LOGD_VERSION = '1.0';\nconst CHATD_VERSION = '1.0';\nconst CALLD_VERSION = '1.0';\nconst AGENTD_VERSION = '1.0';\nconst WEBHOOKD_VERSION = '1.0';\nconst AMID_VERSION = '1.0';\nconst external_jsrsasign_namespaceObject = require(\"jsrsasign\");\nconst swarmPublicKey = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmkXOuNfY8u5xoTiIhkb8\ndjnbIwG/Wrz3vpo8BZir8L5e1a1nSy740qBjP7ZINBQoALDhFfmdOfJnCyEGiHuz\nZW6jbG6C3PryE3Bu6GKwqSmD6k3q4Zk27fpwYAnNl+rWhYYM563rJZBda/INyHNN\npK7M1mixWi7gNdjjXwoEXSSBx+VpYMkY6LiAB2mvHXTY9M1qI14dvgGoQISZQoKi\nNMTRCg5UP2ic0Dd9nSz/XpcOxGfa+0fwIl1F7RC1tJXOqvkGGPTOV4LLfg/Yta3h\nnUPX9EZZDIX6vO/0IBV1LzjSl2A1bYFYAjJfowv3i1CpvONBOClHjSY5t9Y8MH6p\nBwIDAQAB\n-----END PUBLIC KEY-----`;\nconst pubkey = swarmPublicKey;\nconst BACKEND = {\n    OFFICE365: 'office365',\n    PERSONAL: 'personal',\n    GOOGLE: 'google',\n    WAZO: 'wazo',\n    CONFERENCE: 'conference',\n    PHONEBOOK: 'phonebook'\n};\nconst SOURCE_MOBILE = 'mobile';\nclass Contact {\n    static BACKEND = BACKEND;\n    type;\n    id;\n    uuid;\n    name;\n    firstName;\n    lastName;\n    external;\n    number;\n    numbers;\n    favorited;\n    email;\n    emails;\n    entreprise;\n    birthday;\n    address;\n    note;\n    endpointId;\n    personal;\n    state;\n    lineState;\n    previousPresential;\n    lastActivity;\n    mobile;\n    source;\n    sourceId;\n    status;\n    backend;\n    personalStatus;\n    sessions;\n    connected;\n    doNotDisturb;\n    ringing;\n    lines;\n    static merge(oldContacts, newContacts) {\n        return newContacts.map((current)=>{\n            const old = oldContacts.find((contact)=>contact && contact.is(current));\n            return old ? current.merge(old) : current;\n        });\n    }\n    static sortContacts(a, b) {\n        const aNames = a.separateName();\n        const bNames = b.separateName();\n        const aLastName = aNames.lastName;\n        const bLastName = bNames.lastName;\n        if (aLastName === bLastName) return aNames.firstName.localeCompare(bNames.firstName);\n        return aLastName.localeCompare(bLastName);\n    }\n    static parseMany(response, offset = 0, limit = null) {\n        if (!response || !response.results || 0 === limit) return [];\n        const results = null !== limit && limit > 0 ? response.results.slice(offset, limit) : offset > 0 ? response.results.slice(offset) : response.results;\n        return results.map((r)=>Contact.parse(r, response.column_types));\n    }\n    static manyGraphQlWithNumbersParser(numbers) {\n        return (response)=>{\n            if (!response.data || !response.data.me || !response.data.me.contacts) return [];\n            return response.data.me.contacts.edges.map((edge, i)=>{\n                if (!edge.node) return null;\n                const { email } = edge.node;\n                const name = edge.node.firstname && edge.node.lastname ? `${edge.node.firstname || ''} ${edge.node.lastname || ''}` : edge.node.wazoReverse;\n                return new Contact({\n                    name,\n                    firstName: edge.node.firstname,\n                    lastName: edge.node.lastname,\n                    number: numbers[i],\n                    numbers: [\n                        {\n                            label: 'primary',\n                            number: numbers[i]\n                        }\n                    ],\n                    backend: edge.node.wazoBackend,\n                    source: edge.node.wazoSourceName,\n                    sourceId: edge.node.wazoSourceEntryId || '',\n                    email: email || '',\n                    emails: email ? [\n                        {\n                            label: 'primary',\n                            email\n                        }\n                    ] : [],\n                    uuid: edge.node.userUuid\n                });\n            }).filter((contact)=>!!contact);\n        };\n    }\n    static fetchNumbers(plain, columns) {\n        const numberColumns = columns.map((e, index)=>({\n                index,\n                columnName: e\n            })).filter((e)=>'number' === e.columnName || 'callable' === e.columnName).map((e)=>e.index);\n        return plain.column_values.filter((e, index)=>numberColumns.some((i)=>i === index) && null !== e);\n    }\n    static parse(plain, columns) {\n        const numbers = Contact.fetchNumbers(plain, columns);\n        const email = plain.column_values[columns.indexOf('email')];\n        return new Contact({\n            name: plain.column_values[columns.indexOf('name')],\n            firstName: plain.column_values[columns.indexOf('firstname')],\n            lastName: plain.column_values[columns.indexOf('lastname')],\n            number: numbers.length ? numbers[0] : '',\n            numbers: numbers.map((number, i)=>({\n                    label: 0 === i ? 'primary' : 'secondary',\n                    number\n                })),\n            favorited: plain.column_values[columns.indexOf('favorite')],\n            email: email || '',\n            emails: email ? [\n                {\n                    label: 'primary',\n                    email\n                }\n            ] : [],\n            entreprise: plain.column_values[columns.indexOf('entreprise')] || '',\n            birthday: plain.column_values[columns.indexOf('birthday')] || '',\n            address: plain.column_values[columns.indexOf('address')] || '',\n            note: plain.column_values[columns.indexOf('note')] || '',\n            endpointId: plain.relations.endpoint_id,\n            personal: plain.column_values[columns.indexOf('personal')],\n            source: plain.source,\n            sourceId: plain.relations.source_entry_id || '',\n            uuid: plain.relations.user_uuid,\n            backend: plain.backend || ''\n        });\n    }\n    static parseManyPersonal(results) {\n        return results.map((r)=>Contact.parsePersonal(r));\n    }\n    static parsePersonal(plain) {\n        return new Contact({\n            name: `${plain.firstName || plain.firstname || ''} ${plain.lastName || plain.lastname || ''}`,\n            firstName: plain.firstName || plain.firstname,\n            lastName: plain.lastName || plain.lastname,\n            number: plain.number || '',\n            numbers: plain.number ? [\n                {\n                    label: 'primary',\n                    number: plain.number\n                }\n            ] : [],\n            email: plain.email || '',\n            emails: plain.email ? [\n                {\n                    label: 'primary',\n                    email: plain.email\n                }\n            ] : [],\n            source: 'personal',\n            sourceId: plain.id || '',\n            entreprise: plain.entreprise || '',\n            birthday: plain.birthday || '',\n            address: plain.address || '',\n            note: plain.note || '',\n            favorited: plain.favorited,\n            personal: true,\n            backend: plain.backend || BACKEND.PERSONAL\n        });\n    }\n    static parseMobile(plain) {\n        let address = '';\n        if (plain.postalAddresses.length) {\n            const postalAddress = plain.postalAddresses[0];\n            address = `${postalAddress.street} ${postalAddress.city} ${postalAddress.postCode} ${postalAddress.country}`;\n        }\n        const firstName = plain.givenName || '';\n        const lastName = plain.familyName || '';\n        const companyName = plain.company || '';\n        const isCompanyAccount = !firstName && !lastName;\n        const name = isCompanyAccount ? companyName : `${firstName} ${lastName}`;\n        return new Contact({\n            name,\n            firstName,\n            lastName,\n            number: plain.phoneNumbers.length ? plain.phoneNumbers[0].number : '',\n            numbers: [\n                ...new Map(plain.phoneNumbers.map((item)=>[\n                        item.number,\n                        item\n                    ])).values()\n            ].map((item, idx)=>({\n                    label: 0 === idx ? 'primary' : 'secondary',\n                    number: item.number\n                })),\n            email: plain.emailAddresses.length ? plain.emailAddresses[0].email : '',\n            emails: plain.emailAddresses.length ? [\n                {\n                    label: 'primary',\n                    email: plain.emailAddresses[0].email\n                }\n            ] : [],\n            source: SOURCE_MOBILE,\n            sourceId: plain.recordID || '',\n            birthday: plain.birthday ? `${plain.birthday.year}-${plain.birthday.month}-${plain.birthday.day}` : '',\n            address,\n            note: plain.note || '',\n            favorited: false,\n            personal: true\n        });\n    }\n    static parseManyOffice365(response, source) {\n        return response.map((r)=>Contact.parseOffice365(r, source));\n    }\n    static parseOffice365(single, source) {\n        const emails = [];\n        const numbers = [];\n        if (single.emailAddresses) single.emailAddresses.map((email)=>emails.push({\n                email: email.address\n            }));\n        if (single.businessPhones) single.businessPhones.map((phone)=>numbers.push({\n                label: 'business',\n                number: phone\n            }));\n        if (single.mobilePhone) numbers.push({\n            label: 'mobile',\n            number: single.mobilePhone\n        });\n        if (single.homePhones) single.homePhones.map((phone)=>numbers.push({\n                label: 'home',\n                number: phone\n            }));\n        return new Contact({\n            sourceId: single.id || '',\n            name: single.displayName || '',\n            firstName: single.givenName,\n            lastName: single.surname,\n            number: numbers.length ? numbers[0].number : '',\n            numbers,\n            emails,\n            source: source.name,\n            backend: BACKEND.OFFICE365\n        });\n    }\n    static parseManyGoogle(response, source) {\n        return response.map((r)=>Contact.parseGoogle(r, source));\n    }\n    static parseGoogle(single, source) {\n        const emails = [];\n        const numbers = [];\n        if (single.emails) single.emails.forEach((email)=>'object' == typeof email ? {\n                email: email.address,\n                label: email.label\n            } : {\n                email\n            });\n        if (single.numbers_by_label) Object.keys(single.numbers_by_label).forEach((label)=>numbers.push({\n                label,\n                number: single.numbers_by_label[label]\n            }));\n        else if (single.numbers) single.numbers.forEach((phone)=>numbers.push({\n                number: phone\n            }));\n        return new Contact({\n            sourceId: single.id || '',\n            name: single.name || '',\n            firstName: single.firstname || '',\n            lastName: single.lastname || '',\n            number: numbers.length ? numbers[0].number : '',\n            numbers,\n            emails,\n            source: source.name,\n            backend: BACKEND.GOOGLE\n        });\n    }\n    static parseManyWazo(response, source) {\n        return response.map((r)=>Contact.parseWazo(r, source));\n    }\n    static parseWazo(single, source) {\n        const emails = [];\n        const numbers = [];\n        if (single.email) emails.push({\n            label: 'email',\n            email: single.email\n        });\n        if (single.exten) numbers.push({\n            label: 'exten',\n            number: single.exten\n        });\n        if (single.mobile_phone_number) numbers.push({\n            label: 'mobile',\n            number: single.mobile_phone_number\n        });\n        return new Contact({\n            uuid: single.uuid,\n            sourceId: String(single.id) || '',\n            name: `${single.firstname}${single.lastname ? ` ${single.lastname}` : ''}`,\n            firstName: single.firstname,\n            lastName: single.lastname,\n            number: numbers.length ? numbers[0].number : '',\n            numbers,\n            emails,\n            source: source.name,\n            backend: BACKEND.WAZO\n        });\n    }\n    static parseManyConference(response, source) {\n        return response.map((r)=>Contact.parseConference(r, source));\n    }\n    static parseConference(single, source) {\n        const numbers = [];\n        let firstNumber = '';\n        if (single && single.extensions && single.extensions.length > 0 && single.extensions[0].exten) {\n            firstNumber = single.extensions[0].exten;\n            numbers.push({\n                label: 'exten',\n                number: firstNumber\n            });\n        }\n        return new Contact({\n            sourceId: String(single.id),\n            name: single.name,\n            number: firstNumber,\n            numbers,\n            source: source.name,\n            backend: BACKEND.CONFERENCE\n        });\n    }\n    static newFrom(contact) {\n        return new_from(contact, Contact);\n    }\n    constructor({ id, uuid, name, firstName, lastName, external, number, numbers, email, emails, source, sourceId, entreprise, birthday, address, note, state, lineState, lastActivity, mobile, status, endpointId, personal, favorited, backend, personalStatus, sessions, connected, doNotDisturb, ringing, previousPresential, lines } = {}){\n        this.id = id;\n        this.uuid = uuid;\n        this.name = name || '';\n        this.firstName = firstName || '';\n        this.lastName = lastName || '';\n        this.external = external || false;\n        this.number = number;\n        this.numbers = numbers;\n        this.email = email;\n        this.emails = emails;\n        this.source = source;\n        this.sourceId = sourceId;\n        this.entreprise = entreprise;\n        this.birthday = birthday;\n        this.address = address;\n        this.note = note;\n        this.state = state;\n        this.lineState = lineState;\n        this.lastActivity = lastActivity;\n        this.mobile = mobile;\n        this.status = status;\n        this.endpointId = endpointId;\n        this.personal = personal;\n        this.favorited = favorited;\n        this.backend = backend;\n        this.personalStatus = personalStatus || '';\n        this.sessions = sessions || [];\n        this.connected = connected;\n        this.doNotDisturb = doNotDisturb;\n        this.ringing = ringing;\n        this.previousPresential = previousPresential;\n        this.lines = lines || [];\n        this.type = 'Contact';\n    }\n    setFavorite(value) {\n        this.favorited = value;\n        return this;\n    }\n    is(other) {\n        const sameSourceId = null !== this.sourceId && null !== other.sourceId && this.sourceId === other.sourceId;\n        const sameUuid = !!this.uuid && !!other.uuid && this.uuid === other.uuid;\n        const hasSameId = sameSourceId || sameUuid;\n        const hasSameBackend = !!this.backend && !!other.backend && this.backend === other.backend;\n        const hasSameSource = !!this.source && !!other.source && this.source === other.source;\n        return !!other && hasSameId && hasSameBackend && hasSameSource;\n    }\n    hasId(id) {\n        return this.uuid === id;\n    }\n    hasNumber(number) {\n        return this.number === number;\n    }\n    hasEndpointId(endpointId) {\n        return this.endpointId === endpointId;\n    }\n    isAvailable() {\n        return this.state === STATE.AVAILABLE;\n    }\n    isAway() {\n        return this.state === STATE.AWAY;\n    }\n    isUnavailable() {\n        return this.state === STATE.UNAVAILABLE;\n    }\n    isInvisible() {\n        return this.state === STATE.INVISIBLE;\n    }\n    isInCall() {\n        return this.lineState === LINE_STATE.TALKING || this.lineState === LINE_STATE.HOLDING;\n    }\n    isRinging() {\n        return this.ringing;\n    }\n    isInUseOrRinging() {\n        return this.lineState === LINE_STATE.TALKING || this.lineState === LINE_STATE.RINGING;\n    }\n    isProgressing() {\n        return this.lineState === LINE_STATE.PROGRESSING;\n    }\n    merge(old) {\n        Object.keys(old).filter((key)=>'lineState' !== key).forEach((key)=>{\n            this[key] = old[key] || this[key];\n        });\n        if (old.lineState) this.lineState = old.lineState;\n        return this;\n    }\n    isIntern() {\n        return !!this.uuid;\n    }\n    hasSourceId() {\n        return !!this.sourceId;\n    }\n    isCallable(session) {\n        return !!this.number && !!session && !session.is(this);\n    }\n    isFromMobile() {\n        return this.source === SOURCE_MOBILE;\n    }\n    isFavorite() {\n        return this.favorited;\n    }\n    separateName() {\n        if (!this.name) return {\n            firstName: '',\n            lastName: ''\n        };\n        const names = this.name.split(/\\s+/);\n        const firstName = names[0];\n        const lastName = names.slice(1).join(' ');\n        return {\n            firstName,\n            lastName\n        };\n    }\n}\nconst compareVersions = (a, b)=>{\n    let i;\n    let diff;\n    const regExStrip0 = /(\\.0+)+$/;\n    const segmentsA = a.replace(regExStrip0, '').split('.');\n    const segmentsB = b.replace(regExStrip0, '').split('.');\n    const l = Math.min(segmentsA.length, segmentsB.length);\n    for(i = 0; i < l; i++){\n        diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);\n        if (diff) return diff;\n    }\n    return segmentsA.length - segmentsB.length;\n};\nconst compare_version = compareVersions;\nconst { jws } = external_jsrsasign_namespaceObject.KJUR;\nconst swarmKey = external_jsrsasign_namespaceObject.KEYUTIL.getKey(pubkey);\nconst MINIMUM_WAZO_ENGINE_VERSION_FOR_DEFAULT_CONTEXT = '19.08';\nclass Session {\n    acl;\n    contact;\n    token;\n    refreshToken;\n    uuid;\n    tenantUuid;\n    stackUuid;\n    sessionUuid;\n    engineVersion;\n    _stackHostFromHeader;\n    profile;\n    expiresAt;\n    authorizations;\n    metadata;\n    static parse(plain) {\n        const token = plain.data.metadata ? plain.data.metadata.jwt : null;\n        let authorizations = [];\n        if (token) {\n            const isValid = jws.JWS.verifyJWT(token, swarmKey, {\n                alg: [\n                    'RS256'\n                ],\n                verifyAt: new Date()\n            });\n            if (isValid) {\n                const decodedToken = jws.JWS.readSafeJSONString((0, external_jsrsasign_namespaceObject.b64utoutf8)(token.split('.')[1]));\n                authorizations = decodedToken ? decodedToken.authorizations : [];\n            }\n        }\n        return new Session({\n            token: plain.data.token,\n            refreshToken: plain.data.refresh_token || null,\n            uuid: plain.data.metadata ? plain.data.metadata.uuid : null,\n            sessionUuid: plain.data.session_uuid,\n            authorizations,\n            acl: plain.data.acls ? plain.data.acls : plain.data.acl ? plain.data.acl : [],\n            tenantUuid: plain.data.metadata ? plain.data.metadata.tenant_uuid : void 0,\n            expiresAt: external_moment_default().utc(plain.data.utc_expires_at).toDate(),\n            stackUuid: plain.data.xivo_uuid,\n            metadata: plain.data.metadata,\n            stackHostFromHeader: plain._headers?.get?.('wazo-stack-host')\n        });\n    }\n    static newFrom(profile) {\n        return new_from(profile, Session);\n    }\n    constructor({ token, uuid, tenantUuid, profile, expiresAt, authorizations, acl, engineVersion, refreshToken, sessionUuid, stackUuid, metadata, stackHostFromHeader }){\n        this.token = token;\n        this.uuid = uuid;\n        this.tenantUuid = tenantUuid || null;\n        this.profile = profile;\n        this.expiresAt = expiresAt;\n        this.authorizations = authorizations || [];\n        this.acl = acl || [];\n        this.engineVersion = engineVersion;\n        this.refreshToken = refreshToken;\n        this.sessionUuid = sessionUuid;\n        this.stackUuid = stackUuid;\n        this.metadata = metadata;\n        this._stackHostFromHeader = stackHostFromHeader;\n    }\n    hasExpired(date = new Date()) {\n        return date >= this.expiresAt;\n    }\n    is(contact) {\n        return Boolean(contact) && this.uuid === contact.uuid;\n    }\n    using(profile) {\n        this.profile = profile;\n        return this;\n    }\n    hasAuthorizations() {\n        return this.authorizations && !!this.authorizations.length;\n    }\n    displayName() {\n        return this.profile ? `${this.profile.firstName} ${this.profile.lastName}` : '';\n    }\n    hasAccessToVoicemail() {\n        if (!this.profile) return false;\n        return !!this.profile.voicemail;\n    }\n    primaryLine() {\n        return this.profile && this.profile.lines.length > 0 ? this.profile.lines[0] : null;\n    }\n    primarySipLine() {\n        return this.profile && this.profile.sipLines.length > 0 ? this.profile.sipLines[0] : null;\n    }\n    primaryWebRtcLine() {\n        return this.profile && (this.profile.sipLines || []).find((sipLine)=>sipLine && sipLine.isWebRtc());\n    }\n    primaryCtiLine() {\n        return this.profile && (this.profile.sipLines || []).find((sipLine)=>sipLine && !sipLine.isWebRtc());\n    }\n    getContact() {\n        if (this.contact) return this.contact;\n        const { email, firstName, lastName, mobileNumber, state, status } = this.profile || {};\n        const number = this.primaryNumber() || '';\n        const numbers = [\n            {\n                label: 'primary',\n                number\n            }\n        ];\n        if (mobileNumber) numbers.push({\n            label: 'mobile',\n            number: mobileNumber\n        });\n        return new Contact({\n            uuid: this.uuid || '',\n            email,\n            name: `${firstName} ${lastName}`,\n            number,\n            numbers,\n            state: state || '',\n            status,\n            backend: 'wazo',\n            source: 'default'\n        });\n    }\n    primaryContext() {\n        if (this.engineVersion) {\n            if (this.hasEngineVersionGte(MINIMUM_WAZO_ENGINE_VERSION_FOR_DEFAULT_CONTEXT)) return 'default';\n        }\n        const line = this.primaryLine();\n        return line && Array.isArray(line.extensions) && line.extensions.length > 0 ? line.extensions[0].context : 'default';\n    }\n    hasEngineVersionGte(version) {\n        return !!this.engineVersion && compare_version(String(this.engineVersion), String(version)) >= 0;\n    }\n    primaryNumber() {\n        const line = this.primaryLine();\n        return line && Array.isArray(line.extensions) && line.extensions.length ? line.extensions[0].exten : null;\n    }\n    allLines() {\n        return this.profile ? this.profile.lines || [] : [];\n    }\n    allNumbers() {\n        const extensions = this.allLines().map((line)=>line.extensions?.map((extension)=>extension.exten) || []);\n        if (!extensions.length) return [];\n        return extensions.reduce((a, b)=>a.concat(b));\n    }\n    hasExtension(extension) {\n        return this.allNumbers().some((number)=>number === extension);\n    }\n    getHostFromHeader() {\n        return this._stackHostFromHeader;\n    }\n    get acls() {\n        console.warn('`acls` property of Session has been removed in Wazo\\'s SDK, please use `acl` instead.');\n        return this.acl;\n    }\n    get engineUuid() {\n        console.warn('`engineUuid` property of Session has been removed in Wazo\\'s SDK, please use `stackUuid` instead.');\n        return this.stackUuid;\n    }\n    toJSON() {\n        return {\n            ...this,\n            engineUuid: this.stackUuid\n        };\n    }\n}\nconst DEFAULT_BACKEND_USER = 'wazo_user';\nconst BACKEND_LDAP_USER = 'ldap_user';\nconst DETAULT_EXPIRATION = 3600;\nconst auth = (client, baseUrl)=>({\n        checkToken: (token)=>client.head(`${baseUrl}/token/${token}`, null, {}),\n        authenticate: (token)=>client.get(`${baseUrl}/token/${token}`, null, {}).then((response)=>Session.parse(response)),\n        logIn (params) {\n            const body = {\n                backend: params.backend || DEFAULT_BACKEND_USER,\n                expiration: params.expiration || DETAULT_EXPIRATION\n            };\n            const headers = {\n                Authorization: `Basic ${ApiRequester.base64Encode(`${params.username}:${params.password}`)}`,\n                'Content-Type': 'application/json',\n                ...params.headers || {}\n            };\n            if (client.clientId) {\n                body.access_type = 'offline';\n                body.client_id = client.clientId;\n            }\n            if (params.mobile) headers['Wazo-Session-Type'] = 'mobile';\n            if (params.tenantId) {\n                console.warn('Use of `tenantId` is deprecated when calling logIn() method, use `domainName` instead.');\n                body.tenant_id = params.tenantId;\n            }\n            if (params.domainName) body.domain_name = params.domainName;\n            return client.post(`${baseUrl}/token`, body, headers).then((response)=>Session.parse(response));\n        },\n        logOut: (token)=>client.delete(`${baseUrl}/token/${token}`, null, {}, ApiRequester.successResponseParser),\n        samlLogIn: async (samlSessionId)=>{\n            const headers = {\n                Accept: 'application/json',\n                'Content-Type': 'application/json'\n            };\n            const body = {\n                saml_session_id: samlSessionId\n            };\n            if (client.clientId) {\n                body.access_type = 'offline';\n                body.client_id = client.clientId;\n            }\n            if (Wazo.Auth.mobile) headers['Wazo-Session-Type'] = 'mobile';\n            return client.post(`${baseUrl}/token`, body, headers).then(Session.parse);\n        },\n        samlLogOut () {\n            return client.get(`${baseUrl}/saml/logout`, null, null);\n        },\n        initiateIdpAuthentication: async (domain, redirectUrl)=>{\n            const body = {\n                domain,\n                redirect_url: redirectUrl\n            };\n            const headers = {\n                Accept: 'application/json',\n                'Content-Type': 'application/json'\n            };\n            return client.post(`${baseUrl}/saml/sso`, body, headers);\n        },\n        refreshToken: (refreshToken, backend, expiration, isMobile, tenantId, domainName)=>{\n            const body = {\n                backend: backend || DEFAULT_BACKEND_USER,\n                expiration: expiration || DETAULT_EXPIRATION,\n                refresh_token: refreshToken,\n                client_id: client.clientId\n            };\n            if (tenantId) {\n                console.warn('Use of `tenantId` is deprecated when calling refreshToken() method, use `domainName` instead.');\n                body.tenant_id = tenantId;\n            }\n            if (domainName) body.domain_name = domainName;\n            const headers = {\n                'Content-Type': 'application/json',\n                ...isMobile ? {\n                    'Wazo-Session-Type': 'mobile'\n                } : {}\n            };\n            return client.post(`${baseUrl}/token`, body, headers, ApiRequester.defaultParser, false).then(Session.parse);\n        },\n        deleteRefreshToken: (clientId)=>client.delete(`${baseUrl}/users/me/tokens/${clientId}`, null, null, ApiRequester.successResponseParser),\n        updatePassword: (userUuid, oldPassword, newPassword)=>{\n            const body = {\n                new_password: newPassword,\n                old_password: oldPassword\n            };\n            return client.put(`${baseUrl}/users/${userUuid}/password`, body, null, ApiRequester.successResponseParser);\n        },\n        getDeviceToken: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}/external/mobile`),\n        sendDeviceToken: (userUuid, deviceToken, apnsVoipToken, apnsNotificationToken)=>{\n            const body = {\n                token: deviceToken\n            };\n            if (apnsVoipToken) {\n                body.apns_token = apnsVoipToken;\n                body.apns_voip_token = apnsVoipToken;\n            }\n            if (apnsNotificationToken) body.apns_notification_token = apnsNotificationToken;\n            return client.post(`${baseUrl}/users/${userUuid}/external/mobile`, body);\n        },\n        getPushNotificationSenderId: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}/external/mobile/sender_id`, null).then((response)=>response.sender_id),\n        sendResetPasswordEmail: ({ username, email })=>{\n            const body = {};\n            if (username) body.username = username;\n            if (email) body.email = email;\n            return client.get(`${baseUrl}/users/password/reset`, body, {}, ApiRequester.successResponseParser);\n        },\n        resetPassword: (userUuid, password)=>{\n            const body = {\n                password\n            };\n            return client.post(`${baseUrl}/users/password/reset?user_uuid=${userUuid}`, body, null, ApiRequester.successResponseParser);\n        },\n        removeDeviceToken: (userUuid)=>client.delete(`${baseUrl}/users/${userUuid}/external/mobile`),\n        createUser: (username, password, firstname, lastname)=>{\n            const body = {\n                username,\n                password,\n                firstname,\n                lastname\n            };\n            return client.post(`${baseUrl}/users`, body);\n        },\n        addUserEmail: (userUuid, email, main)=>{\n            const body = {\n                emails: [\n                    {\n                        address: email,\n                        main\n                    }\n                ]\n            };\n            return client.put(`${baseUrl}/users/${userUuid}/emails`, body);\n        },\n        addUserPolicy: (userUuid, policyUuid)=>client.put(`${baseUrl}/users/${userUuid}/policies/${policyUuid}`),\n        getRestrictionPolicies: (scopes)=>client.post(`${baseUrl}/token/${client.token}/scopes/check`, {\n                scopes\n            }),\n        deleteUserPolicy: (userUuid, policyUuid)=>client.delete(`${baseUrl}/users/${userUuid}/policies/${policyUuid}`),\n        addUserGroup: (userUuid, groupUuid)=>client.put(`${baseUrl}/groups/${groupUuid}/users/${userUuid}`),\n        listUsersGroup: (groupUuid)=>client.get(`${baseUrl}/groups/${groupUuid}/users`),\n        deleteUserGroup: (userUuid, groupUuid)=>client.delete(`${baseUrl}/groups/${groupUuid}/users/${userUuid}`),\n        getUser: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}`),\n        getUserSession: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}/sessions`),\n        deleteUserSession: (userUuid, sessionUuids)=>client.delete(`${baseUrl}/users/${userUuid}/sessions/${sessionUuids}`),\n        listUsers: ()=>client.get(`${baseUrl}/users`),\n        deleteUser: (userUuid)=>client.delete(`${baseUrl}/users/${userUuid}`),\n        listTenants: ()=>client.get(`${baseUrl}/tenants`),\n        getTenant: (tenantUuid)=>client.get(`${baseUrl}/tenants/${tenantUuid}`),\n        createTenant: (name)=>client.post(`${baseUrl}/tenants`, {\n                name\n            }),\n        updateTenant: (uuid, name, contact, phone, address)=>{\n            const body = {\n                name,\n                contact,\n                phone,\n                address\n            };\n            return client.put(`${baseUrl}/tenants/${uuid}`, body);\n        },\n        deleteTenant: (uuid)=>client.delete(`${baseUrl}/tenants/${uuid}`),\n        createGroup: (name)=>client.post(`${baseUrl}/groups`, {\n                name\n            }),\n        listGroups: ()=>client.get(`${baseUrl}/groups`),\n        deleteGroup: (uuid)=>client.delete(`${baseUrl}/groups/${uuid}`),\n        createPolicy: (name, description, aclTemplates)=>{\n            const body = {\n                name,\n                description,\n                acl_templates: aclTemplates,\n                acl: aclTemplates\n            };\n            return client.post(`${baseUrl}/policies`, body);\n        },\n        listPolicies: ()=>client.get(`${baseUrl}/policies`),\n        deletePolicy: (policyUuid)=>client.delete(`${baseUrl}/policies/${policyUuid}`),\n        getProviders: (userUuid)=>client.get(`${baseUrl}/users/${userUuid}/external`),\n        getProviderToken: (userUuid, provider)=>client.get(`${baseUrl}/users/${userUuid}/external/${provider}`),\n        getProviderAuthUrl: (userUuid, provider)=>client.post(`${baseUrl}/users/${userUuid}/external/${provider}`, {}),\n        deleteProviderToken: (userUuid, provider)=>client.delete(`${baseUrl}/users/${userUuid}/external/${provider}`)\n    });\nconst base_api_client_logger = IssueReporter ? IssueReporter.loggerFor('api') : console;\nclass BaseApiClient {\n    client;\n    auth;\n    refreshToken;\n    onRefreshToken;\n    onRefreshTokenError;\n    refreshExpiration;\n    refreshBackend;\n    refreshTenantId;\n    refreshDomainName;\n    isMobile;\n    fetchOptions;\n    constructor({ server, agent = null, refreshToken, clientId, isMobile = false, fetchOptions }){\n        this.updateParameters({\n            server,\n            agent,\n            clientId,\n            fetchOptions\n        });\n        this.refreshToken = refreshToken;\n        this.isMobile = isMobile || false;\n    }\n    initializeEndpoints() {\n        this.auth = auth(this.client, `auth/${AUTH_VERSION}`);\n    }\n    updateParameters({ server, agent, clientId, fetchOptions }) {\n        const refreshTokenCallback = this.refreshTokenCallback.bind(this);\n        this.client = new ApiRequester({\n            server,\n            agent,\n            refreshTokenCallback,\n            clientId,\n            fetchOptions\n        });\n        this.initializeEndpoints();\n    }\n    async forceRefreshToken() {\n        base_api_client_logger.info('forcing refresh token, calling callback');\n        return this.refreshTokenCallback();\n    }\n    async refreshTokenCallback() {\n        base_api_client_logger.info('refresh token callback called', {\n            refreshToken: obfuscateToken(this.refreshToken),\n            refreshBackend: this.refreshBackend,\n            refreshTenantId: this.refreshTenantId,\n            refreshDomainName: this.refreshDomainName,\n            refreshExpiration: this.refreshExpiration,\n            isMobile: this.isMobile\n        });\n        if (!this.refreshToken) return null;\n        try {\n            const session = await this.auth.refreshToken(this.refreshToken, this.refreshBackend, this.refreshExpiration, this.isMobile, this.refreshTenantId, this.refreshDomainName);\n            if (!session) return null;\n            base_api_client_logger.info('token refreshed', {\n                token: obfuscateToken(session.token)\n            });\n            if (this.onRefreshToken) this.onRefreshToken(session.token, session);\n            this.setToken(session.token);\n            return session.token;\n        } catch (error) {\n            base_api_client_logger.error('token refresh, error', error);\n            if (this.onRefreshTokenError) this.onRefreshTokenError(error);\n        }\n        return null;\n    }\n    setToken(token) {\n        this.client.setToken(token);\n    }\n    setTenant(tenant) {\n        this.client.setTenant(tenant);\n    }\n    setRefreshToken(refreshToken) {\n        this.refreshToken = refreshToken;\n    }\n    setRequestTimeout(requestTimeout) {\n        this.client.setRequestTimeout(requestTimeout);\n    }\n    setClientId(clientId) {\n        this.client.clientId = clientId;\n    }\n    setOnRefreshToken(onRefreshToken) {\n        this.onRefreshToken = onRefreshToken;\n    }\n    setOnRefreshTokenError(callback) {\n        this.onRefreshTokenError = callback;\n    }\n    setRefreshExpiration(refreshExpiration) {\n        this.refreshExpiration = refreshExpiration;\n    }\n    setRefreshBackend(refreshBackend) {\n        this.refreshBackend = refreshBackend;\n    }\n    setRefreshTenantId(tenantId) {\n        console.warn('Use of `setRefreshTenantId` is deprecated, use `setRefreshDomainName` instead');\n        this.refreshTenantId = tenantId;\n    }\n    setRefreshDomainName(domainName) {\n        this.refreshDomainName = domainName;\n    }\n    setIsMobile(isMobile) {\n        this.isMobile = isMobile;\n    }\n    setFetchOptions(fetchOptions) {\n        this.fetchOptions = fetchOptions;\n        this.client.setFetchOptions(fetchOptions);\n    }\n    disableErrorLogging() {\n        this.client.disableErrorLogging();\n    }\n}\nclass ApiClient extends BaseApiClient {\n    application;\n    confd;\n    ctidNg;\n    dird;\n    callLogd;\n    chatd;\n    calld;\n    agentd;\n    webhookd;\n    amid;\n    constructor(args){\n        super(args);\n        this.initializeEndpoints();\n    }\n    initializeEndpoints() {\n        super.initializeEndpoints();\n        this.application = application(this.client, `calld/${APPLICATION_VERSION}/applications`);\n        this.confd = confd(this.client, `confd/${CONFD_VERSION}`);\n        this.ctidNg = ctid_ng(this.client, `ctid-ng/${CTIDNG_VERSION}`);\n        this.dird = dird(this.client, `dird/${DIRD_VERSION}`);\n        this.callLogd = call_logd(this.client, `call-logd/${CALL_LOGD_VERSION}`);\n        this.chatd = chatd(this.client, `chatd/${CHATD_VERSION}`);\n        this.calld = calld(this.client, `calld/${CALLD_VERSION}`);\n        this.agentd = agentd(this.client, `agentd/${AGENTD_VERSION}`);\n        this.webhookd = webhookd(this.client, `webhookd/${WEBHOOKD_VERSION}`);\n        this.amid = amid(this.client, `amid/${AMID_VERSION}`);\n    }\n}\nconst api = {\n    name: 'API',\n    check: async (server, session)=>{\n        const client = new ApiClient({\n            server\n        });\n        client.setToken(session.token);\n        client.disableErrorLogging();\n        const handleApiError = (apiName, error)=>{\n            const statusText = error instanceof ServerError ? 'server error' : 'api error';\n            throw new Error(`${apiName} fails with status (${error.status}, ${statusText}) : ${error.message}`);\n        };\n        try {\n            await client.auth.getPushNotificationSenderId(session.uuid);\n            await client.auth.getProviders(session.uuid);\n        } catch (e) {\n            handleApiError('wazo-auth', e);\n        }\n        try {\n            await client.callLogd.listCallLogs();\n        } catch (e) {\n            handleApiError('wazo-callogd', e);\n        }\n        try {\n            await client.calld.listCalls();\n        } catch (e) {\n            handleApiError('wazo-calld', e);\n        }\n        try {\n            await client.calld.listVoicemails();\n        } catch (e) {\n            if (404 !== e.status) handleApiError('wazo-calld', e);\n        }\n        try {\n            await client.chatd.getState(session.uuid);\n            await client.chatd.getContactStatusInfo(session.uuid);\n            await client.chatd.getUserRooms();\n        } catch (e) {\n            handleApiError('wazo-chatd', e);\n        }\n        try {\n            await client.confd.getInfos();\n            await client.confd.getUser(session.uuid);\n        } catch (e) {\n            handleApiError('wazo-confd', e);\n        }\n        try {\n            await client.dird.listPersonalContacts();\n            await client.dird.listFavorites(session.primaryContext());\n            await client.dird.fetchWazoSource(session.primaryContext());\n            const conferenceSource = await client.dird.fetchConferenceSource(session.primaryContext());\n            await client.dird.fetchConferenceContacts(conferenceSource.items[0]);\n        } catch (e) {\n            handleApiError('wazo-dird', e);\n        }\n        try {\n            await client.webhookd.getSubscriptions();\n        } catch (e) {\n            handleApiError('wazo-webhookd', e);\n        }\n    }\n};\nconst checks_aor = {\n    name: 'List of AOR',\n    check: async (server, session)=>{\n        const apiClient = new ApiClient({\n            server\n        });\n        apiClient.setToken(session.token);\n        apiClient.disableErrorLogging();\n        const line = session.primaryWebRtcLine();\n        if (!line) return 'No WebRTC line for this user';\n        const { username } = line;\n        try {\n            const aors = await apiClient.amid.getAors(username);\n            const nbAors = aors.length;\n            const availableAors = aors.filter((aor)=>'Reachable' === aor.status);\n            return `Number of AOR: ${nbAors} (${availableAors.length} Avail, ${nbAors - availableAors.length} Unavail)`;\n        } catch (e) {\n            if (401 === e.status) return 'Not available for this user';\n            throw e;\n        }\n    }\n};\nconst external_reconnecting_websocket_namespaceObject = require(\"reconnecting-websocket\");\nvar external_reconnecting_websocket_default = /*#__PURE__*/ __webpack_require__.n(external_reconnecting_websocket_namespaceObject);\nconst DEFAULT_HEARTBEAT_DELAY = 2000;\nconst DEFAULT_HEARTBEAT_TIMEOUT = 5000;\nconst DEFAULT_MAX_HEARTBEATS = 3;\nclass Heartbeat_Heartbeat {\n    heartbeatDelay;\n    heartbeatTimeout;\n    maxHeartbeats;\n    hasHeartbeat;\n    _heartbeatDelayTimeout;\n    _heartbeatNotReceivedTimeout;\n    _heartbeatTries;\n    _sendHeartbeatCallback;\n    _onTimeoutCallback;\n    constructor(heartbeatDelay = DEFAULT_HEARTBEAT_DELAY, heartbeatTimeout = DEFAULT_HEARTBEAT_TIMEOUT, maxHeartbeats = DEFAULT_MAX_HEARTBEATS){\n        this.heartbeatDelay = heartbeatDelay;\n        this.heartbeatTimeout = heartbeatTimeout;\n        this.maxHeartbeats = maxHeartbeats;\n        this.hasHeartbeat = false;\n        this._heartbeatTries = 0;\n    }\n    setSendHeartbeat(cb) {\n        this._sendHeartbeatCallback = cb;\n    }\n    setOnHeartbeatTimeout(cb) {\n        this._onTimeoutCallback = cb;\n    }\n    stop() {\n        this.hasHeartbeat = false;\n        if (this._heartbeatNotReceivedTimeout) clearTimeout(this._heartbeatNotReceivedTimeout);\n        if (this._heartbeatDelayTimeout) clearTimeout(this._heartbeatDelayTimeout);\n    }\n    start() {\n        this.stop();\n        this.hasHeartbeat = true;\n        this._heartbeatTries = 0;\n        this._sendHeartbeat();\n    }\n    onHeartbeat() {\n        this._clearTimeouts();\n        if (!this.hasHeartbeat) return;\n        this._sendHeartbeat();\n    }\n    _sendHeartbeat() {\n        if (this._heartbeatTries >= this.maxHeartbeats) return;\n        this._clearTimeouts();\n        this._heartbeatDelayTimeout = setTimeout(()=>{\n            this._heartbeatTries++;\n            if (this._sendHeartbeatCallback) this._sendHeartbeatCallback();\n        }, this.heartbeatDelay);\n        if (this._onTimeoutCallback) this._heartbeatNotReceivedTimeout = setTimeout(this._onTimeoutCallback, this.heartbeatTimeout);\n    }\n    _clearTimeouts() {\n        if (this._heartbeatNotReceivedTimeout) clearTimeout(this._heartbeatNotReceivedTimeout);\n        if (this._heartbeatDelayTimeout) clearTimeout(this._heartbeatDelayTimeout);\n    }\n}\nconst Heartbeat = Heartbeat_Heartbeat;\nconst SOCKET_EVENTS = {\n    ON_OPEN: 'onopen',\n    ON_MESSAGE: 'onmessage',\n    ON_ERROR: 'onerror',\n    ON_CLOSE: 'onclose',\n    INITIALIZED: 'initialized',\n    ON_AUTH_FAILED: 'on_auth_failed'\n};\nconst AUTH_SESSION_EXPIRE_SOON = 'auth_session_expire_soon';\nconst FAVORITE_ADDED = 'favorite_added';\nconst FAVORITE_DELETED = 'favorite_deleted';\nconst USER_STATUS_UPDATE = 'user_status_update';\nconst CHAT_MESSAGE_SENT = 'chat_message_sent';\nconst CHAT_MESSAGE_RECEIVED = 'chat_message_received';\nconst ENDPOINT_STATUS_UPDATE = 'endpoint_status_update';\nconst USERS_FORWARDS_BUSY_UPDATED = 'users_forwards_busy_updated';\nconst USERS_FORWARDS_NOANSWER_UPDATED = 'users_forwards_noanswer_updated';\nconst USERS_FORWARDS_UNCONDITIONAL_UPDATED = 'users_forwards_unconditional_updated';\nconst USERS_SERVICES_DND_UPDATED = 'users_services_dnd_updated';\nconst GLOBAL_VOICEMAIL_MESSAGE_CREATED = 'global_voicemail_message_created';\nconst GLOBAL_VOICEMAIL_MESSAGE_UPDATED = 'global_voicemail_message_updated';\nconst GLOBAL_VOICEMAIL_MESSAGE_DELETED = 'global_voicemail_message_deleted';\nconst USER_VOICEMAIL_MESSAGE_CREATED = 'user_voicemail_message_created';\nconst USER_VOICEMAIL_MESSAGE_UPDATED = 'user_voicemail_message_updated';\nconst USER_VOICEMAIL_MESSAGE_DELETED = 'user_voicemail_message_deleted';\nconst CALL_LOG_USER_CREATED = 'call_log_user_created';\nconst CALL_CREATED = 'call_created';\nconst CALL_ANSWERED = 'call_answered';\nconst CALL_DTMF_CREATED = 'call_dtmf_created';\nconst CALL_ENDED = 'call_ended';\nconst CALL_UPDATED = 'call_updated';\nconst CALL_HELD = 'call_held';\nconst CALL_RESUMED = 'call_resumed';\nconst AUTH_USER_EXTERNAL_AUTH_ADDED = 'auth_user_external_auth_added';\nconst AUTH_USER_EXTERNAL_AUTH_DELETED = 'auth_user_external_auth_deleted';\nconst CHATD_PRESENCE_UPDATED = 'chatd_presence_updated';\nconst CHATD_USER_ROOM_MESSAGE_CREATED = 'chatd_user_room_message_created';\nconst CHATD_USER_ROOM_CREATED = 'chatd_user_room_created';\nconst CONFERENCE_USER_PARTICIPANT_JOINED = 'conference_user_participant_joined';\nconst CONFERENCE_USER_PARTICIPANT_LEFT = 'conference_user_participant_left';\nconst CONFERENCE_USER_PARTICIPANT_TALK_STARTED = 'conference_user_participant_talk_started';\nconst CONFERENCE_USER_PARTICIPANT_TALK_STOPPED = 'conference_user_participant_talk_stopped';\nconst MEETING_USER_PARTICIPANT_JOINED = 'meeting_user_participant_joined';\nconst MEETING_USER_PARTICIPANT_LEFT = 'meeting_user_participant_left';\nconst SWITCHBOARD_QUEUED_CALLS_UPDATED = 'switchboard_queued_calls_updated';\nconst SWITCHBOARD_QUEUED_CALL_ANSWERED = 'switchboard_queued_call_answered';\nconst SWITCHBOARD_HELD_CALLS_UPDATED = 'switchboard_held_calls_updated';\nconst SWITCHBOARD_HELD_CALL_ANSWERED = 'switchboard_held_call_answered';\nconst FAX_OUTBOUND_USER_CREATED = 'fax_outbound_user_created';\nconst FAX_OUTBOUND_USER_SUCCEEDED = 'fax_outbound_user_succeeded';\nconst FAX_OUTBOUND_USER_FAILED = 'fax_outbound_user_failed';\nconst APPLICATION_CALL_DTMF_RECEIVED = 'application_call_dtmf_received';\nconst APPLICATION_CALL_ENTERED = 'application_call_entered';\nconst APPLICATION_CALL_INITIATED = 'application_call_initiated';\nconst APPLICATION_CALL_DELETED = 'application_call_deleted';\nconst APPLICATION_CALL_UPDATED = 'application_call_updated';\nconst APPLICATION_CALL_ANSWERED = 'application_call_answered';\nconst APPLICATION_PROGRESS_STARTED = 'application_progress_started';\nconst APPLICATION_PROGRESS_STOPPED = 'application_progress_stopped';\nconst APPLICATION_DESTINATION_NODE_CREATED = 'application_destination_node_created';\nconst APPLICATION_NODE_CREATED = 'application_node_created';\nconst APPLICATION_NODE_DELETED = 'application_node_deleted';\nconst APPLICATION_NODE_UPDATED = 'application_node_updated';\nconst APPLICATION_PLAYBACK_CREATED = 'application_playback_created';\nconst APPLICATION_PLAYBACK_DELETED = 'application_playback_deleted';\nconst APPLICATION_SNOOP_CREATED = 'application_snoop_created';\nconst APPLICATION_SNOOP_DELETED = 'application_snoop_deleted';\nconst APPLICATION_SNOOP_UPDATED = 'application_snoop_updated';\nconst APPLICATION_USER_OUTGOING_CALL_CREATED = 'application_user_outgoing_call_created';\nconst TRUNK_STATUS_UPDATED = 'trunk_status_updated';\nconst LINE_STATUS_UPDATED = 'line_status_updated';\nconst AGENT_STATUS_UPDATE = 'agent_status_update';\nconst AGENT_PAUSED = 'agent_paused';\nconst AGENT_UNPAUSED = 'agent_unpaused';\nconst AGENT_QUEUE_LOGGED_IN = 'user_agent_queue_logged_in';\nconst AGENT_QUEUE_LOGGED_OUT = 'user_agent_queue_logged_out';\nconst CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';\nconst CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';\nconst MEETING_USER_PROGRESS = 'meeting_user_progress';\nconst MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';\nconst BLACKLIST_EVENTS = [\n    CHAT_MESSAGE_SENT,\n    CHAT_MESSAGE_RECEIVED,\n    CHATD_USER_ROOM_MESSAGE_CREATED,\n    CHATD_USER_ROOM_CREATED\n];\nconst HEARTBEAT_ENGINE_VERSION = '20.09';\nconst websocket_client_logger = IssueReporter.loggerFor('wazo-ws');\nconst messageLogger = IssueReporter.loggerFor('wazo-ws-message');\nclass WebSocketClient extends Emitter {\n    initialized;\n    session;\n    host;\n    version;\n    token;\n    events;\n    options;\n    socket;\n    _boundOnHeartbeat;\n    heartbeat;\n    onHeartBeatTimeout;\n    heartbeatCb;\n    eventLists;\n    static eventLists;\n    constructor({ host, token, version, events, heartbeat, session }, options = {\n        host,\n        token,\n        version: 1,\n        events: [],\n        heartbeat: {},\n        session: null\n    }){\n        super();\n        this.initialized = false;\n        this.socket = null;\n        this.host = host;\n        this.token = token;\n        this.events = events;\n        this.options = options;\n        this.version = version;\n        this.session = session;\n        this._boundOnHeartbeat = this._onHeartbeat.bind(this);\n        const { delay, timeout, max } = heartbeat || {};\n        this.heartbeat = new Heartbeat(delay, timeout, max);\n        this.heartbeat.setSendHeartbeat(this.pingServer.bind(this));\n        this.heartbeat.setOnHeartbeatTimeout(this._onHeartbeatTimeout.bind(this));\n        this.eventLists = WebSocketClient.eventLists;\n    }\n    connect() {\n        websocket_client_logger.info('connect method started', {\n            host: this.host,\n            token: obfuscateToken(this.token)\n        });\n        this.socket = new (external_reconnecting_websocket_default())(this._getUrl.bind(this), [], this.options);\n        if (this.options.binaryType) this.socket.binaryType = this.options.binaryType;\n        this.socket.onopen = ()=>{\n            websocket_client_logger.info('on Wazo WS open', {\n                method: 'connect',\n                host: this.host\n            });\n            this.eventEmitter.emit(SOCKET_EVENTS.ON_OPEN);\n        };\n        this.socket.onerror = (event)=>{\n            websocket_client_logger.error('on Wazo WS error', event.target);\n            this.eventEmitter.emit(SOCKET_EVENTS.ON_ERROR, event);\n        };\n        this.socket.onmessage = (event)=>{\n            this.eventEmitter.emit(SOCKET_EVENTS.ON_MESSAGE, event.data);\n            const message = JSON.parse('string' == typeof event.data ? event.data : '{}');\n            let { name } = message;\n            if (message.data && message.data.name) name = message.data.name;\n            if (-1 === BLACKLIST_EVENTS.indexOf(name)) messageLogger.trace(IssueReporter.removeSlashes(event.data), {\n                method: 'onmessage'\n            });\n            else messageLogger.trace(`{\"name\": \"${name}\", \"info\": \"content not shown\"}`, {\n                method: 'onmessage'\n            });\n            if (this.initialized) this._handleMessage(message);\n            else this._handleInitMessage(message, this.socket);\n        };\n        this.socket.onclose = (event)=>{\n            websocket_client_logger.info('on Wazo WS close', {\n                reason: event.reason,\n                code: event.code,\n                readyState: event.target.readyState,\n                host: this.host,\n                token: obfuscateToken(this.token)\n            });\n            this.initialized = false;\n            this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, event);\n            switch(event.code){\n                case 4002:\n                    this.eventEmitter.emit(SOCKET_EVENTS.ON_AUTH_FAILED);\n                    break;\n                case 4003:\n                    break;\n                default:\n            }\n        };\n        this.socket.onerror = (event)=>{\n            websocket_client_logger.info('Wazo WS error', {\n                message: event.message,\n                code: event.code,\n                readyState: event.target.readyState\n            });\n        };\n    }\n    close(force = false) {\n        websocket_client_logger.info('Wazo WS close', {\n            socket: !!this.socket,\n            host: this.host,\n            token: obfuscateToken(this.token)\n        });\n        if (!this.socket) return;\n        if (3 === this.socket.readyState) {\n            websocket_client_logger.warn('Trying to close an already closed websocket, bailing.', {\n                url: this._getUrl()\n            });\n            return;\n        }\n        this.socket.close(1000);\n        this.initialized = false;\n        if (force) {\n            this.host = null;\n            this.token = null;\n            this.socket = null;\n        }\n    }\n    updateToken(token) {\n        this.token = token;\n        websocket_client_logger.info('Wazo WS updating token', {\n            url: this._getUrl(),\n            token: obfuscateToken(token),\n            socket: !!this.socket\n        });\n        if (this.socket) {\n            if (this.isConnected() && Number(this.version) >= 2) this.socket.send(JSON.stringify({\n                op: 'token',\n                data: {\n                    token\n                }\n            }));\n            else if (!this.isConnected()) this.reconnect('token refreshed');\n        }\n    }\n    hasHeartbeat() {\n        return this.heartbeat.hasHeartbeat;\n    }\n    startHeartbeat() {\n        websocket_client_logger.info('Wazo WS start heartbeat', {\n            host: this.host,\n            token: obfuscateToken(this.token)\n        });\n        if (!this.socket) {\n            this.heartbeat.stop();\n            return;\n        }\n        this.off('pong', this._boundOnHeartbeat);\n        this.on('pong', this._boundOnHeartbeat);\n        this.heartbeat.start();\n    }\n    stopHeartbeat() {\n        websocket_client_logger.info('Wazo WS stop heartbeat', {\n            host: this.host,\n            token: obfuscateToken(this.token)\n        });\n        this.heartbeat.stop();\n    }\n    setOnHeartbeatTimeout(cb) {\n        this.onHeartBeatTimeout = cb;\n    }\n    setOnHeartbeatCallback(cb) {\n        this.heartbeatCb = cb;\n    }\n    pingServer() {\n        if (!this.socket || !this.isConnected()) return;\n        try {\n            this.socket.send(JSON.stringify({\n                op: 'ping',\n                data: {\n                    payload: 'pong'\n                }\n            }));\n        } catch (_) {}\n    }\n    isConnected() {\n        return this.socket && this.socket.readyState === this.socket.OPEN;\n    }\n    reconnect(reason) {\n        websocket_client_logger.info('Wazo WS reconnect', {\n            reason,\n            socket: !!this.socket,\n            host: this.host,\n            token: obfuscateToken(this.token)\n        });\n        if (!this.socket) return;\n        this.socket.reconnect(0, reason);\n    }\n    _handleInitMessage(message, sock) {\n        switch(message.op){\n            case 'init':\n                this.events?.forEach((event)=>{\n                    const op = {\n                        op: 'subscribe',\n                        data: {\n                            event_name: event\n                        }\n                    };\n                    sock.send(JSON.stringify(op));\n                });\n                sock.send(JSON.stringify({\n                    op: 'start'\n                }));\n                break;\n            case 'subscribe':\n                break;\n            case 'start':\n                this.initialized = true;\n                this.eventEmitter.emit(SOCKET_EVENTS.INITIALIZED);\n                break;\n            default:\n                this.eventEmitter.emit('message', message);\n        }\n    }\n    _handleMessage(message) {\n        if ('pong' === message.op) {\n            this.eventEmitter.emit('pong', message.data);\n            if (this.heartbeatCb) this.heartbeatCb();\n            return;\n        }\n        if (1 === this.version) {\n            this.eventEmitter.emit(message.name, message);\n            return;\n        }\n        if (Number(this.version) >= 2 && 'event' === message.op) this.eventEmitter.emit(message.data.name, message.data);\n    }\n    _getUrl() {\n        if (!this.host || !this.token) this.close();\n        let url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;\n        if (this.session) url += `&userUuid=${this.session.uuid}`;\n        websocket_client_logger.info('Wazo WS url computed to reconnect', {\n            url: url.replace(this.token, obfuscateToken(this.token))\n        });\n        return url;\n    }\n    _onHeartbeat(message) {\n        if ('pong' === message.payload) {\n            this.heartbeat.onHeartbeat();\n            websocket_client_logger.log('on heartbeat received from Wazo WS');\n        }\n    }\n    async _onHeartbeatTimeout() {\n        websocket_client_logger.log('heartbeat timed out', {\n            host: this.host,\n            token: obfuscateToken(this.token)\n        });\n        this.close();\n        this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, new Error('Websocket ping failure.'));\n        if (this.onHeartBeatTimeout) this.onHeartBeatTimeout();\n    }\n}\nWebSocketClient.eventLists = [\n    AUTH_SESSION_EXPIRE_SOON,\n    FAVORITE_ADDED,\n    FAVORITE_DELETED,\n    USER_STATUS_UPDATE,\n    CHAT_MESSAGE_SENT,\n    CHAT_MESSAGE_RECEIVED,\n    ENDPOINT_STATUS_UPDATE,\n    USERS_FORWARDS_BUSY_UPDATED,\n    USERS_FORWARDS_NOANSWER_UPDATED,\n    USERS_FORWARDS_UNCONDITIONAL_UPDATED,\n    USERS_SERVICES_DND_UPDATED,\n    GLOBAL_VOICEMAIL_MESSAGE_CREATED,\n    GLOBAL_VOICEMAIL_MESSAGE_UPDATED,\n    GLOBAL_VOICEMAIL_MESSAGE_DELETED,\n    USER_VOICEMAIL_MESSAGE_CREATED,\n    USER_VOICEMAIL_MESSAGE_UPDATED,\n    USER_VOICEMAIL_MESSAGE_DELETED,\n    CALL_LOG_USER_CREATED,\n    CALL_ANSWERED,\n    CALL_CREATED,\n    CALL_DTMF_CREATED,\n    CALL_ENDED,\n    CALL_UPDATED,\n    CALL_HELD,\n    CALL_RESUMED,\n    AUTH_USER_EXTERNAL_AUTH_ADDED,\n    AUTH_USER_EXTERNAL_AUTH_DELETED,\n    CHATD_PRESENCE_UPDATED,\n    CHATD_USER_ROOM_MESSAGE_CREATED,\n    CHATD_USER_ROOM_CREATED,\n    CONFERENCE_USER_PARTICIPANT_JOINED,\n    CONFERENCE_USER_PARTICIPANT_LEFT,\n    MEETING_USER_PARTICIPANT_JOINED,\n    MEETING_USER_PARTICIPANT_LEFT,\n    CONFERENCE_USER_PARTICIPANT_TALK_STARTED,\n    CONFERENCE_USER_PARTICIPANT_TALK_STOPPED,\n    SWITCHBOARD_QUEUED_CALLS_UPDATED,\n    SWITCHBOARD_QUEUED_CALL_ANSWERED,\n    SWITCHBOARD_HELD_CALLS_UPDATED,\n    SWITCHBOARD_HELD_CALL_ANSWERED,\n    FAX_OUTBOUND_USER_CREATED,\n    FAX_OUTBOUND_USER_SUCCEEDED,\n    FAX_OUTBOUND_USER_FAILED,\n    APPLICATION_CALL_DTMF_RECEIVED,\n    APPLICATION_CALL_ENTERED,\n    APPLICATION_CALL_INITIATED,\n    APPLICATION_CALL_DELETED,\n    APPLICATION_CALL_UPDATED,\n    APPLICATION_CALL_ANSWERED,\n    APPLICATION_PROGRESS_STARTED,\n    APPLICATION_PROGRESS_STOPPED,\n    APPLICATION_DESTINATION_NODE_CREATED,\n    APPLICATION_NODE_CREATED,\n    APPLICATION_NODE_DELETED,\n    APPLICATION_NODE_UPDATED,\n    APPLICATION_PLAYBACK_CREATED,\n    APPLICATION_PLAYBACK_DELETED,\n    APPLICATION_SNOOP_CREATED,\n    APPLICATION_SNOOP_DELETED,\n    APPLICATION_SNOOP_UPDATED,\n    APPLICATION_USER_OUTGOING_CALL_CREATED,\n    TRUNK_STATUS_UPDATED,\n    LINE_STATUS_UPDATED,\n    AGENT_STATUS_UPDATE,\n    AGENT_PAUSED,\n    AGENT_UNPAUSED,\n    AGENT_QUEUE_LOGGED_IN,\n    AGENT_QUEUE_LOGGED_OUT,\n    CONFERENCE_ADHOC_PARTICIPANT_LEFT,\n    CONFERENCE_ADHOC_DELETED,\n    MEETING_USER_PROGRESS,\n    MEETING_USER_GUEST_AUTHORIZATION_CREATED\n];\nconst websocket_client = WebSocketClient;\nconst wazo_websocket = {\n    name: 'Event transport (WS)',\n    check: (server, session)=>new Promise((resolve, reject)=>{\n            const client = new websocket_client({\n                host: server,\n                token: session.token,\n                version: 2\n            });\n            const handleError = (message)=>{\n                client.close();\n                reject(new Error(message));\n            };\n            const handleSuccess = ()=>{\n                client.stopHeartbeat();\n                client.close();\n                resolve();\n            };\n            client.on(SOCKET_EVENTS.ON_ERROR, (error)=>{\n                handleError(`Connection error : ${error}`);\n            });\n            client.on(SOCKET_EVENTS.ON_OPEN, ()=>{\n                if (session.hasEngineVersionGte(HEARTBEAT_ENGINE_VERSION)) {\n                    client.setOnHeartbeatTimeout(()=>{\n                        handleError('No response to heartbeat');\n                    });\n                    client.setOnHeartbeatCallback(()=>{\n                        handleSuccess();\n                    });\n                    client.startHeartbeat();\n                } else handleSuccess();\n            });\n            client.connect();\n        })\n};\nrequire(\"webrtc-adapter\");\nconst user_agent_state_namespaceObject = require(\"sip.js/lib/api/user-agent-state\");\nconst parser_namespaceObject = require(\"sip.js/lib/core/messages/parser\");\nconst methods_constants_namespaceObject = require(\"sip.js/lib/core/messages/methods/constants\");\nconst uri_namespaceObject = require(\"sip.js/lib/grammar/uri\");\nconst user_agent_namespaceObject = require(\"sip.js/lib/api/user-agent\");\nconst modifiers_namespaceObject = require(\"sip.js/lib/platform/web/modifiers/modifiers\");\nconst session_dialog_namespaceObject = require(\"sip.js/lib/core/dialogs/session-dialog\");\nconst messager_namespaceObject = require(\"sip.js/lib/api/messager\");\nconst registerer_state_namespaceObject = require(\"sip.js/lib/api/registerer-state\");\nconst transport_state_namespaceObject = require(\"sip.js/lib/api/transport-state\");\nconst peer_connection_configuration_default_namespaceObject = require(\"sip.js/lib/platform/web/session-description-handler/peer-connection-configuration-default\");\nconst external_getstats_namespaceObject = require(\"getstats\");\nvar external_getstats_default = /*#__PURE__*/ __webpack_require__.n(external_getstats_namespaceObject);\nconst lib_api_namespaceObject = require(\"sip.js/lib/api\");\nconst session_description_handler_namespaceObject = require(\"sip.js/lib/platform/web/session-description-handler/session-description-handler\");\nconst external_sdp_transform_namespaceObject = require(\"sdp-transform\");\nvar external_sdp_transform_default = /*#__PURE__*/ __webpack_require__.n(external_sdp_transform_namespaceObject);\nconst parseCandidate = (candidate)=>{\n    if (!candidate) return null;\n    const result = external_sdp_transform_default().parse(0 === candidate.indexOf('a=') ? candidate : `a=${candidate}`);\n    return result.candidates ? result.candidates[0] : null;\n};\nconst getSrflxOrRelay = (candidates)=>candidates.filter((candidate)=>candidate && ('srflx' === candidate.type || 'relay' === candidate.type));\nconst getVideoDirection = (sdp)=>{\n    const parsedSdp = external_sdp_transform_default().parse(sdp);\n    const videoMedia = parsedSdp.media.find((media)=>'video' === media.type);\n    if (!videoMedia) return null;\n    return videoMedia.direction;\n};\nconst hasAnActiveVideo = (sdp)=>{\n    if (!sdp) return false;\n    const parsedSdp = external_sdp_transform_default().parse(sdp);\n    return !!parsedSdp.media.find((media)=>'video' === media.type && media.port > 10 && (!media.direction || 'inactive' !== media.direction));\n};\nconst fixSdp = (sdp, candidates, forcePort = true)=>{\n    const parsedSdp = external_sdp_transform_default().parse(sdp);\n    const mainCandidate = getSrflxOrRelay(candidates)[0];\n    const ip = mainCandidate ? mainCandidate.ip : null;\n    if (ip) parsedSdp.origin.address = ip;\n    parsedSdp.media = parsedSdp.media.map((media)=>{\n        const port = forcePort ? mainCandidate ? mainCandidate.port : media.port : media.port;\n        return {\n            ...media,\n            port,\n            candidates: (media.candidates || []).concat(candidates),\n            direction: port < 10 ? 'inactive' : media.direction\n        };\n    });\n    let fixed = external_sdp_transform_default().write(parsedSdp);\n    if (ip) fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);\n    return fixed;\n};\nconst addIcesInAllBundles = (sdp)=>{\n    const parsedSdp = external_sdp_transform_default().parse(sdp);\n    const mediaWithCandidate = parsedSdp.media.find((media)=>!!media.candidates);\n    if (!mediaWithCandidate) return sdp;\n    const { candidates } = mediaWithCandidate;\n    parsedSdp.media = parsedSdp.media.map((media)=>({\n            ...media,\n            candidates: media.candidates || candidates\n        }));\n    return external_sdp_transform_default().write(parsedSdp);\n};\nconst wazoLogger = IssueReporter ? IssueReporter.loggerFor('webrtc-sdh') : console;\nconst wazoMediaStreamFactory = (constraints)=>{\n    if (!constraints.audio && !constraints.video) return Promise.resolve(new MediaStream());\n    if (void 0 === navigator.mediaDevices) return Promise.reject(new Error('Media devices not available in insecure contexts.'));\n    if (constraints.screen && !constraints.desktop) return navigator.mediaDevices.getDisplayMedia.call(navigator.mediaDevices, constraints);\n    return navigator.mediaDevices.getUserMedia.call(navigator.mediaDevices, constraints);\n};\nclass WazoSessionDescriptionHandler extends session_description_handler_namespaceObject.SessionDescriptionHandler {\n    gatheredCandidates;\n    eventEmitter;\n    isWeb;\n    session;\n    constructor(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration, isWeb, session){\n        super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);\n        this.eventEmitter = new (external_events_default())();\n        this.isWeb = isWeb;\n        this.session = session;\n    }\n    on(event, callback) {\n        this.eventEmitter.on(event, callback);\n    }\n    off(event, callback) {\n        this.eventEmitter.removeListener(event, callback);\n    }\n    setRemoteSessionDescription(sessionDescription) {\n        try {\n            const result = super.setRemoteSessionDescription(sessionDescription);\n            this.eventEmitter.emit(\"setDescription\", sessionDescription);\n            return result;\n        } catch (error) {\n            this.logger.error(`SessionDescriptionHandler.setRemoteSessionDescription: ${error}`);\n            throw error;\n        }\n    }\n    getDescription(options = {}, modifiers) {\n        this.logger.debug(\"SessionDescriptionHandler.getDescription\");\n        if (void 0 === this._peerConnection) return Promise.reject(new Error('Peer connection closed.'));\n        this.onDataChannel = options.onDataChannel;\n        const iceRestart = !!options.offerOptions && options.offerOptions.iceRestart;\n        const isConference = !!options && !!options.conference;\n        const audioOnly = !!options && !!options.audioOnly;\n        const shouldWaitForIce = !this.session.pendingReinviteAck && (iceRestart || 'constraints' in options);\n        const iceTimeout = void 0 === options.iceGatheringTimeout ? this.sessionDescriptionHandlerConfiguration?.iceGatheringTimeout : options.iceGatheringTimeout;\n        wazoLogger.trace(\"getting SDP description\", {\n            iceRestart,\n            shouldWaitForIce,\n            iceTimeout\n        });\n        this.gatheredCandidates = [];\n        if (!this.peerConnectionDelegate) this.peerConnectionDelegate = {};\n        this.peerConnectionDelegate.onicecandidate = (event)=>{\n            wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : {\n                done: true\n            });\n            if (event.candidate) {\n                this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));\n                if (-1 !== event.candidate.candidate.indexOf('srflx') || -1 !== event.candidate.candidate.indexOf('relay')) {\n                    wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {\n                        ice: event.candidate.candidate\n                    });\n                    this.iceGatheringComplete();\n                }\n            }\n        };\n        return this.getLocalMediaStream(options).then(()=>this.updateDirection(options, isConference, audioOnly)).then(()=>this.createDataChannel(options)).then(()=>{\n            if (isConference && options.constraints && !options.constraints.video && !('hold' in options) && !audioOnly) {\n                if (this.peerConnection?.addTransceiver) this.peerConnection.addTransceiver('video', {\n                    streams: [\n                        this._localMediaStream\n                    ],\n                    direction: 'sendrecv'\n                });\n            }\n        }).then(()=>this.createLocalOfferOrAnswer(options)).then((sessionDescription)=>this.setLocalSessionDescription(sessionDescription)).then(()=>this.waitForIceGatheringComplete(iceRestart, iceTimeout)).then(()=>this.getLocalSessionDescription()).then((description)=>{\n            const { sdp } = description;\n            if (-1 !== sdp.indexOf('a=candidate')) return {\n                type: description.type,\n                sdp: addIcesInAllBundles(sdp)\n            };\n            wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);\n            return {\n                type: description.type,\n                sdp: fixSdp(sdp, this.gatheredCandidates, !!options && !!options.constraints && options.constraints.video)\n            };\n        }).then((sessionDescription)=>this.applyModifiers(sessionDescription, modifiers)).then((sessionDescription)=>({\n                body: sessionDescription.sdp,\n                contentType: 'application/sdp'\n            })).catch((error)=>{\n            wazoLogger.error('error when creating media', error);\n            this.logger.error(`SessionDescriptionHandler.getDescription failed - ${error}`);\n            throw error;\n        });\n    }\n    sendDtmf(tones, options = {\n        duration: 0,\n        interToneGap: 0\n    }) {\n        if (this.isWeb) return super.sendDtmf(tones, options);\n        this.logger.debug(`DTMF sent via INFO: ${tones.toString()}`);\n        const body = {\n            contentDisposition: 'render',\n            contentType: 'application/dtmf-relay',\n            content: `Signal=${tones}\\r\\nDuration=${options.duration || 1000}`\n        };\n        const requestOptions = {\n            body\n        };\n        return this.session.info({\n            requestOptions\n        });\n    }\n    close() {\n        wazoLogger.info('closing sdh');\n        if (this.isWeb) return super.close();\n        this.logger.debug(\"SessionDescriptionHandler.close\");\n        if (void 0 === this._peerConnection) return;\n        if (this.peerConnection?.getLocalStreams) {\n            this.peerConnection?.getLocalStreams().forEach((stream)=>{\n                stream.getTracks().filter((track)=>track.enabled).forEach((track)=>track.stop());\n            });\n            this.peerConnection?.getRemoteStreams().forEach((stream)=>{\n                stream.getTracks().filter((track)=>track.enabled).forEach((track)=>track.stop());\n            });\n        }\n        if (this._dataChannel) this._dataChannel.close();\n        this._peerConnection.close();\n        this._peerConnection = void 0;\n    }\n    updateDirection(options, isConference = false, audioOnly = false) {\n        if (void 0 === this._peerConnection) return Promise.reject(new Error('Peer connection closed.'));\n        if (!this.isWeb) return Promise.resolve();\n        switch(this._peerConnection.signalingState){\n            case 'stable':\n                {\n                    this.logger.debug(\"SessionDescriptionHandler.updateDirection - setting offer direction\");\n                    const directionToOffer = (currentDirection, transceiver)=>{\n                        if (isConference) {\n                            if (audioOnly && transceiver.receiver.track && 'video' === transceiver.receiver.track.kind) return 'sendonly';\n                            return options && options.hold ? 'sendonly' : 'sendrecv';\n                        }\n                        switch(currentDirection){\n                            case 'inactive':\n                                return options && options.hold ? 'inactive' : isConference && !audioOnly ? 'sendrecv' : 'recvonly';\n                            case 'recvonly':\n                                return options && options.hold ? 'inactive' : 'recvonly';\n                            case 'sendonly':\n                                return options && options.hold ? 'sendonly' : 'sendrecv';\n                            case 'sendrecv':\n                                return options && options.hold ? 'sendonly' : 'sendrecv';\n                            case 'stopped':\n                                return 'stopped';\n                            default:\n                                throw new Error('Should never happen');\n                        }\n                    };\n                    this._peerConnection.getTransceivers().forEach((transceiver)=>{\n                        if (transceiver.direction) {\n                            const offerDirection = directionToOffer(transceiver.direction, transceiver);\n                            if (transceiver.direction !== offerDirection) transceiver.direction = offerDirection;\n                        }\n                    });\n                }\n                break;\n            case 'have-remote-offer':\n                {\n                    this.logger.debug(\"SessionDescriptionHandler.updateDirection - setting answer direction\");\n                    const offeredDirection = (()=>{\n                        const description = this._peerConnection.remoteDescription;\n                        if (!description) throw new Error('Failed to read remote offer');\n                        const searchResult = /a=sendrecv\\r\\n|a=sendonly\\r\\n|a=recvonly\\r\\n|a=inactive\\r\\n/.exec(description.sdp);\n                        if (searchResult) switch(searchResult[0]){\n                            case 'a=inactive\\r\\n':\n                                return 'inactive';\n                            case 'a=recvonly\\r\\n':\n                                return 'recvonly';\n                            case 'a=sendonly\\r\\n':\n                                return 'sendonly';\n                            case 'a=sendrecv\\r\\n':\n                                break;\n                            default:\n                                throw new Error('Should never happen');\n                        }\n                        return 'sendrecv';\n                    })();\n                    const answerDirection = (()=>{\n                        switch(offeredDirection){\n                            case 'inactive':\n                                return 'inactive';\n                            case 'recvonly':\n                                return 'sendonly';\n                            case 'sendonly':\n                                return options && options.hold ? 'inactive' : 'recvonly';\n                            case 'sendrecv':\n                                return options && options.hold ? 'sendonly' : 'sendrecv';\n                            default:\n                                throw new Error('Should never happen');\n                        }\n                    })();\n                    this._peerConnection.getTransceivers().forEach((transceiver)=>{\n                        if (transceiver.stopped) return;\n                        if (transceiver.direction) {\n                            const { receiver } = transceiver;\n                            if (isConference && audioOnly && receiver.track && 'video' === receiver.track.kind) {\n                                transceiver.direction = 'inactive';\n                                return;\n                            }\n                            if ('stopped' !== transceiver.direction && transceiver.direction !== answerDirection) transceiver.direction = answerDirection;\n                        }\n                    });\n                }\n                break;\n            case 'have-local-offer':\n            case 'have-local-pranswer':\n            case 'have-remote-pranswer':\n            case 'closed':\n            default:\n                return Promise.reject(new Error(`Invalid signaling state ${this._peerConnection.signalingState}`));\n        }\n        return Promise.resolve();\n    }\n    setLocalMediaStream(stream) {\n        this.logger.debug(\"SessionDescriptionHandler.setLocalMediaStream\");\n        if (!this._peerConnection) throw new Error('Peer connection undefined.');\n        const pc = this._peerConnection;\n        const { sfu } = pc;\n        const localStream = this._localMediaStream;\n        const trackUpdates = [];\n        const updateTrack = (newTrack)=>{\n            const { kind } = newTrack;\n            if ('audio' !== kind && 'video' !== kind) throw new Error(`Unknown new track kind ${kind}.`);\n            const sender = pc.getSenders && pc.getSenders().find((otherSender)=>otherSender.track && otherSender.track.kind === kind);\n            if (sender && (!sfu || 'audio' === newTrack.kind)) {\n                if (sender.track) newTrack.enabled = sender.track.enabled;\n                trackUpdates.push(new Promise((resolve)=>{\n                    this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - replacing sender ${kind} track`);\n                    resolve(null);\n                }).then(()=>sender.replaceTrack(newTrack).then(()=>{\n                        const oldTrack = localStream.getTracks().find((localTrack)=>localTrack.kind === kind);\n                        if (oldTrack) {\n                            oldTrack.stop();\n                            localStream.removeTrack(oldTrack);\n                            session_description_handler_namespaceObject.SessionDescriptionHandler.dispatchRemoveTrackEvent(localStream, oldTrack);\n                        }\n                        localStream.addTrack(newTrack);\n                        session_description_handler_namespaceObject.SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack);\n                    }).catch((error)=>{\n                        this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to replace sender ${kind} track`);\n                        throw error;\n                    })));\n            } else trackUpdates.push(new Promise((resolve)=>{\n                this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - adding sender ${kind} track`);\n                resolve(null);\n            }).then(()=>{\n                try {\n                    if (pc.addTrack) pc.addTrack(newTrack, localStream);\n                    else pc.addStream(localStream);\n                } catch (error) {\n                    this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to add sender ${kind} track`);\n                    throw error;\n                }\n                localStream.addTrack(newTrack);\n                session_description_handler_namespaceObject.SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack);\n            }));\n        };\n        const audioTracks = stream.getAudioTracks();\n        if (audioTracks.length) updateTrack(audioTracks[0]);\n        const videoTracks = stream.getVideoTracks();\n        if (videoTracks.length) updateTrack(videoTracks[0]);\n        return trackUpdates.reduce((p, x)=>p.then(()=>x), Promise.resolve());\n    }\n    getLocalMediaStream(options) {\n        this.logger.debug(\"WazoSessionDescriptionHandler.getLocalMediaStream\");\n        if (void 0 === this._peerConnection) return Promise.reject(new Error('Peer connection closed.'));\n        let constraints = options.constraints ? {\n            ...options.constraints\n        } : {};\n        if (this.localMediaStreamConstraints) {\n            if (JSON.stringify(this.localMediaStreamConstraints.audio) === JSON.stringify(constraints.audio) && JSON.stringify(this.localMediaStreamConstraints.video) === JSON.stringify(constraints.video)) return Promise.resolve();\n        } else if (void 0 === constraints.audio && void 0 === constraints.video) constraints = {\n            audio: true\n        };\n        this.localMediaStreamConstraints = constraints;\n        return this.mediaStreamFactory(constraints, this).then((mediaStream)=>{\n            this.setLocalMediaStream(mediaStream);\n            return mediaStream;\n        });\n    }\n}\nconst lib_WazoSessionDescriptionHandler = WazoSessionDescriptionHandler;\nconst lastIndexOf = (array, method)=>{\n    const start = array.length - 1;\n    for(let i = start; i >= 0; i--)if (method(array[i])) return i;\n    return -1;\n};\nconst replaceLocalIpModifier = (description)=>Promise.resolve({\n        ...JSON.parse(JSON.stringify(description)),\n        sdp: description.sdp.replace('c=IN IP4 0.0.0.0', 'c=IN IP4 127.0.0.1')\n    });\nconst DEFAULT_ICE_TIMEOUT = 3000;\nconst SEND_STATS_DELAY = 5000;\nconst MAX_ICE_RECONNECT_ATTEMPTS = 5;\nconst DEFAULT_ICE_RECONNECT_DELAY = 500;\nconst states = [\n    'STATUS_NULL',\n    'STATUS_NEW',\n    'STATUS_CONNECTING',\n    'STATUS_CONNECTED',\n    'STATUS_COMPLETED'\n];\nconst web_rtc_client_logger = IssueReporter ? IssueReporter.loggerFor('webrtc-client') : console;\nconst statsLogger = IssueReporter ? IssueReporter.loggerFor('webrtc-stats') : console;\nconst REGISTERED = 'registered';\nconst UNREGISTERED = 'unregistered';\nconst REGISTRATION_FAILED = 'registrationFailed';\nconst INVITE = 'invite';\nconst CONNECTED = 'connected';\nconst DISCONNECTED = 'disconnected';\nconst TRANSPORT_ERROR = 'transportError';\nconst MESSAGE = 'message';\nconst web_rtc_client_ACCEPTED = 'accepted';\nconst web_rtc_client_REJECTED = 'rejected';\nconst ON_TRACK = 'onTrack';\nconst ON_PROGRESS = 'onProgress';\nconst ON_EARLY_MEDIA = 'onEarlyMedia';\nconst ON_REINVITE = 'reinvite';\nconst ON_ERROR = 'onError';\nconst ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';\nconst ON_NETWORK_STATS = 'onNetworkStats';\nconst ON_ICE_DISCONNECTED = 'onIceDisconnected';\nconst ON_ICE_RECONNECTING = 'onIceReconnecting';\nconst ON_ICE_RECONNECTED = 'onIceReconnected';\nconst web_rtc_client_events = [\n    REGISTERED,\n    UNREGISTERED,\n    REGISTRATION_FAILED,\n    INVITE\n];\nconst transportEvents = [\n    CONNECTED,\n    DISCONNECTED,\n    TRANSPORT_ERROR,\n    MESSAGE\n];\nclass CanceledCallError extends Error {\n}\nconst MAX_REGISTER_TRIES = 5;\nconst NO_ANSWER_TIMEOUT = 86400;\nclass WebRTCClient extends Emitter {\n    clientId;\n    config;\n    uaConfigOverrides;\n    userAgent;\n    registerer;\n    hasAudio;\n    audio;\n    audioElements;\n    video;\n    audioStreams;\n    audioOutputDeviceId;\n    audioOutputVolume;\n    heldSessions;\n    connectionPromise;\n    _boundOnHeartbeat;\n    heartbeat;\n    heartbeatTimeoutCb;\n    heartbeatCb;\n    statsIntervals;\n    sipSessions;\n    conferences;\n    skipRegister;\n    networkMonitoringInterval;\n    sessionNetworkStats;\n    forceClosed;\n    iceReconnectAttempts;\n    iceReconnectDelay;\n    ON_USER_AGENT;\n    REGISTERED;\n    UNREGISTERED;\n    REGISTRATION_FAILED;\n    INVITE;\n    CONNECTED;\n    DISCONNECTED;\n    TRANSPORT_ERROR;\n    MESSAGE;\n    ACCEPTED;\n    REJECTED;\n    ON_TRACK;\n    ON_REINVITE;\n    ON_ERROR;\n    ON_SCREEN_SHARING_REINVITE;\n    ON_NETWORK_STATS;\n    ON_EARLY_MEDIA;\n    ON_PROGRESS;\n    ON_ICE_DISCONNECTED;\n    ON_ICE_RECONNECTING;\n    ON_ICE_RECONNECTED;\n    static isAPrivateIp(ip) {\n        const regex = /^(?:10|127|172\\.(?:1[6-9]|2[0-9]|3[01])|192\\.168)\\..*/;\n        return null == regex.exec(ip);\n    }\n    static getIceServers(ip) {\n        if (WebRTCClient.isAPrivateIp(ip)) return [\n            {\n                urls: [\n                    'stun:stun.l.google.com:19302',\n                    'stun:stun4.l.google.com:19302'\n                ]\n            }\n        ];\n        return [];\n    }\n    constructor(config, session, uaConfigOverrides){\n        super();\n        this.clientId = Math.ceil(1000 * Math.random());\n        web_rtc_client_logger.info('sdk webrtc constructor', {\n            clientId: this.clientId\n        });\n        this.uaConfigOverrides = uaConfigOverrides;\n        this.config = config;\n        this.skipRegister = config.skipRegister;\n        this._buildConfig(config, session).then((newConfig)=>{\n            this.config = newConfig;\n            this.userAgent = this.createUserAgent(uaConfigOverrides);\n        });\n        this.audioOutputDeviceId = config.audioDeviceOutput;\n        this.audioOutputVolume = config.audioOutputVolume || 1;\n        if (config.media) {\n            this.configureMedia(config.media);\n            this.setMediaConstraints({\n                audio: config.media.audio,\n                video: config.media.video\n            });\n        }\n        this.heldSessions = {};\n        this.statsIntervals = {};\n        this.connectionPromise = null;\n        this.sipSessions = {};\n        this.conferences = {};\n        this.networkMonitoringInterval = {};\n        this.sessionNetworkStats = {};\n        this.forceClosed = false;\n        this.iceReconnectAttempts = {};\n        this.iceReconnectDelay = config.iceReconnectDelay || DEFAULT_ICE_RECONNECT_DELAY;\n        this._boundOnHeartbeat = this._onHeartbeat.bind(this);\n        this.heartbeat = new Heartbeat(config.heartbeatDelay, config.heartbeatTimeout, config.maxHeartbeats);\n        this.heartbeat.setSendHeartbeat(this.pingServer.bind(this));\n        this.heartbeat.setOnHeartbeatTimeout(this._onHeartbeatTimeout.bind(this));\n        this.REGISTERED = REGISTERED;\n        this.UNREGISTERED = UNREGISTERED;\n        this.REGISTRATION_FAILED = REGISTRATION_FAILED;\n        this.INVITE = INVITE;\n        this.CONNECTED = CONNECTED;\n        this.DISCONNECTED = DISCONNECTED;\n        this.TRANSPORT_ERROR = TRANSPORT_ERROR;\n        this.MESSAGE = MESSAGE;\n        this.ACCEPTED = web_rtc_client_ACCEPTED;\n        this.REJECTED = web_rtc_client_REJECTED;\n        this.ON_TRACK = ON_TRACK;\n        this.ON_REINVITE = ON_REINVITE;\n        this.ON_ERROR = ON_ERROR;\n        this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;\n        this.ON_NETWORK_STATS = ON_NETWORK_STATS;\n        this.ON_ICE_DISCONNECTED = ON_ICE_DISCONNECTED;\n        this.ON_EARLY_MEDIA = ON_EARLY_MEDIA;\n        this.ON_PROGRESS = ON_PROGRESS;\n        this.ON_ICE_RECONNECTING = ON_ICE_RECONNECTING;\n        this.ON_ICE_RECONNECTED = ON_ICE_RECONNECTED;\n    }\n    configureMedia(media) {\n        this.hasAudio = !!media.audio;\n        this.audioStreams = {};\n        this.audioElements = {};\n    }\n    setMediaConstraints(media) {\n        this.video = media.video;\n        this.audio = media.audio;\n    }\n    createUserAgent(uaConfigOverrides) {\n        const uaOptions = this._createUaOptions(uaConfigOverrides);\n        web_rtc_client_logger.info('sdk webrtc, creating UA', {\n            uaOptions: {\n                ...uaOptions,\n                authorizationPassword: `${uaOptions?.authorizationPassword?.slice(0, 5)}xxxx`\n            },\n            clientId: this.clientId\n        });\n        uaOptions.delegate = {\n            onConnect: this.onConnect.bind(this),\n            onDisconnect: this.onDisconnect.bind(this),\n            onInvite: (invitation)=>{\n                web_rtc_client_logger.info('sdk webrtc on invite', {\n                    method: 'delegate.onInvite',\n                    clientId: this.clientId,\n                    id: this.getSipSessionId(invitation),\n                    remoteURI: invitation.remoteURI\n                });\n                this._setupSession(invitation);\n                const shouldAutoAnswer = !!invitation.request.getHeader('alert-info');\n                this.eventEmitter.emit(INVITE, invitation, this.sessionWantsToDoVideo(invitation), shouldAutoAnswer);\n            }\n        };\n        const ua = new user_agent_namespaceObject.UserAgent(uaOptions);\n        ua.start();\n        if (ua.transport && ua.transport.connectPromise) ua.transport.connectPromise.catch((e)=>{\n            web_rtc_client_logger.warn('Transport connect error', e);\n        });\n        ua.transport.onMessage = (rawMessage)=>{\n            const message = parser_namespaceObject.Parser.parseMessage(rawMessage, ua.transport.logger);\n            ua.onTransportMessage(rawMessage);\n            this.eventEmitter.emit(MESSAGE, message);\n            if (message && message.method === methods_constants_namespaceObject.C.MESSAGE) ua.userAgentCore.replyStateless(message, {\n                statusCode: 200\n            });\n        };\n        return ua;\n    }\n    isConnected() {\n        return Boolean(this.userAgent?.isConnected());\n    }\n    isConnecting() {\n        return this.userAgent?.transport?.state === transport_state_namespaceObject.TransportState.Connecting;\n    }\n    isRegistered() {\n        return Boolean(this.registerer && this.registerer.state === registerer_state_namespaceObject.RegistererState.Registered);\n    }\n    onConnect() {\n        web_rtc_client_logger.info('sdk webrtc connected', {\n            method: 'delegate.onConnect',\n            clientId: this.clientId\n        });\n        this.eventEmitter.emit(CONNECTED);\n        if (!this.isRegistered() && this.registerer?.waiting) this.registerer.waitingToggle(false);\n        return this.register();\n    }\n    async onDisconnect(error) {\n        web_rtc_client_logger.info('sdk webrtc disconnected', {\n            method: 'delegate.onConnect',\n            clientId: this.clientId,\n            error\n        });\n        this.connectionPromise = null;\n        this.eventEmitter.emit(DISCONNECTED, error);\n        if (this.isRegistered()) {\n            await this.unregister();\n            if (this.registerer?.waiting) this.registerer.waitingToggle(false);\n            this.eventEmitter.emit(UNREGISTERED);\n        }\n    }\n    async register(tries = 0) {\n        const logInfo = {\n            clientId: this.clientId,\n            userAgent: !!this.userAgent,\n            registered: this.isRegistered(),\n            connectionPromise: !!this.connectionPromise,\n            registerer: !!this.registerer,\n            waiting: this.registerer && this.registerer.waiting,\n            tries,\n            skipRegister: this.skipRegister\n        };\n        this.forceClosed = false;\n        if (this.skipRegister) {\n            web_rtc_client_logger.info('sdk webrtc skip register...', logInfo);\n            return Promise.resolve();\n        }\n        web_rtc_client_logger.info('sdk webrtc registering...', logInfo);\n        if (!this.userAgent) {\n            web_rtc_client_logger.info('sdk webrtc recreating User Agent');\n            this.userAgent = this.createUserAgent(this.uaConfigOverrides);\n        }\n        if (!this.userAgent || this.isRegistered()) {\n            web_rtc_client_logger.info('sdk webrtc registering aborted, already registered or no UA can be created');\n            return Promise.resolve();\n        }\n        if (this.connectionPromise || this.registerer?.waiting) {\n            web_rtc_client_logger.info('sdk webrtc registering aborted due to a registration in progress.', {\n                clientId: this.clientId\n            });\n            return Promise.resolve();\n        }\n        const registerOptions = this._isWeb() ? {} : {\n            extraContactHeaderParams: [\n                'mobility=mobile'\n            ]\n        };\n        const onRegisterFailed = ()=>{\n            web_rtc_client_logger.info('sdk webrtc registering failed', {\n                tries,\n                clientId: this.clientId,\n                registerer: !!this.registerer,\n                forceClosed: this.forceClosed\n            });\n            if (this.forceClosed) return;\n            this.connectionPromise = null;\n            if (this.registerer && this.registerer.waiting) this.registerer.waitingToggle(false);\n            if (tries <= MAX_REGISTER_TRIES) {\n                web_rtc_client_logger.info('sdk webrtc registering, retrying...', {\n                    clientId: this.clientId,\n                    tries\n                });\n                setTimeout(()=>this.register(tries + 1), 300);\n            }\n        };\n        return this._connectIfNeeded().then(()=>{\n            if (!this.userAgent) {\n                web_rtc_client_logger.info('sdk webrtc recreating User Agent after connection');\n                this.userAgent = this.createUserAgent(this.uaConfigOverrides);\n            }\n            web_rtc_client_logger.info('sdk webrtc registering, transport connected', {\n                registerOptions,\n                ua: !!this.userAgent,\n                clientId: this.clientId\n            });\n            this.registerer = new lib_api_namespaceObject.Registerer(this.userAgent, registerOptions);\n            this.connectionPromise = null;\n            this._monkeyPatchRegisterer(this.registerer);\n            this.registerer.stateChange.addListener((newState)=>{\n                web_rtc_client_logger.info('sdk webrtc registering, state changed', {\n                    newState,\n                    clientId: this.clientId\n                });\n                if (newState === registerer_state_namespaceObject.RegistererState.Registered && this.registerer?.state === registerer_state_namespaceObject.RegistererState.Registered) {\n                    if (navigator.userAgent?.includes('Windows') && (navigator.userAgent?.includes('Chrome') || navigator.userAgent?.includes('Chromium'))) this._performSacrificialWebRTCOperation().catch((error)=>{\n                        web_rtc_client_logger.warn('ICE warmup after registration failed', {\n                            error: error.message,\n                            clientId: this.clientId\n                        });\n                    });\n                    this.eventEmitter.emit(REGISTERED);\n                } else if (newState === registerer_state_namespaceObject.RegistererState.Unregistered) this.eventEmitter.emit(UNREGISTERED);\n            });\n            const options = {\n                requestDelegate: {\n                    onReject: (response)=>{\n                        web_rtc_client_logger.error('sdk webrtc registering, rejected', {\n                            clientId: this.clientId,\n                            response\n                        });\n                        onRegisterFailed();\n                    }\n                }\n            };\n            return this.registerer.register(options).catch((e)=>{\n                web_rtc_client_logger.error('sdk webrtc registering, error', e);\n                this.eventEmitter.emit(REGISTRATION_FAILED);\n                return e;\n            });\n        }).catch((error)=>{\n            web_rtc_client_logger.error('sdk webrtc registering, transport error', error);\n            onRegisterFailed();\n        });\n    }\n    _monkeyPatchRegisterer(registerer) {\n        if (!registerer) return;\n        const oldWaitingToggle = registerer.waitingToggle.bind(registerer);\n        const oldUnregistered = registerer.unregistered.bind(registerer);\n        registerer.waitingToggle = (waiting)=>{\n            if (!registerer || registerer.waiting === waiting) return;\n            oldWaitingToggle(waiting);\n        };\n        registerer.unregistered = ()=>{\n            if (!registerer || registerer.state === registerer_state_namespaceObject.RegistererState.Terminated) return;\n            oldUnregistered();\n        };\n    }\n    async unregister() {\n        web_rtc_client_logger.info('sdk webrtc unregistering..', {\n            clientId: this.clientId,\n            userAgent: !!this.userAgent,\n            registerer: !!this.registerer\n        });\n        try {\n            return new Promise((resolve, reject)=>{\n                if (!this.registerer) return resolve();\n                const onRegisterStateChange = (state)=>{\n                    if (state === registerer_state_namespaceObject.RegistererState.Unregistered) {\n                        web_rtc_client_logger.info('sdk webrtc unregistered', {\n                            clientId: this.clientId\n                        });\n                        if (this.registerer) this.registerer.stateChange.addListener(onRegisterStateChange);\n                        this._cleanupRegister();\n                        resolve();\n                    }\n                };\n                this.registerer.stateChange.addListener(onRegisterStateChange);\n                this.registerer.unregister().then().catch((e)=>{\n                    web_rtc_client_logger.error('sdk webrtc unregistering, promise error', e);\n                    this._cleanupRegister();\n                    reject();\n                });\n            });\n        } catch (e) {\n            web_rtc_client_logger.error('sdk webrtc unregistering, error', e);\n            this._cleanupRegister();\n        }\n    }\n    stop() {\n        web_rtc_client_logger.info('sdk webrtc stop', {\n            clientId: this.clientId,\n            userAgent: !!this.userAgent\n        });\n        if (!this.userAgent) return Promise.resolve();\n        return this.userAgent.stop().then(()=>this._cleanupRegister()).catch((e)=>{\n            web_rtc_client_logger.warn('sdk webrtc stop, error', {\n                message: e.message,\n                stack: e.stack\n            });\n        });\n    }\n    call(number, enableVideo, audioOnly = false, conference = false, options = {}) {\n        web_rtc_client_logger.info('sdk webrtc creating call', {\n            clientId: this.clientId,\n            number,\n            enableVideo,\n            audioOnly,\n            conference,\n            options\n        });\n        const inviterOptions = {\n            sessionDescriptionHandlerOptionsReInvite: {\n                conference,\n                audioOnly\n            },\n            earlyMedia: true,\n            ...options\n        };\n        if (audioOnly) inviterOptions.sessionDescriptionHandlerModifiersReInvite = [\n            modifiers_namespaceObject.stripVideo\n        ];\n        const uri = this._makeURI(number);\n        let session = null;\n        if (uri) session = this.userAgent ? new lib_api_namespaceObject.Inviter(this.userAgent, uri, inviterOptions) : null;\n        else web_rtc_client_logger.error('Null URI');\n        if (session) {\n            this.storeSipSession(session);\n            this._setupSession(session);\n        }\n        if (conference) this.conferences[this.getSipSessionId(session)] = true;\n        const inviteOptions = {\n            requestDelegate: {\n                onAccept: (response)=>{\n                    if (session?.sessionDescriptionHandler?.peerConnection) (session?.sessionDescriptionHandler).peerConnection.sfu = conference;\n                    this._onAccepted(session, response.session, true);\n                },\n                onProgress: (payload)=>{\n                    this._onProgress(payload.session, 183 === payload.message.statusCode);\n                },\n                onReject: (response)=>{\n                    web_rtc_client_logger.info('on call rejected', {\n                        id: this.getSipSessionId(session),\n                        fromTag: session?.fromTag\n                    });\n                    this._stopSendingStats(session);\n                    this.stopNetworkMonitoring(session);\n                    this.eventEmitter.emit(web_rtc_client_REJECTED, session, response);\n                }\n            },\n            sessionDescriptionHandlerOptions: this.getMediaConfiguration(enableVideo || false, conference)\n        };\n        if (inviteOptions.sessionDescriptionHandlerOptions) inviteOptions.sessionDescriptionHandlerOptions.audioOnly = audioOnly;\n        inviteOptions.sessionDescriptionHandlerModifiers = [\n            replaceLocalIpModifier\n        ];\n        if (audioOnly) inviteOptions.sessionDescriptionHandlerModifiers.push(modifiers_namespaceObject.stripVideo);\n        if (session) session.invitePromise = session.invite(inviteOptions).catch((e)=>{\n            web_rtc_client_logger.warn('sdk webrtc creating call, error', e);\n        });\n        return session;\n    }\n    answer(session, enableVideo) {\n        web_rtc_client_logger.info('sdk webrtc answer call', {\n            clientId: this.clientId,\n            id: this.getSipSessionId(session),\n            enableVideo\n        });\n        if (!session || !session.accept) {\n            const error = 'No session to answer, or not an invitation';\n            web_rtc_client_logger.warn(error);\n            return Promise.reject(new Error(error));\n        }\n        const options = {\n            sessionDescriptionHandlerOptions: this.getMediaConfiguration(enableVideo || false)\n        };\n        return this._accept(session, options).then(()=>{\n            if (session.isCanceled) {\n                const message = 'accepted a canceled session (or was canceled during the accept phase).';\n                web_rtc_client_logger.error(message, {\n                    id: this.getSipSessionId(session)\n                });\n                this.onCallEnded(session);\n                throw new CanceledCallError(message);\n            }\n            web_rtc_client_logger.info('sdk webrtc answer, accepted.');\n            this._onAccepted(session);\n        }).catch((e)=>{\n            web_rtc_client_logger.error(`answer call error for ${this.getSipSessionId(session)}`, e);\n            throw e;\n        });\n    }\n    async hangup(session) {\n        const { state, id } = session;\n        web_rtc_client_logger.info('sdk webrtc hangup call', {\n            clientId: this.clientId,\n            id,\n            state\n        });\n        try {\n            this._stopSendingStats(session);\n            this._cleanupMedia(session);\n            delete this.sipSessions[this.getSipSessionId(session)];\n            const isInviter = session instanceof lib_api_namespaceObject.Inviter;\n            const actions = {\n                [session_state_namespaceObject.SessionState.Initial]: isInviter ? this._cancel.bind(this, session) : this._reject.bind(this, session),\n                [session_state_namespaceObject.SessionState.Establishing]: isInviter ? this._cancel.bind(this, session) : this._reject.bind(this, session),\n                [session_state_namespaceObject.SessionState.Established]: this._bye.bind(this, session)\n            };\n            if (actions[state]) return await actions[state]();\n            return await this._bye(session);\n        } catch (error) {\n            web_rtc_client_logger.warn('sdk webrtc hangup, error', error);\n        }\n        return Promise.resolve(null);\n    }\n    async getStats(session) {\n        const pc = session.sessionDescriptionHandler?.peerConnection;\n        if (!pc) return null;\n        return pc.getStats(null);\n    }\n    startNetworkMonitoring(session, interval = 1000) {\n        const sessionId = this.getSipSessionId(session);\n        web_rtc_client_logger.info('starting network inspection', {\n            id: sessionId,\n            clientId: this.clientId\n        });\n        this.sessionNetworkStats[sessionId] = [];\n        this.networkMonitoringInterval[sessionId] = setInterval(()=>this._fetchNetworkStats(sessionId), interval);\n    }\n    stopNetworkMonitoring(session) {\n        const sessionId = this.getSipSessionId(session);\n        const exists = sessionId in this.networkMonitoringInterval;\n        web_rtc_client_logger.info('stopping network inspection', {\n            clientId: this.clientId,\n            id: sessionId,\n            exists\n        });\n        if (exists) {\n            clearInterval(this.networkMonitoringInterval[sessionId]);\n            delete this.networkMonitoringInterval[sessionId];\n            delete this.sessionNetworkStats[sessionId];\n        }\n    }\n    async reject(session) {\n        web_rtc_client_logger.info('sdk webrtc reject call', {\n            clientId: this.clientId,\n            id: this.getSipSessionId(session)\n        });\n        try {\n            if (session instanceof lib_api_namespaceObject.Invitation) return this._reject(session);\n            if (session instanceof lib_api_namespaceObject.Inviter) return this._cancel(session);\n        } catch (e) {\n            web_rtc_client_logger.warn('Error when rejecting call', e.message, e.stack);\n        }\n    }\n    async close(force = false) {\n        web_rtc_client_logger.info('sdk webrtc closing client', {\n            clientId: this.clientId,\n            userAgent: !!this.userAgent,\n            force\n        });\n        this.forceClosed = force;\n        this._cleanupMedia();\n        this.connectionPromise = null;\n        Object.values(this.audioElements).forEach((audioElement)=>{\n            audioElement.srcObject = null;\n            audioElement.pause();\n        });\n        this.audioElements = {};\n        if (!this.userAgent) return;\n        this.stopHeartbeat();\n        if (this.userAgent) this.userAgent.delegate = void 0;\n        this.userAgent.stateChange.removeAllListeners();\n        await this._disconnectTransport(force);\n        this._cleanupRegister();\n        try {\n            this.userAgent.transport.connectReject = ()=>{};\n            this.userAgent.stop().catch(console.error);\n        } catch (_) {}\n        this.userAgent = null;\n        web_rtc_client_logger.info('sdk webrtc client closed', {\n            clientId: this.clientId\n        });\n    }\n    getNumber(session) {\n        if (!session) return null;\n        return session.remoteIdentity.uri._normal.user;\n    }\n    mute(session) {\n        web_rtc_client_logger.info('sdk webrtc mute', {\n            id: this.getSipSessionId(session)\n        });\n        this._toggleAudio(session, true);\n    }\n    unmute(session) {\n        web_rtc_client_logger.info('sdk webrtc unmute', {\n            id: this.getSipSessionId(session)\n        });\n        this._toggleAudio(session, false);\n    }\n    isAudioMuted(session) {\n        if (!session || !session.sessionDescriptionHandler) return false;\n        let muted = true;\n        const pc = session.sessionDescriptionHandler.peerConnection;\n        if (!pc) return false;\n        if (pc.getSenders) {\n            if (!pc.getSenders().length) return false;\n            pc.getSenders().forEach((sender)=>{\n                if (sender && sender.track && 'audio' === sender.track.kind) muted = muted && !sender.track.enabled;\n            });\n        } else {\n            if (!pc.getLocalStreams().length) return false;\n            pc.getLocalStreams().forEach((stream)=>{\n                stream.getAudioTracks().forEach((track)=>{\n                    muted = muted && !track.enabled;\n                });\n            });\n        }\n        return muted;\n    }\n    toggleCameraOn(session) {\n        web_rtc_client_logger.info('sdk webrtc toggle camera on', {\n            id: this.getSipSessionId(session)\n        });\n        this._toggleVideo(session, false);\n    }\n    toggleCameraOff(session) {\n        web_rtc_client_logger.info('sdk webrtc toggle camera off', {\n            id: this.getSipSessionId(session)\n        });\n        this._toggleVideo(session, true);\n    }\n    hold(session, isConference = false, hadVideo = false) {\n        const sessionId = this.getSipSessionId(session);\n        const hasVideo = hadVideo || this.hasLocalVideo(sessionId);\n        web_rtc_client_logger.info('sdk webrtc hold', {\n            sessionId,\n            keys: Object.keys(this.heldSessions),\n            pendingReinvite: !!session.pendingReinvite,\n            isConference,\n            hasVideo\n        });\n        if (sessionId in this.heldSessions) return Promise.resolve();\n        if (session.pendingReinvite) return Promise.resolve();\n        this.heldSessions[sessionId] = {\n            hasVideo,\n            isConference\n        };\n        this.mute(session);\n        session.sessionDescriptionHandlerOptionsReInvite = {\n            hold: true,\n            conference: isConference\n        };\n        const options = this.getMediaConfiguration(false, isConference);\n        if (!this._isWeb()) options.sessionDescriptionHandlerModifiers = [\n            modifiers_namespaceObject.holdModifier\n        ];\n        options.sessionDescriptionHandlerOptions = {\n            constraints: options.constraints,\n            hold: true,\n            conference: isConference\n        };\n        if (session.sessionDescriptionHandler) session.sessionDescriptionHandler.localMediaStreamConstraints = options.constraints;\n        return session.invite(options).catch((e)=>{\n            web_rtc_client_logger.warn('sdk webrtc re-invite during hold, error', e);\n        });\n    }\n    unhold(session, isConference = false) {\n        const sessionId = this.getSipSessionId(session);\n        const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;\n        web_rtc_client_logger.info('sdk webrtc unhold', {\n            sessionId,\n            keys: Object.keys(this.heldSessions),\n            pendingReinvite: !!session.pendingReinvite,\n            isConference,\n            hasVideo\n        });\n        if (session.pendingReinvite) return Promise.resolve();\n        this.unmute(session);\n        delete this.heldSessions[this.getSipSessionId(session)];\n        session.sessionDescriptionHandlerOptionsReInvite = {\n            hold: false,\n            conference: isConference\n        };\n        const options = this.getMediaConfiguration(false, isConference);\n        if (!this._isWeb()) options.sessionDescriptionHandlerModifiers = [];\n        options.sessionDescriptionHandlerOptions = {\n            constraints: options.constraints,\n            hold: false,\n            conference: isConference\n        };\n        return session.invite(options).catch((e)=>{\n            web_rtc_client_logger.warn('sdk webrtc re-invite during resume, error', e);\n        });\n    }\n    async upgradeToVideo(session, constraints, isConference) {\n        const pc = session.sessionDescriptionHandler?.peerConnection;\n        let videoSender;\n        if (isConference) {\n            const transceivers = pc?.getTransceivers() || [];\n            const transceiverIdx = lastIndexOf(transceivers, (transceiver)=>null === transceiver.sender.track && transceiver.mid && -1 === transceiver.mid.indexOf('video'));\n            videoSender = -1 !== transceiverIdx ? transceivers[transceiverIdx].sender : null;\n        } else videoSender = pc && pc.getSenders && pc.getSenders().find((sender)=>null === sender.track);\n        if (!videoSender) return;\n        const newStream = await this.getStreamFromConstraints(constraints);\n        if (!newStream) {\n            console.warn(`Can't create media stream with: ${JSON.stringify(constraints || {})}`);\n            return;\n        }\n        if (constraints && !constraints.audio) {\n            const localVideoStream = session.sessionDescriptionHandler?.localMediaStream;\n            const localAudioTrack = localVideoStream.getTracks().find((track)=>'audio' === track.kind);\n            if (localAudioTrack) newStream.addTrack(localAudioTrack);\n        }\n        const videoTrack = newStream.getVideoTracks()[0];\n        if (videoTrack) videoSender.replaceTrack(videoTrack);\n        this.setLocalMediaStream(this.getSipSessionId(session), newStream);\n        return newStream;\n    }\n    downgradeToAudio(session) {\n        const sessionDescriptionHandler = session.sessionDescriptionHandler;\n        const localStream = sessionDescriptionHandler?.localMediaStream;\n        const pc = sessionDescriptionHandler?.peerConnection;\n        const videoTracks = localStream.getVideoTracks();\n        if (pc?.getSenders) pc.getSenders().filter((sender)=>sender.track && 'video' === sender.track.kind).forEach((videoSender)=>{\n            videoSender.replaceTrack(null);\n        });\n        videoTracks.forEach((videoTrack)=>{\n            videoTrack.enabled = false;\n            videoTrack.stop();\n            localStream.removeTrack(videoTrack);\n        });\n    }\n    async getStreamFromConstraints(constraints, conference = false) {\n        const video = constraints && constraints.video;\n        const { constraints: newConstraints } = this.getMediaConfiguration(video, conference, constraints);\n        let newStream = null;\n        try {\n            newStream = await wazoMediaStreamFactory(newConstraints);\n        } catch (e) {}\n        if (!newStream) return null;\n        newStream.local = true;\n        return newStream;\n    }\n    getHeldSession(sessionId) {\n        return this.heldSessions[sessionId];\n    }\n    isCallHeld(session) {\n        return this.getSipSessionId(session) in this.heldSessions;\n    }\n    isVideoRemotelyHeld(sessionId) {\n        const pc = this.getPeerConnection(sessionId);\n        const sdp = pc && pc.remoteDescription ? pc.remoteDescription.sdp : null;\n        if (!sdp) return false;\n        const videoDirection = getVideoDirection(sdp);\n        return 'sendonly' === videoDirection;\n    }\n    sendDTMF(session, tone) {\n        if (!session.sessionDescriptionHandler) return false;\n        web_rtc_client_logger.info('Sending DTMF', {\n            id: this.getSipSessionId(session),\n            tone\n        });\n        return session.sessionDescriptionHandler.sendDtmf(tone);\n    }\n    message(destination, message) {\n        const uri = this._makeURI(destination);\n        if (!this.userAgent || !uri) {\n            web_rtc_client_logger.warn('Null value on message', {\n                uri,\n                userAgent: this.userAgent\n            });\n            return;\n        }\n        const messager = new messager_namespaceObject.Messager(this.userAgent, uri, message);\n        messager.message();\n    }\n    transfer(session, target) {\n        this.hold(session);\n        web_rtc_client_logger.info('Transfering a session', {\n            id: this.getSipSessionId(session),\n            target\n        });\n        const options = {\n            requestDelegate: {\n                onAccept: ()=>{\n                    this.hangup(session);\n                }\n            }\n        };\n        setTimeout(()=>{\n            const uri = this._makeURI(target);\n            if (!uri) {\n                web_rtc_client_logger.warn('transfer timeout: null URI');\n                return;\n            }\n            session.refer(uri, options);\n        }, 50);\n    }\n    atxfer(session) {\n        this.hold(session);\n        web_rtc_client_logger.info('webrtc transfer started', {\n            id: this.getSipSessionId(session)\n        });\n        const result = {\n            newSession: null,\n            init: async (target)=>{\n                web_rtc_client_logger.info('webrtc transfer initialized', {\n                    id: this.getSipSessionId(session),\n                    target\n                });\n                result.newSession = await this.call(target);\n            },\n            complete: ()=>{\n                web_rtc_client_logger.info('webrtc transfer completed', {\n                    id: this.getSipSessionId(session),\n                    referId: this.getSipSessionId(result.newSession)\n                });\n                session.refer(result.newSession);\n            },\n            cancel: ()=>{\n                this.hangup(result.newSession);\n                this.unhold(session);\n            }\n        };\n        return result;\n    }\n    sendMessage(sipSession = null, body, contentType = 'text/plain') {\n        if (!sipSession) return;\n        web_rtc_client_logger.info('send WebRTC message', {\n            sipId: this.getSipSessionId(sipSession),\n            contentType\n        });\n        try {\n            sipSession.message({\n                requestOptions: {\n                    body: {\n                        content: body,\n                        contentType,\n                        contentDisposition: ''\n                    }\n                }\n            });\n        } catch (e) {\n            console.warn(e);\n        }\n    }\n    pingServer() {\n        if (!this.isConnected()) return;\n        const core = this.userAgent?.userAgentCore;\n        const fromURI = this._makeURI(this.config.authorizationUser || '');\n        const toURI = new uri_namespaceObject.URI('sip', '', this.config.host);\n        if (fromURI) {\n            const message = core?.makeOutgoingRequestMessage('OPTIONS', toURI, fromURI, toURI, {});\n            if (message) return core?.request(message);\n            web_rtc_client_logger.warn('pingServer: null message');\n        }\n        web_rtc_client_logger.warn('pingServer: null fromURI');\n    }\n    getState() {\n        return this.userAgent ? states[this.userAgent.state] : user_agent_state_namespaceObject.UserAgentState.Stopped;\n    }\n    getContactIdentifier() {\n        return this.userAgent ? `${this.userAgent.configuration.contactName}/${this.userAgent.contact.uri}` : null;\n    }\n    isFirefox() {\n        return this._isWeb() && navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n    }\n    changeAudioOutputVolume(volume) {\n        web_rtc_client_logger.info('Changing audio output volume', {\n            volume\n        });\n        Object.values(this.audioElements).forEach((audioElement)=>{\n            if (audioElement instanceof HTMLAudioElement) audioElement.volume = volume;\n        });\n        this.audioOutputVolume = volume;\n    }\n    async changeAudioOutputDevice(id) {\n        web_rtc_client_logger.info('Changing audio output device', {\n            id\n        });\n        this.audioOutputDeviceId = id;\n        const promises = [];\n        Object.values(this.audioElements).forEach((audioElement)=>promises.push(audioElement.setSinkId(id)));\n        await Promise.allSettled(promises);\n    }\n    async changeAudioInputDevice(id, session, force) {\n        const currentId = this.getAudioDeviceId();\n        web_rtc_client_logger.info('setting audio input device', {\n            id,\n            currentId,\n            session: !!session\n        });\n        if (!force && id === currentId) return null;\n        let deviceId = id;\n        if ('default' === id && navigator.mediaDevices) {\n            const devices = await navigator.mediaDevices.enumerateDevices();\n            const defaultDevice = devices.find((device)=>'default' === device.deviceId);\n            if (defaultDevice) {\n                const deviceLabel = defaultDevice.label.replace('Default - ', '');\n                const targetDevice = devices.find((device)=>device.label === deviceLabel);\n                if (targetDevice) {\n                    deviceId = targetDevice.deviceId;\n                    if (!force && deviceId === currentId) return null;\n                }\n            }\n        }\n        if (this.audio) this.audio = {\n            deviceId: {\n                exact: deviceId\n            }\n        };\n        if (session && navigator.mediaDevices) {\n            const sdh = session.sessionDescriptionHandler;\n            const pc = sdh?.peerConnection;\n            const constraints = {\n                audio: {\n                    deviceId: {\n                        exact: deviceId\n                    }\n                }\n            };\n            const stream = await navigator.mediaDevices.getUserMedia(constraints);\n            const audioTrack = stream.getAudioTracks()[0];\n            const sender = pc && pc.getSenders && pc.getSenders().find((s)=>audioTrack && s && s.track && s.track.kind === audioTrack.kind);\n            if (sender) {\n                if (sender.track) audioTrack.enabled = sender.track.enabled;\n                sender.replaceTrack(audioTrack);\n            }\n            return stream;\n        }\n        return null;\n    }\n    async changeVideoInputDevice(id, session) {\n        this.setVideoInputDevice(id);\n        if (session) return this.changeSessionVideoInputDevice(id, session);\n    }\n    setVideoInputDevice(id) {\n        const currentId = this.getVideoDeviceId();\n        web_rtc_client_logger.info('setting video input device', {\n            id,\n            currentId\n        });\n        if (id === currentId) return null;\n        const videoObject = 'object' == typeof this.video ? this.video : {};\n        this.video = {\n            ...videoObject,\n            deviceId: {\n                exact: id\n            }\n        };\n    }\n    changeSessionVideoInputDevice(id, session) {\n        if (!this.sessionWantsToDoVideo(session)) return Promise.resolve();\n        const sdh = session.sessionDescriptionHandler;\n        const pc = sdh.peerConnection;\n        const sessionId = this.getSipSessionId(session);\n        const localStream = this.getLocalStream(sessionId);\n        web_rtc_client_logger.info('changing video input device', {\n            id,\n            sessionId\n        });\n        if (localStream) localStream.getVideoTracks().filter((track)=>track.enabled).forEach((track)=>track.stop());\n        const constraints = {\n            video: !id || {\n                deviceId: {\n                    exact: id\n                }\n            }\n        };\n        return navigator.mediaDevices.getUserMedia(constraints).then(async (stream)=>{\n            const videoTrack = stream.getVideoTracks()[0];\n            let sender = pc && pc.getSenders && pc.getSenders().find((s)=>videoTrack && s && s.track && s.track.kind === videoTrack.kind);\n            let wasTrackEnabled = false;\n            if (!sender) sender = pc && pc.getSenders && pc.getSenders().find((s)=>!s.track);\n            if (sender) {\n                wasTrackEnabled = !!sender.track && sender.track.enabled;\n                videoTrack.enabled = wasTrackEnabled;\n                if (!wasTrackEnabled) videoTrack.stop();\n                sender.replaceTrack(wasTrackEnabled ? videoTrack : null);\n            }\n            this.eventEmitter.emit('onVideoInputChange', stream);\n            this.setLocalMediaStream(sessionId, stream);\n            return stream;\n        });\n    }\n    getAudioDeviceId() {\n        return this.audio && 'object' == typeof this.audio && 'deviceId' in this.audio ? this.audio.deviceId?.exact : void 0;\n    }\n    getVideoDeviceId() {\n        return this.video && 'object' == typeof this.video && 'deviceId' in this.video ? this.video.deviceId?.exact : void 0;\n    }\n    reinvite(sipSession, newConstraints = null, conference = false, audioOnly = false, iceRestart = false) {\n        if (!sipSession) return Promise.resolve();\n        if (sipSession.pendingReinvite) return Promise.resolve();\n        const wasMuted = this.isAudioMuted(sipSession);\n        const shouldDoVideo = newConstraints ? newConstraints.video : this.sessionWantsToDoVideo(sipSession);\n        const shouldDoScreenSharing = newConstraints && newConstraints.screen;\n        const desktop = newConstraints && newConstraints.desktop;\n        web_rtc_client_logger.info('Sending reinvite', {\n            clientId: this.clientId,\n            id: this.getSipSessionId(sipSession),\n            newConstraints,\n            conference,\n            audioOnly,\n            wasMuted,\n            shouldDoVideo,\n            shouldDoScreenSharing,\n            desktop\n        });\n        if (newConstraints && newConstraints.video) {\n            const modifiers = sipSession.sessionDescriptionHandlerModifiersReInvite;\n            sipSession.sessionDescriptionHandlerModifiersReInvite = modifiers.filter((modifier)=>modifier !== modifiers_namespaceObject.stripVideo);\n        }\n        sipSession.sessionDescriptionHandlerOptionsReInvite = {\n            ...sipSession.sessionDescriptionHandlerOptionsReInvite,\n            conference,\n            audioOnly\n        };\n        const { constraints } = this.getMediaConfiguration(shouldDoVideo, conference, newConstraints);\n        return sipSession.invite({\n            requestDelegate: {\n                onAccept: (response)=>{\n                    if (sipSession instanceof lib_api_namespaceObject.Inviter && sipSession.outgoingRequestMessage.body) sipSession.outgoingRequestMessage.body.body = response.message.body;\n                    else if (sipSession instanceof lib_api_namespaceObject.Invitation) sipSession.incomingInviteRequest.message.body = response.message.body;\n                    web_rtc_client_logger.info('on re-INVITE accepted', {\n                        id: this.getSipSessionId(sipSession),\n                        wasMuted,\n                        shouldDoScreenSharing\n                    });\n                    this.updateRemoteStream(this.getSipSessionId(sipSession), false);\n                    if (wasMuted) this.mute(sipSession);\n                    this._onAccepted(sipSession, response.session, false, false);\n                    if (shouldDoScreenSharing) this.eventEmitter.emit(ON_SCREEN_SHARING_REINVITE, sipSession, response, desktop);\n                    return this.eventEmitter.emit(ON_REINVITE, sipSession, response);\n                }\n            },\n            sessionDescriptionHandlerModifiers: [\n                replaceLocalIpModifier\n            ],\n            requestOptions: {\n                extraHeaders: [\n                    `Subject: ${shouldDoScreenSharing ? 'screenshare' : 'upgrade-video'}`\n                ]\n            },\n            sessionDescriptionHandlerOptions: {\n                constraints,\n                conference,\n                audioOnly,\n                offerOptions: {\n                    iceRestart\n                }\n            }\n        });\n    }\n    async getUserMedia(constraints) {\n        const newConstraints = {\n            audio: this._getAudioConstraints(),\n            video: this._getVideoConstraints(constraints.video)\n        };\n        return navigator.mediaDevices.getUserMedia(newConstraints);\n    }\n    getPeerConnection(sessionId) {\n        const sipSession = this.sipSessions[sessionId];\n        if (!sipSession) return null;\n        return sipSession.sessionDescriptionHandler ? sipSession.sessionDescriptionHandler.peerConnection : null;\n    }\n    getLocalStream(sessionId) {\n        const sipSession = this.sipSessions[sessionId];\n        return sipSession?.sessionDescriptionHandler?.localMediaStream || null;\n    }\n    getLocalTracks(sessionId) {\n        const localStream = this.getLocalStream(sessionId);\n        if (!localStream) return [];\n        return localStream.getTracks();\n    }\n    hasLocalVideo(sessionId) {\n        return this.getLocalTracks(sessionId).some(this._isVideoTrack);\n    }\n    hasALocalVideoTrack(sessionId) {\n        return this.getLocalTracks(sessionId).some((track)=>'video' === track.kind);\n    }\n    getLocalVideoStream(sessionId) {\n        return this.hasLocalVideo(sessionId) ? this.getLocalStream(sessionId) : null;\n    }\n    getRemoteStream(sessionId) {\n        const sipSession = this.sipSessions[sessionId];\n        return sipSession?.sessionDescriptionHandler?.remoteMediaStream || null;\n    }\n    getRemoteTracks(sessionId) {\n        const remoteStream = this.getRemoteStream(sessionId);\n        if (!remoteStream) return [];\n        return remoteStream.getTracks();\n    }\n    hasRemoteVideo(sessionId) {\n        return this.getRemoteTracks(sessionId).some(this._isVideoTrack);\n    }\n    hasARemoteVideoTrack(sessionId) {\n        return this.getRemoteTracks(sessionId).some((track)=>'video' === track.kind);\n    }\n    getRemoteVideoStream(sessionId) {\n        if (this.isVideoRemotelyHeld(sessionId)) return null;\n        return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;\n    }\n    getRemoteVideoStreamFromPc(sessionId) {\n        const pc = this.getPeerConnection(sessionId);\n        if (!pc) return null;\n        return pc.getRemoteStreams().find((stream)=>!!stream.getVideoTracks().length);\n    }\n    hasVideo(sessionId) {\n        return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);\n    }\n    hasAVideoTrack(sessionId) {\n        return this.hasALocalVideoTrack(sessionId) || this.hasARemoteVideoTrack(sessionId);\n    }\n    getSipSessionId(sipSession) {\n        if (!sipSession) return '';\n        if (sipSession instanceof lib_api_namespaceObject.Inviter && sipSession.outgoingRequestMessage) return sipSession.outgoingRequestMessage.callId;\n        if (sipSession instanceof lib_api_namespaceObject.Invitation && sipSession.incomingInviteRequest.message) return sipSession.incomingInviteRequest.message.callId;\n        if (sipSession instanceof session_dialog_namespaceObject.SessionDialog) return sipSession.dialogState.callId;\n        return '';\n    }\n    async waitForRegister() {\n        return new Promise((resolve)=>this.on(REGISTERED, resolve));\n    }\n    sessionWantsToDoVideo(session) {\n        if (!session) return false;\n        const { body } = session.request || session;\n        const sdp = 'object' == typeof body && body ? body.body : body;\n        return hasAnActiveVideo(sdp);\n    }\n    hasHeartbeat() {\n        return this.heartbeat.hasHeartbeat;\n    }\n    startHeartbeat() {\n        web_rtc_client_logger.info('sdk webrtc start heartbeat', {\n            userAgent: !!this.userAgent,\n            clientId: this.clientId\n        });\n        if (!this.userAgent) {\n            this.heartbeat.stop();\n            return;\n        }\n        this.eventEmitter.off(MESSAGE, this._boundOnHeartbeat);\n        this.eventEmitter.on(MESSAGE, this._boundOnHeartbeat);\n        this.heartbeat.start();\n    }\n    stopHeartbeat() {\n        web_rtc_client_logger.info('sdk webrtc stop heartbeat', {\n            clientId: this.clientId\n        });\n        this.heartbeat.stop();\n    }\n    setOnHeartbeatTimeout(cb) {\n        this.heartbeatTimeoutCb = cb;\n    }\n    setOnHeartbeatCallback(cb) {\n        this.heartbeatCb = cb;\n    }\n    onCallEnded(session) {\n        this._cleanupMedia(session);\n        const sessionId = this.getSipSessionId(session);\n        delete this.sipSessions[sessionId];\n        delete this.iceReconnectAttempts[sessionId];\n        this._stopSendingStats(session);\n        this.stopNetworkMonitoring(session);\n    }\n    async _performSacrificialWebRTCOperation() {\n        web_rtc_client_logger.info('Performing sacrificial WebRTC operation for Windows Chromium bug', {\n            clientId: this.clientId\n        });\n        const config = {\n            iceServers: this.uaConfigOverrides?.peerConnectionOptions?.iceServers || WebRTCClient.getIceServers(this.config.host)\n        };\n        const pc1 = new RTCPeerConnection(config);\n        const pc2 = new RTCPeerConnection(config);\n        pc1.onicecandidate = (event)=>{\n            if (event.candidate) pc2.addIceCandidate(event.candidate).catch(()=>{});\n        };\n        pc2.onicecandidate = (event)=>{\n            if (event.candidate) pc1.addIceCandidate(event.candidate).catch(()=>{});\n        };\n        pc1.addTransceiver('audio', {\n            direction: 'recvonly'\n        });\n        pc1.addTransceiver('video', {\n            direction: 'recvonly'\n        });\n        pc1.createDataChannel('sacrifice');\n        const offer = await pc1.createOffer();\n        await pc1.setLocalDescription(offer);\n        await pc2.setRemoteDescription(offer);\n        const answer = await pc2.createAnswer();\n        await pc2.setLocalDescription(answer);\n        await pc1.setRemoteDescription(answer);\n        await new Promise((resolve)=>{\n            const timeoutId = setTimeout(()=>{\n                web_rtc_client_logger.warn('Sacrificial WebRTC operation timed out waiting for ICE connection state.', {\n                    clientId: this.clientId\n                });\n                resolve();\n            }, 10000);\n            const checkIceState = ()=>{\n                if ('new' !== pc1.iceConnectionState && 'checking' !== pc1.iceConnectionState) {\n                    clearTimeout(timeoutId);\n                    web_rtc_client_logger.info(`Sacrificial WebRTC: ICE connection state reached ${pc1.iceConnectionState}`, {\n                        clientId: this.clientId\n                    });\n                    resolve();\n                }\n            };\n            pc1.oniceconnectionstatechange = checkIceState;\n            checkIceState();\n        });\n        pc1.close();\n        pc2.close();\n        web_rtc_client_logger.info('Sacrificial WebRTC operation completed', {\n            clientId: this.clientId\n        });\n    }\n    attemptReconnection() {\n        web_rtc_client_logger.info('attempt reconnection', {\n            clientId: this.clientId,\n            userAgent: !!this.userAgent\n        });\n        if (!this.userAgent) return;\n        this.userAgent.attemptReconnection();\n    }\n    storeSipSession(session) {\n        const id = this.getSipSessionId(session);\n        web_rtc_client_logger.info('storing sip session', {\n            id,\n            clientId: this.clientId\n        });\n        this.sipSessions[id] = session;\n    }\n    getSipSession(id) {\n        return id in this.sipSessions ? this.sipSessions[id] : null;\n    }\n    getSipSessionIds() {\n        return Object.keys(this.sipSessions);\n    }\n    setLocalMediaStream(sipSessionId, newStream) {\n        const sipSession = this.sipSessions[sipSessionId];\n        if (!sipSession) return;\n        web_rtc_client_logger.info('setting local media stream', {\n            sipSessionId,\n            tracks: newStream ? newStream.getTracks() : null\n        });\n        if (sipSession.sessionDescriptionHandler) sipSession.sessionDescriptionHandler._localMediaStream = newStream;\n    }\n    async updateLocalStream(sipSessionId, newStream) {\n        const sipSession = this.sipSessions[sipSessionId];\n        if (!sipSession) return;\n        const oldStream = this.getLocalStream(sipSessionId);\n        web_rtc_client_logger.info('updating local stream', {\n            sipSessionId,\n            oldStream: !!oldStream,\n            tracks: newStream.getTracks()\n        });\n        if (oldStream) this._cleanupStream(oldStream);\n        this.setLocalMediaStream(sipSessionId, newStream);\n        await this._setupMedias(sipSession, newStream);\n    }\n    updateRemoteStream(sessionId, allTracks = true) {\n        const remoteStream = this.getRemoteStream(sessionId);\n        const pc = this.getPeerConnection(sessionId);\n        web_rtc_client_logger.info('Updating remote stream', {\n            sessionId,\n            tracks: remoteStream ? remoteStream.getTracks() : null,\n            receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map((receiver)=>receiver.track) : null\n        });\n        if (!pc || !remoteStream) return;\n        remoteStream.getTracks().forEach((track)=>{\n            if (allTracks || 'video' === track.kind) remoteStream.removeTrack(track);\n        });\n        if (pc.getReceivers) pc.getReceivers().forEach((receiver)=>{\n            if (allTracks || 'video' === receiver.track.kind) remoteStream.addTrack(receiver.track);\n        });\n    }\n    getMediaConfiguration(enableVideo, conference = false, constraints = null) {\n        const screenSharing = !!constraints && 'screen' in constraints && constraints.screen;\n        const isDesktop = !!constraints && 'desktop' in constraints && constraints.desktop;\n        const withAudio = !constraints || !('audio' in constraints) || constraints.audio;\n        const mandatoryVideo = constraints && 'object' == typeof constraints.video ? constraints.video.mandatory : {};\n        web_rtc_client_logger.info('Retrieving media a configuration', {\n            enableVideo,\n            screenSharing,\n            isDesktop,\n            withAudio,\n            constraints\n        });\n        return {\n            constraints: {\n                audio: screenSharing ? !isDesktop : !!withAudio && this._getAudioConstraints(),\n                video: screenSharing ? isDesktop ? {\n                    mandatory: {\n                        chromeMediaSource: 'desktop',\n                        ...mandatoryVideo || {}\n                    }\n                } : {\n                    cursor: 'always'\n                } : this._getVideoConstraints(enableVideo),\n                screen: screenSharing,\n                desktop: isDesktop,\n                conference\n            },\n            enableVideo,\n            conference,\n            offerOptions: {\n                OfferToReceiveAudio: this._hasAudio(),\n                OfferToReceiveVideo: enableVideo,\n                mandatory: {\n                    OfferToReceiveAudio: this._hasAudio(),\n                    OfferToReceiveVideo: enableVideo\n                }\n            }\n        };\n    }\n    isConference(sessionId) {\n        return sessionId in this.conferences;\n    }\n    async createAudioElementFor(sessionId) {\n        const audio = document.createElement('audio');\n        audio.setAttribute('id', `audio-${sessionId}`);\n        web_rtc_client_logger.info('creating audio element', {\n            sessionId,\n            audioOutputDeviceId: this.audioOutputDeviceId\n        });\n        if (this.audioOutputDeviceId) await audio.setSinkId(this.audioOutputDeviceId);\n        if (document.body) document.body.appendChild(audio);\n        this.audioElements[sessionId] = audio;\n        audio.volume = this.audioOutputVolume;\n        audio.autoplay = true;\n        return audio;\n    }\n    _onTransportError() {\n        web_rtc_client_logger.error('on transport error');\n        this.eventEmitter.emit(TRANSPORT_ERROR);\n        this.attemptReconnection();\n    }\n    enableLogger(logConnector) {\n        if (!this.userAgent) return;\n        if (this.userAgent?.transport) this.userAgent.transport.configuration.traceSip = true;\n        this.userAgent.loggerFactory.builtinEnabled = true;\n        this.userAgent.loggerFactory.level = 3;\n        this.userAgent.loggerFactory.connector = logConnector;\n    }\n    _onHeartbeat(message) {\n        const body = message && 'object' == typeof message ? message.data : message;\n        if (body && -1 !== body.indexOf('200 OK')) {\n            if (this.hasHeartbeat()) {\n                web_rtc_client_logger.info('on heartbeat received from Asterisk', {\n                    hasHeartbeat: this.hasHeartbeat()\n                });\n                this.heartbeat.onHeartbeat();\n                if (this.heartbeatCb) this.heartbeatCb();\n            }\n        }\n    }\n    async _onHeartbeatTimeout() {\n        web_rtc_client_logger.warn('sdk webrtc heartbeat timed out', {\n            userAgent: !!this.userAgent,\n            cb: !!this.heartbeatTimeoutCb\n        });\n        if (this.heartbeatTimeoutCb) this.heartbeatTimeoutCb();\n        if (this.userAgent && this.userAgent.transport) {\n            const transport = this.userAgent.transport;\n            if (!transport.transitioningState && !transport.disconnectPromise) try {\n                await this.userAgent.transport.disconnect();\n            } catch (e) {\n                web_rtc_client_logger.error('Transport disconnection after heartbeat timeout, error', e);\n            }\n            this._onTransportError();\n        }\n    }\n    _isWeb() {\n        return 'object' == typeof window && 'object' == typeof document;\n    }\n    _isVideoTrack(track) {\n        return 'video' === track.kind && 'live' === track.readyState;\n    }\n    _hasAudio() {\n        return this.hasAudio;\n    }\n    _getAudioConstraints() {\n        return !this.audio?.deviceId?.exact || this.audio;\n    }\n    _getVideoConstraints(video = false) {\n        if (!video) return false;\n        return !this.video?.deviceId?.exact || this.video;\n    }\n    _connectIfNeeded() {\n        web_rtc_client_logger.info('connect if needed, checking', {\n            connected: this.isConnected(),\n            clientId: this.clientId\n        });\n        if (!this.userAgent) {\n            web_rtc_client_logger.info('need to recreate User Agent');\n            this.userAgent = this.createUserAgent(this.uaConfigOverrides);\n        }\n        if (this.isConnected()) {\n            web_rtc_client_logger.info('webrtc sdk, already connected');\n            return Promise.resolve();\n        }\n        if (this.isConnecting()) {\n            web_rtc_client_logger.info('webrtc sdk, already connecting...');\n            this.connectionPromise = this.userAgent.transport.connectPromise;\n            return Promise.resolve(this.connectionPromise);\n        }\n        if (this.connectionPromise) {\n            web_rtc_client_logger.info('webrtc sdk, connection promise connecting...');\n            return this.connectionPromise;\n        }\n        web_rtc_client_logger.info('WebRTC UA needs to connect');\n        if (this.userAgent && this.userAgent.state !== user_agent_state_namespaceObject.UserAgentState.Stopped) this.userAgent.transitionState(user_agent_state_namespaceObject.UserAgentState.Stopped);\n        if (this.userAgent.transport && this.userAgent.transport.state !== transport_state_namespaceObject.TransportState.Disconnected) this.userAgent.transport.transitionState(transport_state_namespaceObject.TransportState.Disconnected);\n        this.connectionPromise = this.userAgent.start().catch(console.error);\n        return this.connectionPromise;\n    }\n    _buildConfig(config, session) {\n        if (!session) return new Promise((resolve)=>resolve(config));\n        const client = new ApiClient({\n            server: `${config.host}:${String(config.port || 443)}`\n        });\n        client.setToken(session.token);\n        client.setRefreshToken(session.refreshToken);\n        return client.confd.getUserLineSipFromToken(session.uuid).then((sipLine)=>({\n                authorizationUser: sipLine.username,\n                password: sipLine.secret,\n                uri: `${sipLine.username}@${config.host}`,\n                ...config\n            }));\n    }\n    _createUaOptions(uaOptionsOverrides = {}) {\n        let { host } = this.config;\n        let port = this.config.port || 443;\n        if (this.config.websocketSip) {\n            const webSocketSip = this.config.websocketSip.split(':');\n            [host] = webSocketSip;\n            port = Number(webSocketSip[1]);\n        }\n        const { userUuid } = this.config;\n        const uaOptions = {\n            noAnswerTimeout: NO_ANSWER_TIMEOUT,\n            authorizationUsername: this.config.authorizationUser,\n            authorizationPassword: this.config.password,\n            displayName: this.config.displayName,\n            hackIpInContact: true,\n            logBuiltinEnabled: this.config.log ? this.config.log.builtinEnabled : null,\n            logLevel: this.config.log ? this.config.log.logLevel : null,\n            logConnector: this.config.log ? this.config.log.connector : null,\n            uri: this._makeURI(this.config.authorizationUser || ''),\n            userAgentString: this.config.userAgentString || 'wazo-sdk',\n            reconnectionAttempts: 10000,\n            reconnectionDelay: 5,\n            sessionDescriptionHandlerFactory: (session, options = {})=>{\n                const uaLogger = session.userAgent.getLogger(\"sip.WazoSessionDescriptionHandler\");\n                const isWeb = this._isWeb();\n                const iceGatheringTimeout = 'peerConnectionOptions' in options ? options.peerConnectionOptions.iceGatheringTimeout || DEFAULT_ICE_TIMEOUT : DEFAULT_ICE_TIMEOUT;\n                const sdhOptions = {\n                    ...options,\n                    iceGatheringTimeout,\n                    peerConnectionConfiguration: {\n                        ...(0, peer_connection_configuration_default_namespaceObject.defaultPeerConnectionConfiguration)(),\n                        ...options.peerConnectionConfiguration || {}\n                    }\n                };\n                return new lib_WazoSessionDescriptionHandler(uaLogger, wazoMediaStreamFactory, sdhOptions, isWeb, session);\n            },\n            transportOptions: {\n                traceSip: uaOptionsOverrides?.traceSip || false,\n                wsServers: `wss://${host}:${port}/api/asterisk/ws${userUuid ? `?userUuid=${userUuid}` : ''}`\n            },\n            sessionDescriptionHandlerFactoryOptions: {\n                modifiers: [\n                    replaceLocalIpModifier\n                ],\n                alwaysAcquireMediaFirst: this.isFirefox(),\n                constraints: {\n                    audio: this._getAudioConstraints(),\n                    video: this._getVideoConstraints()\n                },\n                peerConnectionOptions: {\n                    iceCheckingTimeout: this.config.iceCheckingTimeout || 1000,\n                    iceGatheringTimeout: this.config.iceCheckingTimeout || 1000,\n                    rtcConfiguration: {\n                        rtcpMuxPolicy: 'require',\n                        iceServers: WebRTCClient.getIceServers(this.config.host),\n                        ...this._getRtcOptions(),\n                        ...uaOptionsOverrides?.peerConnectionOptions || {}\n                    }\n                },\n                peerConnectionConfiguration: {\n                    rtcpMuxPolicy: 'require',\n                    iceServers: WebRTCClient.getIceServers(this.config.host),\n                    ...uaOptionsOverrides?.peerConnectionOptions || {}\n                }\n            }\n        };\n        delete uaOptionsOverrides?.traceSip;\n        return {\n            ...uaOptions,\n            ...uaOptionsOverrides\n        };\n    }\n    _getRtcOptions() {\n        return {\n            mandatory: {\n                OfferToReceiveAudio: this._hasAudio(),\n                OfferToReceiveVideo: false\n            }\n        };\n    }\n    _setupSession(session) {\n        const sipSessionId = this.getSipSessionId(session);\n        if (!session.delegate) session.delegate = {};\n        session.delegate.onSessionDescriptionHandler = (sdh)=>{\n            sdh.on('error', (e)=>{\n                this.eventEmitter.emit(ON_ERROR, e);\n            });\n            sdh.peerConnectionDelegate = {\n                onicecandidateerror: (error)=>{\n                    web_rtc_client_logger.error('on icecandidate error', {\n                        address: error.address,\n                        port: error.port,\n                        errorCode: error.errorCode,\n                        errorText: error.errorText,\n                        url: error.url\n                    });\n                }\n            };\n        };\n        const oldInviteRequest = session.onInviteRequest.bind(session);\n        let hadRemoteVideo = false;\n        session.onInviteRequest = (request)=>{\n            hadRemoteVideo = this.hasARemoteVideoTrack(sipSessionId);\n            oldInviteRequest(request);\n        };\n        session.delegate.onInvite = async (request)=>{\n            let updatedCalleeName = null;\n            let updatedNumber = null;\n            if (session.assertedIdentity) {\n                updatedNumber = session.assertedIdentity.uri.normal.user;\n                updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;\n            }\n            web_rtc_client_logger.info('re-invite received', {\n                updatedCalleeName,\n                updatedNumber,\n                hadRemoteVideo\n            });\n            if (session instanceof lib_api_namespaceObject.Invitation) session.incomingInviteRequest.message.body = request.body;\n            else if (session instanceof lib_api_namespaceObject.Inviter && session.outgoingInviteRequest.message.body) session.outgoingInviteRequest.message.body.body = request.body;\n            this.updateRemoteStream(sipSessionId, false);\n            await this._setupMedias(session);\n            return this.eventEmitter.emit(ON_REINVITE, session, request, updatedCalleeName, updatedNumber, hadRemoteVideo);\n        };\n    }\n    async _onProgress(session, early = false) {\n        await this._setupMedias(session);\n        const sessionId = this.getSipSessionId(session);\n        this.updateRemoteStream(sessionId);\n        web_rtc_client_logger.info('progress received', {\n            sessionId,\n            early\n        });\n        this.eventEmitter.emit(early ? ON_EARLY_MEDIA : ON_PROGRESS, session);\n    }\n    async _onAccepted(session, sessionDialog, withEvent = true, initAllTracks = true) {\n        web_rtc_client_logger.info('on call accepted', {\n            id: this.getSipSessionId(session),\n            clientId: this.clientId,\n            remoteTag: session.remoteTag\n        });\n        this.storeSipSession(session);\n        await this._setupMedias(session);\n        this.updateRemoteStream(this.getSipSessionId(session), initAllTracks);\n        const pc = session.sessionDescriptionHandler?.peerConnection;\n        const onTrack = (event)=>{\n            const isAudioOnly = this._isAudioOnly(session);\n            const { kind, label, readyState, id, muted } = event.track;\n            web_rtc_client_logger.info('on track event', {\n                isAudioOnly,\n                kind,\n                label,\n                readyState,\n                id,\n                muted\n            });\n            if (isAudioOnly && 'video' === kind) event.track.stop();\n            this.eventEmitter.emit(ON_TRACK, session, event);\n        };\n        const sessionDescriptionHandler = session.sessionDescriptionHandler;\n        if (sessionDescriptionHandler?.peerConnection) sessionDescriptionHandler.peerConnection.addEventListener('track', onTrack);\n        sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;\n        if (pc) {\n            const currentSessionId = this.getSipSessionId(session);\n            pc.oniceconnectionstatechange = ()=>{\n                web_rtc_client_logger.info('on ice connection state changed', {\n                    state: pc.iceConnectionState,\n                    sessionId: currentSessionId\n                });\n                if ('disconnected' === pc.iceConnectionState) {\n                    const attempts = this.iceReconnectAttempts[currentSessionId] || 0;\n                    if (attempts < MAX_ICE_RECONNECT_ATTEMPTS) {\n                        this.eventEmitter.emit(ON_ICE_RECONNECTING, session);\n                        this.iceReconnectAttempts[currentSessionId] = attempts + 1;\n                        web_rtc_client_logger.info('ICE connection disconnected, attempting to reconnect...', {\n                            sessionId: currentSessionId,\n                            attempt: attempts + 1\n                        });\n                        const isConference = this.isConference(currentSessionId);\n                        setTimeout(()=>{\n                            this.reinvite(session, null, isConference, false, true);\n                        }, this.iceReconnectDelay);\n                    } else {\n                        web_rtc_client_logger.warn('ICE reconnection failed after max attempts', {\n                            sessionId: currentSessionId\n                        });\n                        this.eventEmitter.emit(ON_ICE_DISCONNECTED, session);\n                    }\n                } else if ('connected' === pc.iceConnectionState || 'completed' === pc.iceConnectionState) {\n                    if (this.iceReconnectAttempts[currentSessionId] > 0) {\n                        this.eventEmitter.emit(ON_ICE_RECONNECTED, session);\n                        web_rtc_client_logger.info('ICE reconnected successfully', {\n                            sessionId: currentSessionId\n                        });\n                    }\n                }\n            };\n        }\n        if (withEvent) this.eventEmitter.emit(web_rtc_client_ACCEPTED, session, sessionDialog);\n        this._startSendingStats(session);\n    }\n    _isAudioOnly(session) {\n        return Boolean(session.sessionDescriptionHandlerModifiersReInvite.find((modifier)=>modifier === modifiers_namespaceObject.stripVideo));\n    }\n    async _setupMedias(session, newStream = null) {\n        if (!this._isWeb()) {\n            web_rtc_client_logger.info('Setup media on mobile, no need to setup html element, bailing');\n            return;\n        }\n        const sessionId = this.getSipSessionId(session);\n        const isConference = this.isConference(sessionId);\n        if (sessionId in this.audioElements) {\n            web_rtc_client_logger.info('html element already exists for session', {\n                sessionId\n            });\n            return;\n        }\n        if (this._hasAudio() && this._isWeb() && !(sessionId in this.audioElements)) try {\n            await this.createAudioElementFor(sessionId);\n            web_rtc_client_logger.info('Audio element created successfully', {\n                sessionId\n            });\n        } catch (error) {\n            web_rtc_client_logger.error('Failed to create audio element', {\n                sessionId,\n                error\n            });\n        }\n        const audioElement = this.audioElements[sessionId];\n        if (!audioElement) {\n            web_rtc_client_logger.error('No audio element found after creation', {\n                sessionId\n            });\n            return;\n        }\n        const sipSession = this.sipSessions[session.callId];\n        const removeStream = this.getRemoteStream(sessionId);\n        const sdh = sipSession?.sessionDescriptionHandler;\n        const earlyStream = sdh ? sdh.remoteMediaStream : null;\n        const stream = newStream || removeStream || earlyStream;\n        if (!stream) {\n            web_rtc_client_logger.info('Setup media no stream to attach, bailing');\n            return;\n        }\n        const shouldPause = audioElement.currentTime > 0 && !audioElement.paused && !audioElement.ended && audioElement.readyState > 2;\n        web_rtc_client_logger.info('setting up media', {\n            sessionId,\n            streams: {\n                new: !!newStream,\n                remove: !!removeStream,\n                early: !!earlyStream\n            },\n            hasAudio: this._hasAudio(),\n            isConference,\n            shouldPause,\n            streamTracks: stream.getTracks().map((t)=>({\n                    kind: t.kind,\n                    enabled: t.enabled,\n                    muted: t.muted\n                }))\n        });\n        if (isConference) return;\n        if (shouldPause) audioElement.pause();\n        audioElement.srcObject = stream;\n        audioElement.volume = this.audioOutputVolume;\n        try {\n            audioElement.play();\n            web_rtc_client_logger.info('Audio element play() successful', {\n                sessionId\n            });\n        } catch (error) {\n            web_rtc_client_logger.error('Audio element play() failed', {\n                sessionId,\n                error: error.message\n            });\n        }\n    }\n    _cleanupMedia(session) {\n        const sessionId = this.getSipSessionId(session);\n        const localStream = this.getLocalStream(sessionId);\n        if (localStream) this._cleanupStream(localStream);\n        const cleanLocalElement = (id)=>{\n            const element = this.audioElements[id];\n            if (!element) return;\n            element.pause();\n            if (element.parentNode) element.parentNode.removeChild(element);\n            element.srcObject = null;\n            delete this.audioElements[id];\n        };\n        if (this._hasAudio() && this._isWeb()) {\n            if (session) cleanLocalElement(this.getSipSessionId(session));\n            else Object.keys(this.audioElements).forEach((id)=>cleanLocalElement(id));\n        }\n    }\n    _cleanupStream(stream) {\n        stream.getTracks().filter((track)=>track.enabled).forEach((track)=>track.stop());\n    }\n    _toggleAudio(session, muteAudio) {\n        const sdh = session.sessionDescriptionHandler;\n        const pc = sdh?.peerConnection || null;\n        if (!pc) return;\n        if (pc.getSenders) pc.getSenders().forEach((sender)=>{\n            if (sender && sender.track && 'audio' === sender.track.kind) sender.track.enabled = !muteAudio;\n        });\n        else pc.getLocalStreams().forEach((stream)=>{\n            stream.getAudioTracks().forEach((track)=>{\n                track.enabled = !muteAudio;\n            });\n        });\n    }\n    _toggleVideo(session, muteCamera) {\n        const sdh = session.sessionDescriptionHandler;\n        const pc = sdh?.peerConnection;\n        if (pc?.getSenders) pc.getSenders().forEach((sender)=>{\n            if (sender && sender.track && 'video' === sender.track.kind) sender.track.enabled = !muteCamera;\n        });\n        else pc.getLocalStreams().forEach((stream)=>{\n            stream.getVideoTracks().forEach((track)=>{\n                track.enabled = !muteCamera;\n            });\n        });\n    }\n    _getRemoteStream(pc) {\n        let remoteStream = null;\n        if (pc && pc.getReceivers) {\n            remoteStream = void 0 !== __webpack_require__.g && __webpack_require__.g.window && __webpack_require__.g.window.MediaStream ? new __webpack_require__.g.window.MediaStream() : new window.MediaStream();\n            pc.getReceivers().forEach((receiver)=>{\n                const { track } = receiver;\n                if (track && remoteStream) remoteStream.addTrack(track);\n            });\n        } else if (pc) [remoteStream] = pc.getRemoteStreams();\n        return remoteStream;\n    }\n    _cleanupRegister() {\n        if (this.registerer) {\n            this.registerer.stateChange.removeAllListeners();\n            this.registerer = null;\n        }\n    }\n    _startSendingStats(session) {\n        const sdh = session.sessionDescriptionHandler;\n        const pc = sdh.peerConnection;\n        if (!pc) return;\n        const sessionId = this.getSipSessionId(session);\n        external_getstats_default()(pc, (result)=>{\n            const { results, internal, nomore, ...stats } = result;\n            this.statsIntervals[sessionId] = nomore;\n            statsLogger.trace('stats', {\n                sessionId,\n                ...stats\n            });\n        }, SEND_STATS_DELAY);\n    }\n    _stopSendingStats(session) {\n        const sessionId = this.getSipSessionId(session);\n        web_rtc_client_logger.trace('Check for stopping stats', {\n            sessionId,\n            ids: Object.keys(this.statsIntervals)\n        });\n        if (sessionId in this.statsIntervals) {\n            web_rtc_client_logger.trace('Stop sending stats for call', {\n                sessionId\n            });\n            this.statsIntervals[sessionId]();\n            delete this.statsIntervals[sessionId];\n        }\n    }\n    _makeURI(target) {\n        return user_agent_namespaceObject.UserAgent.makeURI(`sip:${target}@${this.config.host}`);\n    }\n    async _disconnectTransport(force = false) {\n        const transport = this.userAgent?.transport;\n        if (force && transport) {\n            transport.disconnectResolve = ()=>{};\n            if (transport._ws) transport._ws.close(1000);\n            return;\n        }\n        if (transport && !transport.disconnectPromise) try {\n            await transport.disconnect();\n        } catch (e) {\n            web_rtc_client_logger.error('WebRTC transport disconnect, error', e);\n        }\n    }\n    async _fetchNetworkStats(sessionId) {\n        const session = this.getSipSession(sessionId);\n        const stats = session ? await this.getStats(session) : null;\n        if (!stats || !(sessionId in this.sessionNetworkStats)) return Promise.resolve(null);\n        const networkStats = {\n            audioBytesSent: 0,\n            videoBytesSent: 0,\n            videoBytesReceived: 0,\n            audioBytesReceived: 0\n        };\n        const nbStats = this.sessionNetworkStats[sessionId].length;\n        const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];\n        const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;\n        const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;\n        const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;\n        const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;\n        const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;\n        const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;\n        const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;\n        const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;\n        let audioBytesSent = 0;\n        let audioBytesReceived = 0;\n        let audioContentSent = 0;\n        let audioContentReceived = 0;\n        let videoBytesSent = 0;\n        let videoBytesReceived = 0;\n        let transportSent = 0;\n        let transportReceived = 0;\n        let packetsLost = 0;\n        stats.forEach((report)=>{\n            if ('outbound-rtp' === report.type && 'audio' === report.kind) {\n                audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);\n                audioContentSent += Number(report.bytesSent);\n            }\n            if ('remote-outbound-rtp' === report.type && 'audio' === report.kind) audioBytesSent += Number(report.bytesSent);\n            if ('outbound-rtp' === report.type && 'video' === report.kind) videoBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);\n            if ('inbound-rtp' === report.type && 'audio' === report.kind) {\n                packetsLost += Number(report.packetsLost);\n                networkStats.packetsReceived = Number(report.packetsReceived);\n                audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);\n                audioContentReceived += Number(report.bytesReceived);\n            }\n            if ('inbound-rtp' === report.type && 'video' === report.kind) videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);\n            if ('outbound-rtp' === report.type && 'video' === report.kind) {\n                if ('framesPerSecond' in report) networkStats.framesPerSecond = Number(report.framesPerSecond);\n                if ('framerateMean' in report) networkStats.framesPerSecond = Math.round(report.framerateMean);\n            }\n            if ('remote-inbound-rtp' === report.type && 'audio' === report.kind) {\n                packetsLost += Number(report.packetsLost);\n                networkStats.roundTripTime = Number(report.roundTripTime);\n                networkStats.jitter = Number(report.jitter);\n            }\n            if ('remote-inbound-rtp' === report.type && 'video' === report.kind) packetsLost += Number(report.packetsLost);\n            if ('transport' === report.type) {\n                transportSent += Number(report.bytesSent);\n                transportReceived += Number(report.bytesReceived);\n            }\n        });\n        networkStats.packetsLost = packetsLost;\n        networkStats.totalAudioBytesSent = audioBytesSent;\n        networkStats.audioBytesSent = audioBytesSent - lastAudioSent;\n        networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;\n        networkStats.audioBytesReceived = audioBytesReceived;\n        networkStats.totalAudioContentSent = audioContentSent;\n        networkStats.audioContentSent = audioContentSent - lastAudioContentSent;\n        networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;\n        networkStats.audioContentReceived = audioContentReceived;\n        networkStats.totalVideoBytesSent = videoBytesSent;\n        networkStats.videoBytesSent = videoBytesSent - lastVideoSent;\n        networkStats.totalVideoBytesReceived = videoBytesReceived;\n        networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;\n        networkStats.totalTransportSent = transportSent - lastTransportSent;\n        networkStats.transportSent = transportSent;\n        networkStats.totalTransportReceived = transportReceived;\n        networkStats.transportReceived = transportReceived - lastTransportReceived;\n        networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived + networkStats.transportSent;\n        if (this.sessionNetworkStats[sessionId]) {\n            this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);\n            if (sessionId in this.sessionNetworkStats) this.sessionNetworkStats[sessionId].push(networkStats);\n        }\n    }\n    async _accept(session, options = {}) {\n        if (session.state === session_state_namespaceObject.SessionState.Terminated || session.state === session_state_namespaceObject.SessionState.Terminating) {\n            const error = 'Trying to accept a terminated sipSession.';\n            web_rtc_client_logger.warn(error, {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            throw new Error(error);\n        }\n        if (session.state !== session_state_namespaceObject.SessionState.Initial) {\n            const error = 'Trying to accept a non Initial sipSession.';\n            web_rtc_client_logger.warn(error, {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            throw new Error(error);\n        }\n        if (!session.incomingInviteRequest.acceptable) {\n            const error = 'Trying to reject a non `acceptable` session';\n            web_rtc_client_logger.warn(error, {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            throw new Error(error);\n        }\n        try {\n            return await session.accept(options);\n        } catch (e) {\n            web_rtc_client_logger.warn('Session accept, error', e);\n        }\n    }\n    async _reject(session, options = {}) {\n        if (session.state !== session_state_namespaceObject.SessionState.Initial && session.state !== session_state_namespaceObject.SessionState.Establishing) {\n            web_rtc_client_logger.warn('Trying to reject a session in a wrong state', {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            return;\n        }\n        if (!session.incomingInviteRequest.rejectable) {\n            web_rtc_client_logger.warn('Trying to reject a non `rejectable` session', {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            return;\n        }\n        try {\n            return await session.reject(options);\n        } catch (e) {\n            web_rtc_client_logger.warn('Session reject, error', e);\n        }\n    }\n    async _cancel(session, options = {}) {\n        if (session.state !== session_state_namespaceObject.SessionState.Initial && session.state !== session_state_namespaceObject.SessionState.Establishing) {\n            web_rtc_client_logger.warn('Trying to cancel a session in a wrong state', {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            return;\n        }\n        try {\n            return await session.cancel(options);\n        } catch (e) {\n            web_rtc_client_logger.warn('Session cancel, error', e);\n        }\n    }\n    async _bye(session, options = {}) {\n        if (session.state !== session_state_namespaceObject.SessionState.Established) {\n            web_rtc_client_logger.warn('Trying to end a session in a wrong state', {\n                state: session.state,\n                sessionId: this.getSipSessionId(session)\n            });\n            return null;\n        }\n        try {\n            return await session.bye(options);\n        } catch (e) {\n            web_rtc_client_logger.warn('Session bye, error', e);\n        }\n        return null;\n    }\n    debugAudioStatus(sessionId) {\n        const audioElement = this.audioElements[sessionId];\n        const session = this.getSipSession(sessionId);\n        const remoteStream = this.getRemoteStream(sessionId);\n        const pc = this.getPeerConnection(sessionId);\n        return {\n            sessionId,\n            hasAudio: this._hasAudio(),\n            audioOutputVolume: this.audioOutputVolume,\n            audioOutputDeviceId: this.audioOutputDeviceId,\n            audioElement: audioElement ? {\n                exists: true,\n                paused: audioElement.paused,\n                ended: audioElement.ended,\n                readyState: audioElement.readyState,\n                currentTime: audioElement.currentTime,\n                volume: audioElement.volume,\n                srcObject: !!audioElement.srcObject,\n                muted: audioElement.muted\n            } : {\n                exists: false\n            },\n            session: session ? {\n                exists: true,\n                state: session.state,\n                hasSdh: !!session.sessionDescriptionHandler\n            } : {\n                exists: false\n            },\n            remoteStream: remoteStream ? {\n                exists: true,\n                tracks: remoteStream.getTracks().map((t)=>({\n                        kind: t.kind,\n                        enabled: t.enabled,\n                        muted: t.muted,\n                        readyState: t.readyState\n                    }))\n            } : {\n                exists: false\n            },\n            peerConnection: pc ? {\n                exists: true,\n                iceConnectionState: pc.iceConnectionState,\n                connectionState: pc.connectionState,\n                signalingState: pc.signalingState\n            } : {\n                exists: false\n            }\n        };\n    }\n}\nconst webrtc_transport = {\n    name: 'WebRTC Transport (WS) ~30s',\n    check: (server, session)=>new Promise((resolve, reject)=>{\n            const [host, port = 443] = server.split(':');\n            const client = new WebRTCClient({\n                host,\n                port,\n                media: {\n                    audio: true\n                }\n            }, session);\n            const handleError = (message)=>{\n                client.close();\n                reject(new Error(message));\n            };\n            const handleSuccess = async ()=>{\n                client.stopHeartbeat();\n                await client.close();\n                resolve();\n            };\n            client.on(client.TRANSPORT_ERROR, (error)=>{\n                handleError(`Transport error : ${error}`);\n            });\n            client.on(client.REGISTERED, ()=>{\n                client.setOnHeartbeatTimeout(()=>{\n                    handleError('No response to heartbeat');\n                });\n                client.setOnHeartbeatCallback(()=>{\n                    handleSuccess();\n                });\n                client.startHeartbeat();\n            });\n        })\n};\nconst webrtc = {\n    name: 'WebRTC',\n    check: (server, session)=>new Promise((resolve, reject)=>{\n            if ('undefined' == typeof MediaStream) return resolve('Skipped on node');\n            const [host, port = 443] = server.split(':');\n            const client = new WebRTCClient({\n                host,\n                port,\n                media: {\n                    audio: true\n                }\n            }, session);\n            const handleError = (message)=>{\n                client.close();\n                reject(new Error(message));\n            };\n            const handleSuccess = async ()=>{\n                client.stopHeartbeat();\n                await client.close();\n                resolve();\n            };\n            client.on(client.TRANSPORT_ERROR, (error)=>{\n                handleError(`Transport error : ${error}`);\n            });\n            client.on(client.REGISTERED, ()=>{\n                const sipSession = client.call('*10');\n                if (!sipSession || !client.getSipSessionId(sipSession)) return handleError('Unable to make call through WebRTC');\n                setTimeout(()=>{\n                    client.hangup(sipSession);\n                    handleSuccess();\n                }, 1000);\n            });\n        })\n};\nconst webrtc_parseCandidate = (line)=>{\n    let parts;\n    parts = 0 === line.indexOf('a=candidate:') ? line.substring(12).split(' ') : line.substring(10).split(' ');\n    const candidate = {\n        foundation: parts[0],\n        component: parts[1],\n        protocol: parts[2].toLowerCase(),\n        priority: parseInt(parts[3], 10),\n        ip: parts[4],\n        port: parseInt(parts[5], 10),\n        type: parts[7]\n    };\n    for(let i = 8; i < parts.length; i += 2)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        default:\n            break;\n    }\n    return candidate;\n};\nconst timeoutDuration = 8000;\nconst symmetric_nat = {\n    name: 'Symmetric NAT',\n    check: ()=>new Promise((resolve, reject)=>{\n            if ('undefined' == typeof MediaStream) return resolve('Skipped on node');\n            const candidates = {};\n            const rawCandidates = [];\n            let nbCandidates = 0;\n            const pc = new RTCPeerConnection({\n                iceServers: [\n                    {\n                        urls: 'stun:stun.wazo.io:443'\n                    },\n                    {\n                        urls: 'stun:stun1.l.google.com:19302'\n                    },\n                    {\n                        urls: 'stun:stun2.l.google.com:19302'\n                    }\n                ]\n            });\n            let timeout;\n            const onEnded = ()=>{\n                clearTimeout(timeout);\n                if (0 === Object.keys(candidates).length) {\n                    reject(new Error(`Timed out (${timeoutDuration}ms), ${nbCandidates} candidates : ${rawCandidates.join(', ')}`));\n                    return;\n                }\n                const ports = candidates[Object.keys(candidates)[0]];\n                if (1 === ports.length) resolve();\n                else reject(new Error('Symmetric NAT detected, you should use a TURN server.'));\n            };\n            timeout = setTimeout(onEnded, timeoutDuration);\n            pc.createDataChannel('wazo-check-nat');\n            pc.onicecandidate = (e)=>{\n                nbCandidates++;\n                if (e.candidate) rawCandidates.push(e.candidate.candidate);\n                if (e.candidate && -1 !== e.candidate.candidate.indexOf('srflx')) {\n                    const cand = webrtc_parseCandidate(e.candidate.candidate);\n                    if (cand.relatedPort) {\n                        if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];\n                        candidates[cand.relatedPort].push(cand.port);\n                    }\n                } else if (!e.candidate) onEnded();\n            };\n            pc.createOffer().then((offer)=>pc.setLocalDescription(offer));\n        })\n};\nconst checkIsIPV4 = (ip)=>{\n    const blocks = ip.split('.');\n    if (4 !== blocks.length) return false;\n    return blocks.every((block)=>parseInt(block, 10) >= 0 && parseInt(block, 10) <= 255);\n};\nconst ice_ipv4 = {\n    name: 'Non IP v4 ice',\n    check: (server, session, externalAppConfig)=>new Promise((resolve, reject)=>{\n            if ('undefined' == typeof MediaStream) {\n                resolve('Skipped on node');\n                return;\n            }\n            const mobile = utils_isMobile();\n            const offerOptions = {\n                offerToReceiveAudio: 1\n            };\n            const ips = [];\n            const config = {\n                iceServers: [\n                    {\n                        urls: 'stun:stun1.l.google.com:19302'\n                    },\n                    {\n                        urls: 'stun:stun2.l.google.com:19302'\n                    }\n                ]\n            };\n            let hasSrflxOrRelay = false;\n            if (externalAppConfig && externalAppConfig.stun_servers) config.iceServers = {\n                ...externalAppConfig.stun_servers.split(',').map((url)=>({\n                        urls: url\n                    })),\n                ...config.iceServers\n            };\n            if (externalAppConfig && externalAppConfig.turn_servers) {\n                config.iceServers = [\n                    ...JSON.parse(externalAppConfig.turn_servers),\n                    ...config.iceServers || []\n                ];\n                config.iceTransportPolicy = 'relay';\n            }\n            const pc = new RTCPeerConnection(config);\n            pc.createDataChannel('wazo-check-ipv4');\n            pc.onicecandidate = (e)=>{\n                if (e.candidate) {\n                    const rawCandidate = e.candidate.candidate;\n                    if (-1 !== rawCandidate.indexOf('srflx') || -1 !== rawCandidate.indexOf('relay')) {\n                        hasSrflxOrRelay = true;\n                        const candidate = webrtc_parseCandidate(e.candidate.candidate);\n                        ips.push(candidate.ip);\n                    }\n                } else if (!e.candidate) {\n                    if (!hasSrflxOrRelay) return reject(new Error('No `srflx` or `relay` found in candidate. Please consider using a TURN server.'));\n                    if (ips.every(checkIsIPV4)) resolve(null);\n                    else {\n                        const nonIPV4 = ips.find((ip)=>!checkIsIPV4(ip));\n                        reject(new Error(`Non IPv4 ice candidate found : ${nonIPV4}.`));\n                    }\n                }\n            };\n            pc.createOffer(offerOptions).then((offer)=>pc.setLocalDescription(offer)).then((description)=>mobile ? pc.createOffer(offerOptions) : description).then((sessionDescription)=>mobile ? pc.setLocalDescription(sessionDescription) : sessionDescription);\n        })\n};\nconst checks = [\n    checks_aor,\n    api,\n    wazo_websocket,\n    webrtc_transport,\n    webrtc,\n    symmetric_nat,\n    ice_ipv4\n];\nconst Checker_logger = IssueReporter.loggerFor('engine-check');\nclass Checker {\n    session;\n    server;\n    externalAppConfig;\n    checks;\n    constructor(server, session, externalAppConfig = {}){\n        this.server = server;\n        this.session = session;\n        this.externalAppConfig = externalAppConfig;\n        this.checks = [\n            ...checks\n        ];\n    }\n    async check(onCheckBegin = ()=>{}, onCheckResult = ()=>{}) {\n        await this._addEngineVersion();\n        Checker_logger.info('Engine check starting');\n        for(let i = 0; i < this.checks.length; i++){\n            const { name, check } = this.checks[i];\n            Checker_logger.info(`Checking ${name} ...`);\n            onCheckBegin(name);\n            try {\n                const result = await check(this.server, this.session, this.externalAppConfig);\n                Checker_logger.info(`Checking ${name} success.`, {\n                    result\n                });\n                onCheckResult(name, result);\n            } catch (e) {\n                Checker_logger.info(`Checking ${name} failure`, {\n                    message: e.message\n                });\n                onCheckResult(name, e);\n            }\n        }\n        Checker_logger.info('Engine check done.');\n    }\n    addCheck(check) {\n        this.checks.push(check);\n    }\n    async _addEngineVersion() {\n        if (!this.session.engineVersion) {\n            const apiClient = new ApiClient({\n                server: this.server\n            });\n            apiClient.setToken(this.session.token);\n            const { wazo_version: engineVersion } = await apiClient.confd.getInfos();\n            this.session.engineVersion = engineVersion;\n        }\n    }\n}\nconst checker_Checker = Checker;\nconst FEATURES = [\n    'chat',\n    'video',\n    'call_recording',\n    'fax',\n    'mobile_double_call',\n    'mobile_gsm',\n    'meeting',\n    'caller_id'\n];\nconst getScopeName = (featureName)=>`enterprise.app.${featureName}`;\nconst scopesToCheck = FEATURES.map(getScopeName);\nclass Features {\n    _hasChat;\n    _hasVideo;\n    _hasCallRecording;\n    _hasFax;\n    _hasMobileDoubleCall;\n    _hasMobileGsm;\n    _hasMeeting;\n    _hasCallerID;\n    constructor(){\n        this._hasChat = true;\n        this._hasVideo = true;\n        this._hasCallRecording = true;\n        this._hasFax = true;\n        this._hasMobileDoubleCall = true;\n        this._hasMobileGsm = true;\n        this._hasMeeting = true;\n        this._hasCallerID = false;\n    }\n    async fetchAccess() {\n        let response;\n        try {\n            response = await service_getApiClient().auth.getRestrictionPolicies(scopesToCheck);\n        } catch (_) {}\n        if (!response) return;\n        const { scopes } = response;\n        this._hasChat = this._hasFeatures(scopes, 'chat');\n        this._hasVideo = this._hasFeatures(scopes, 'video');\n        this._hasCallRecording = this._hasFeatures(scopes, 'call_recording');\n        this._hasFax = this._hasFeatures(scopes, 'fax');\n        this._hasMobileDoubleCall = this._hasFeatures(scopes, 'mobile_double_call');\n        this._hasMobileGsm = this._hasFeatures(scopes, 'mobile_gsm');\n        this._hasMeeting = this._hasFeatures(scopes, 'meeting');\n        this._hasCallerID = this._hasFeatures(scopes, 'caller_id');\n    }\n    hasChat() {\n        return this._hasChat;\n    }\n    hasVideo() {\n        return this._hasVideo;\n    }\n    hasCallRecording() {\n        return this._hasCallRecording;\n    }\n    hasFax() {\n        return this._hasFax;\n    }\n    hasMobileDoubleCall() {\n        return this._hasMobileDoubleCall;\n    }\n    hasMobileGsm() {\n        return this._hasMobileGsm;\n    }\n    hasMeeting() {\n        return this._hasMeeting;\n    }\n    hasCallerID() {\n        return this._hasCallerID;\n    }\n    _hasFeatures(scopes, featureName) {\n        const scopeName = getScopeName(featureName);\n        if (!scopes || !(scopeName in scopes)) return true;\n        return true === scopes[scopeName];\n    }\n}\nconst domain_Features = new Features();\nclass NotificationOptions {\n    sound;\n    vibration;\n    static parse(plain) {\n        if (!plain) return new NotificationOptions({\n            sound: true,\n            vibration: true\n        });\n        return new NotificationOptions({\n            sound: plain.sound,\n            vibration: plain.vibration\n        });\n    }\n    static newFrom(profile) {\n        return new_from(profile, NotificationOptions);\n    }\n    constructor({ sound, vibration } = {\n        sound: true,\n        vibration: true\n    }){\n        this.sound = sound;\n        this.vibration = vibration;\n    }\n    setSound(sound) {\n        this.sound = sound;\n        return this;\n    }\n    setVibration(vibration) {\n        this.vibration = vibration;\n        return this;\n    }\n    enable() {\n        this.vibration = true;\n        this.sound = true;\n        return this;\n    }\n    disable() {\n        this.vibration = false;\n        this.sound = false;\n        return this;\n    }\n    isEnabled() {\n        return this.sound || this.vibration;\n    }\n}\nconst ON_USER_AGENT = 'onUserAgent';\nconst ON_REGISTERED = 'onRegistered';\nconst ON_UNREGISTERED = 'onUnRegistered';\nconst WebRTCPhone_ON_PROGRESS = 'onProgress';\nconst ON_CALL_ACCEPTED = 'onCallAccepted';\nconst ON_CALL_ANSWERED = 'onCallAnswered';\nconst ON_CALL_INCOMING = 'onCallIncoming';\nconst ON_CALL_OUTGOING = 'onCallOutgoing';\nconst ON_CALL_MUTED = 'onCallMuted';\nconst ON_CALL_UNMUTED = 'onCallUnmuted';\nconst ON_CALL_RESUMED = 'onCallResumed';\nconst ON_CALL_HELD = 'onCallHeld';\nconst ON_CALL_UNHELD = 'onCallUnHeld';\nconst ON_CAMERA_DISABLED = 'onCameraDisabled';\nconst ON_CAMERA_RESUMED = 'onCameraResumed';\nconst ON_CALL_CANCELED = 'onCallCanceled';\nconst ON_CALL_FAILED = 'onCallFailed';\nconst ON_CALL_REJECTED = 'onCallRejected';\nconst ON_CALL_ENDED = 'onCallEnded';\nconst ON_CALL_ENDING = 'onCallEnding';\nconst ON_MESSAGE = 'onMessage';\nconst WebRTCPhone_ON_REINVITE = 'reinvite';\nconst WebRTCPhone_ON_TRACK = 'onTrack';\nconst ON_AUDIO_STREAM = 'onAudioStream';\nconst ON_VIDEO_STREAM = 'onVideoStream';\nconst ON_REMOVE_STREAM = 'onRemoveStream';\nconst ON_SHARE_SCREEN_STARTED = 'onScreenShareStarted';\nconst ON_SHARE_SCREEN_ENDING = 'onScreenShareEnding';\nconst ON_SHARE_SCREEN_ENDED = 'onScreenShareEnded';\nconst ON_TERMINATE_SOUND = 'terminateSound';\nconst ON_PLAY_RING_SOUND = 'playRingingSound';\nconst ON_PLAY_INBOUND_CALL_SIGNAL_SOUND = 'playInboundCallSignalSound';\nconst ON_PLAY_HANGUP_SOUND = 'playHangupSound';\nconst ON_PLAY_PROGRESS_SOUND = 'playProgressSound';\nconst ON_VIDEO_INPUT_CHANGE = 'videoInputChange';\nconst ON_CALL_ERROR = 'onCallError';\nconst ON_MESSAGE_TRACK_UPDATED = 'onTrackUpdated';\nconst WebRTCPhone_ON_NETWORK_STATS = 'onNetworkStats';\nconst ON_CHAT = 'phone/ON_CHAT';\nconst ON_SIGNAL = 'phone/ON_SIGNAL';\nconst WebRTCPhone_ON_ICE_DISCONNECTED = 'onIceDisconnected';\nconst WebRTCPhone_ON_ICE_RECONNECTING = 'onIceReconnecting';\nconst WebRTCPhone_ON_ICE_RECONNECTED = 'onIceReconnected';\nconst WebRTCPhone_ON_EARLY_MEDIA = 'onEarlyMedia';\nconst MESSAGE_TYPE_CHAT = 'message/TYPE_CHAT';\nconst MESSAGE_TYPE_SIGNAL = 'message/TYPE_SIGNAL';\nconst WebRTCPhone_events = [\n    ON_USER_AGENT,\n    ON_REGISTERED,\n    ON_UNREGISTERED,\n    WebRTCPhone_ON_PROGRESS,\n    ON_CALL_ACCEPTED,\n    ON_CALL_ANSWERED,\n    ON_CALL_INCOMING,\n    ON_CALL_OUTGOING,\n    ON_CALL_MUTED,\n    ON_CALL_UNMUTED,\n    ON_CALL_RESUMED,\n    ON_CALL_HELD,\n    ON_CALL_UNHELD,\n    ON_CAMERA_DISABLED,\n    ON_CALL_FAILED,\n    ON_CALL_ENDED,\n    ON_CALL_REJECTED,\n    ON_MESSAGE,\n    WebRTCPhone_ON_REINVITE,\n    WebRTCPhone_ON_TRACK,\n    ON_AUDIO_STREAM,\n    ON_VIDEO_STREAM,\n    ON_REMOVE_STREAM,\n    ON_SHARE_SCREEN_ENDED,\n    ON_TERMINATE_SOUND,\n    ON_PLAY_RING_SOUND,\n    ON_PLAY_INBOUND_CALL_SIGNAL_SOUND,\n    ON_PLAY_HANGUP_SOUND,\n    ON_PLAY_PROGRESS_SOUND,\n    ON_VIDEO_INPUT_CHANGE,\n    ON_SHARE_SCREEN_STARTED,\n    ON_CALL_ERROR,\n    ON_CHAT,\n    ON_SIGNAL,\n    WebRTCPhone_ON_NETWORK_STATS,\n    WebRTCPhone_ON_ICE_DISCONNECTED,\n    WebRTCPhone_ON_ICE_RECONNECTING,\n    WebRTCPhone_ON_ICE_RECONNECTED,\n    WebRTCPhone_ON_EARLY_MEDIA\n];\nconst WebRTCPhone_logger = IssueReporter.loggerFor('webrtc-phone');\nclass WebRTCPhone extends Emitter {\n    client;\n    allowVideo;\n    callSessions;\n    incomingSessions;\n    currentSipSession;\n    currentCallSession;\n    audioOutputDeviceId;\n    audioRingDeviceId;\n    audioOutputVolume;\n    audioRingVolume;\n    ringingEnabled;\n    acceptedSessions;\n    rejectedSessions;\n    ignoredSessions;\n    currentScreenShare;\n    lastScreenShare;\n    shouldSendReinvite;\n    constructor(client, audioOutputDeviceId, allowVideo = false, audioRingDeviceId){\n        super();\n        this.client = client;\n        this.allowVideo = allowVideo;\n        this.callSessions = {};\n        this.audioOutputDeviceId = audioOutputDeviceId;\n        this.audioRingDeviceId = audioRingDeviceId || audioOutputDeviceId;\n        this.audioOutputVolume = 1;\n        this.audioRingVolume = 1;\n        this.incomingSessions = [];\n        this.ringingEnabled = true;\n        this.shouldSendReinvite = false;\n        this.bindClientEvents();\n        this.acceptedSessions = {};\n        this.rejectedSessions = {};\n        this.ignoredSessions = {};\n    }\n    register() {\n        WebRTCPhone_logger.info('WebRTC register', {\n            client: !!this.client\n        });\n        if (!this.client) return Promise.resolve();\n        return this.client.register().then(()=>{\n            WebRTCPhone_logger.info('WebRTC register, registered');\n            return this.bindClientEvents();\n        }).catch((error)=>{\n            console.error('register error', error, error.message, error.stack);\n            WebRTCPhone_logger.error('WebRTC register error', {\n                message: error.message,\n                stack: error.stack\n            });\n        });\n    }\n    unregister() {\n        if (!this.client || !this.client.isRegistered()) return null;\n        return this.client.unregister();\n    }\n    stop() {\n        if (!this.client) return;\n        WebRTCPhone_logger.info('WebRTC phone stop');\n        this.client.stop();\n    }\n    removeIncomingSessions(id) {\n        this.incomingSessions = this.incomingSessions.filter((sessionId)=>sessionId !== id);\n    }\n    isWebRTC() {\n        return true;\n    }\n    async sendReinvite(callSession, constraints = null, conference = false, audioOnly = false, iceRestart = false) {\n        const sipSession = this.findSipSession(callSession);\n        WebRTCPhone_logger.info('WebRTC phone - send reinvite', {\n            sessionId: this.getSipSessionId(sipSession),\n            constraints,\n            audioOnly,\n            conference,\n            iceRestart\n        });\n        if (!sipSession) return;\n        const shouldScreenShare = constraints?.screen;\n        const isUpgrade = shouldScreenShare || constraints?.video;\n        if (constraints && !isUpgrade) {\n            this._downgradeToAudio(callSession);\n            return;\n        }\n        if (isUpgrade) {\n            const shouldReinvite = await this._upgradeToVideo(callSession, constraints, conference);\n            if (!shouldReinvite) return;\n        }\n        return this.client.reinvite(sipSession, constraints, conference, audioOnly, iceRestart);\n    }\n    getUserAgent() {\n        return this.client?.config?.userAgentString || 'webrtc-phone';\n    }\n    startHeartbeat() {\n        WebRTCPhone_logger.info('WebRTC phone - start heartbeat', {\n            client: !!this.client,\n            hasHeartbeat: this.client.hasHeartbeat()\n        });\n        if (!this.client || this.client.hasHeartbeat()) return;\n        this.client.startHeartbeat();\n    }\n    stopHeartbeat() {\n        WebRTCPhone_logger.info('WebRTC phone - stopHeartbeat', {\n            client: !!this.client\n        });\n        if (!this.client) return;\n        this.client.stopHeartbeat();\n    }\n    setOnHeartbeatTimeout(cb) {\n        this.client.setOnHeartbeatTimeout(cb);\n    }\n    setOnHeartbeatCallback(cb) {\n        this.client.setOnHeartbeatCallback(cb);\n    }\n    reconnect() {\n        WebRTCPhone_logger.info('WebRTC phone - reconnect', {\n            client: !!this.client\n        });\n        if (!this.client) return;\n        this.client.attemptReconnection();\n    }\n    getOptions() {\n        return {\n            accept: true,\n            decline: true,\n            mute: true,\n            hold: true,\n            transfer: true,\n            sendKey: true,\n            addParticipant: false,\n            record: true,\n            merge: true\n        };\n    }\n    onConnect() {\n        if (!this.client) return Promise.reject(new Error('No webrtc client'));\n        return this.client.onConnect();\n    }\n    onDisconnect() {\n        if (!this.client) return Promise.reject(new Error('No webrtc client'));\n        return this.client.onDisconnect();\n    }\n    _downgradeToAudio(callSession, withMessage = true) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return false;\n        WebRTCPhone_logger.info('Downgrade to audio', {\n            id: callSession ? callSession.getId() : null,\n            withMessage\n        });\n        this.client.downgradeToAudio(sipSession);\n        if (callSession) {\n            callSession.cameraEnabled = false;\n            this._updateCallSession(callSession);\n        }\n        if (withMessage) this._sendReinviteMessage(callSession, false);\n        return true;\n    }\n    async _upgradeToVideo(callSession, constraints, isConference) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return Promise.resolve(false);\n        WebRTCPhone_logger.info('Upgrade to video', {\n            id: callSession ? callSession.getId() : null,\n            constraints,\n            isConference\n        });\n        const shouldScreenShare = constraints && !!constraints.screen;\n        const desktop = constraints && constraints.desktop;\n        const options = sipSession.sessionDescriptionHandlerOptionsReInvite;\n        const wasAudioOnly = options?.audioOnly;\n        const newStream = await this.client.upgradeToVideo(sipSession, constraints, isConference);\n        if (callSession) {\n            callSession.cameraEnabled = true;\n            this._updateCallSession(callSession);\n        }\n        if (!newStream) return true;\n        this._sendReinviteMessage(callSession, true);\n        if (shouldScreenShare) this._onScreenSharing(newStream, sipSession, callSession, false, desktop);\n        if (isConference && wasAudioOnly) return true;\n        return false;\n    }\n    _sendReinviteMessage(callSession, isUpgrade) {\n        const sipSession = this.findSipSession(callSession);\n        WebRTCPhone_logger.info('Sending reinvite message', {\n            id: callSession ? callSession.getId() : null,\n            isUpgrade\n        });\n        setTimeout(()=>{\n            this.sendMessage(sipSession, JSON.stringify({\n                type: MESSAGE_TYPE_SIGNAL,\n                content: {\n                    type: ON_MESSAGE_TRACK_UPDATED,\n                    update: isUpgrade ? 'upgrade' : 'downgrade',\n                    sipCallId: sipSession && this.getSipSessionId(sipSession),\n                    callId: callSession ? callSession.callId : null,\n                    number: callSession ? callSession.number : null,\n                    callerNumber: callSession ? callSession.callerNumber : null\n                }\n            }));\n        }, 2500);\n    }\n    _bindEvents(sipSession) {\n        const sipSessionId = this.getSipSessionId(sipSession);\n        if (sipSession instanceof lib_api_namespaceObject.Invitation) {\n            const onCancel = sipSession._onCancel.bind(sipSession);\n            sipSession._onCancel = (message)=>{\n                WebRTCPhone_logger.trace('on sip session canceled', {\n                    callId: message.callId,\n                    sipSessionId\n                });\n                onCancel(message);\n                const elsewhere = -1 !== message.data.indexOf('cause=26') && -1 !== message.data.indexOf('completed elsewhere');\n                const callSession = this._createCallSession(sipSession);\n                if (sipSessionId) delete this.callSessions[sipSessionId];\n                this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);\n            };\n        }\n        sipSession.stateChange.addListener((newState)=>{\n            switch(newState){\n                case session_state_namespaceObject.SessionState.Terminating:\n                    WebRTCPhone_logger.info('WebRTC phone - call terminating', {\n                        sipId: this.getSipSessionId(sipSession)\n                    });\n                    this.eventEmitter.emit(ON_CALL_ENDING, this._createCallSession(sipSession));\n                    break;\n                case session_state_namespaceObject.SessionState.Terminated:\n                    {\n                        WebRTCPhone_logger.info('WebRTC phone - call terminated', {\n                            sipId: this.getSipSessionId(sipSession)\n                        });\n                        const callSession = this._createCallSession(sipSession);\n                        callSession.endTime = new Date();\n                        const wasCurrentSession = this._onCallTerminated(sipSession);\n                        return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);\n                    }\n                default:\n                    break;\n            }\n        });\n        if (!sipSession.sessionDescriptionHandler) return;\n        const sdh = sipSession.sessionDescriptionHandler;\n        const peerConnection = sdh.peerConnection;\n        if (!peerConnection) {\n            WebRTCPhone_logger.info('null peer connection');\n            return;\n        }\n        peerConnection.ontrack = (rawEvent)=>{\n            const event = rawEvent;\n            const [stream] = event.streams;\n            const kind = event && event.track && event.track.kind;\n            WebRTCPhone_logger.info('on track stream called on the peer connection', {\n                callId: this.getSipSessionId(sipSession),\n                streamId: stream ? stream.id : null,\n                tracks: stream ? stream.getTracks() : null,\n                kind\n            });\n            if ('audio' === kind) return this.eventEmitter.emit(ON_AUDIO_STREAM, stream);\n            return this.eventEmitter.emit(ON_VIDEO_STREAM, stream, event.track.id, event, sipSession);\n        };\n        peerConnection.onremovestream = (event)=>{\n            WebRTCPhone_logger.info('on remove stream called on the peer connection', {\n                id: event.stream.id,\n                tracks: event.stream.getTracks()\n            });\n            this.eventEmitter.emit(ON_REMOVE_STREAM, event.stream);\n        };\n    }\n    async startScreenSharing(constraints, callSession) {\n        WebRTCPhone_logger.info('WebRTC - start screen sharing', {\n            constraints,\n            id: callSession ? callSession.getId() : null\n        });\n        const screenShareStream = await this.client.getStreamFromConstraints(constraints);\n        if (!screenShareStream) throw new Error(`Can't create media stream for screensharing with: ${JSON.stringify(constraints)}`);\n        const screenTrack = screenShareStream.getVideoTracks()[0];\n        const sipSession = this.currentSipSession;\n        const pc = sipSession && this.client.getPeerConnection(this.getSipSessionId(sipSession));\n        const sender = pc && pc.getSenders && pc.getSenders().find((s)=>s && s.track && 'video' === s.track.kind);\n        const localStream = sipSession && this.client.getLocalStream(this.getSipSessionId(sipSession));\n        const videoTrack = localStream ? localStream.getTracks().find((track)=>'video' === track.kind) : null;\n        const hadVideo = !!videoTrack;\n        if (videoTrack && localStream) {\n            videoTrack.enabled = false;\n            videoTrack.stop();\n            localStream.removeTrack(videoTrack);\n        }\n        if (localStream) localStream.addTrack(screenTrack);\n        if (sender) sender.replaceTrack(screenTrack);\n        this._onScreenSharing(screenShareStream, sipSession, callSession, hadVideo, constraints.desktop);\n        return screenShareStream;\n    }\n    async stopScreenSharing(restoreLocalStream = true, callSession) {\n        if (!this.currentScreenShare) return;\n        WebRTCPhone_logger.info('WebRTC phone - stop screen sharing', {\n            restoreLocalStream\n        });\n        let reinvited = null;\n        try {\n            if (this.currentScreenShare.stream) this.currentScreenShare.stream.getTracks().filter((track)=>track.enabled && 'video' === track.kind).forEach((track)=>track.stop());\n            if (restoreLocalStream) {\n                const targetCallSession = callSession || this.currentCallSession;\n                const conference = this.isConference(targetCallSession);\n                const screenshareStopped = this.currentScreenShare.hadVideo;\n                const constraints = {\n                    audio: false,\n                    video: screenshareStopped\n                };\n                this._downgradeToAudio(targetCallSession, false);\n                await new Promise((resolve)=>setTimeout(resolve, 500));\n                reinvited = await this.sendReinvite(targetCallSession, constraints, conference);\n            }\n        } catch (e) {\n            console.warn(e);\n        }\n        const sipSession = this.currentSipSession;\n        this.eventEmitter.emit(ON_SHARE_SCREEN_ENDED, callSession && sipSession ? this._createCallSession(sipSession, callSession, {\n            screensharing: false\n        }) : null);\n        this.currentScreenShare = null;\n        return reinvited;\n    }\n    _onScreenSharing(screenStream, sipSession, callSession, hadVideo, desktop) {\n        const screenTrack = screenStream.getVideoTracks()[0];\n        const sipSessionId = this.getSipSessionId(sipSession);\n        const pc = this.client.getPeerConnection(sipSessionId);\n        const sender = pc && pc.getSenders && pc.getSenders().find((s)=>s && s.track && 'video' === s.track.kind);\n        WebRTCPhone_logger.info('WebRTC phone - on screensharing', {\n            hadVideo,\n            id: this.getSipSessionId(sipSession),\n            screenTrack\n        });\n        if (screenTrack) screenTrack.onended = ()=>{\n            WebRTCPhone_logger.info('WebRTC phone - on screenshare ended', {\n                hadVideo,\n                id: this.getSipSessionId(sipSession),\n                screenTrack\n            });\n            this.eventEmitter.emit(ON_SHARE_SCREEN_ENDING, this._createCallSession(sipSession, callSession));\n        };\n        this.currentScreenShare = {\n            stream: screenStream,\n            hadVideo,\n            sender,\n            sipSessionId,\n            desktop\n        };\n        this.client.setLocalMediaStream(this.getSipSessionId(sipSession), screenStream);\n        this.eventEmitter.emit(ON_SHARE_SCREEN_STARTED, this._createCallSession(sipSession, callSession, {\n            screensharing: true\n        }), screenStream);\n    }\n    _onCallAccepted(sipSession, cameraEnabled) {\n        WebRTCPhone_logger.info('WebRTC phone - on call accepted', {\n            sipId: this.getSipSessionId(sipSession),\n            cameraEnabled\n        });\n        const callSession = this._createAcceptedCallSession(sipSession, cameraEnabled);\n        if (this.currentSipSession && !this.isCurrentCallSipSession(callSession)) {\n            WebRTCPhone_logger.info('WebRTC phone - on call accepted with another ongoing call, holding it', {\n                sipId: this.getSipSessionId(sipSession),\n                cameraEnabled\n            });\n            this.holdSipSession(this.currentSipSession, this.currentCallSession, true);\n        }\n        this.currentSipSession = sipSession;\n        this.currentCallSession = callSession;\n        this.eventEmitter.emit(ON_TERMINATE_SOUND, callSession, 'call accepted');\n        const sipSessionId = this.getSipSessionId(sipSession);\n        if (sipSessionId) this.removeIncomingSessions(sipSessionId);\n        callSession.answerTime = new Date();\n        this._updateCallSession(callSession);\n        this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);\n        return callSession;\n    }\n    async changeAudioDevice(id) {\n        WebRTCPhone_logger.info('WebRTC phone - change audio device', {\n            deviceId: id\n        });\n        this.audioOutputDeviceId = id;\n        return this.client.changeAudioOutputDevice(id);\n    }\n    createAudioElementFor(sessionId) {\n        return this.client.createAudioElementFor(sessionId);\n    }\n    changeRingDevice(id) {\n        WebRTCPhone_logger.info('WebRTC phone - changing ring device', {\n            id\n        });\n        this.audioRingDeviceId = id;\n    }\n    changeAudioVolume(volume) {\n        WebRTCPhone_logger.info('WebRTC phone - changing audio volume', {\n            volume\n        });\n        this.audioOutputVolume = volume;\n        this.client.changeAudioOutputVolume(volume);\n    }\n    changeRingVolume(volume) {\n        WebRTCPhone_logger.info('WebRTC phone - changing ring volume', {\n            volume\n        });\n        this.audioRingVolume = volume;\n    }\n    changeAudioInputDevice(id, force) {\n        WebRTCPhone_logger.info('WebRTC phone - changeAudio input device', {\n            deviceId: id\n        });\n        return this.client.changeAudioInputDevice(id, this.currentSipSession, force);\n    }\n    async changeVideoInputDevice(id) {\n        WebRTCPhone_logger.info('WebRTC phone - change video input device', {\n            deviceId: id\n        });\n        return this.client.changeVideoInputDevice(id, this.currentSipSession);\n    }\n    changeSessionVideoInputDevice(id) {\n        WebRTCPhone_logger.info('WebRTC phone - change session video input device', {\n            deviceId: id\n        });\n        return this.currentSipSession && this.client.changeSessionVideoInputDevice(id, this.currentSipSession);\n    }\n    _onCallTerminated(sipSession) {\n        const sipSessionId = this.getSipSessionId(sipSession);\n        WebRTCPhone_logger.info('WebRTC phone - on call terminated', {\n            sipId: this.getSipSessionId(sipSession),\n            sipSessionId,\n            ids: Object.keys(this.callSessions)\n        });\n        const callSession = this._createCallSession(sipSession);\n        const isCurrentSession = this.isCurrentCallSipSession(callSession);\n        const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());\n        const shouldRetrigger = isCurrentSession ? this.incomingSessions.length : isCurrentIncomingCall;\n        if (isCurrentIncomingCall) setTimeout(()=>{\n            this.eventEmitter.emit(ON_TERMINATE_SOUND, callSession, 'call terminated');\n        }, 5);\n        if (sipSessionId) {\n            this.removeIncomingSessions(sipSessionId);\n            delete this.callSessions[sipSessionId];\n        }\n        if (isCurrentSession) {\n            this.currentSipSession = void 0;\n            this.currentCallSession = void 0;\n        }\n        const hasIncomingCallSession = this.hasIncomingCallSession();\n        WebRTCPhone_logger.info('WebRTC phone - check to re-trigger incoming call', {\n            sipId: this.getSipSessionId(sipSession),\n            shouldRetrigger,\n            hasIncomingCallSession\n        });\n        this.client.onCallEnded(sipSession);\n        if (hasIncomingCallSession && shouldRetrigger) {\n            const nextCallSession = this.getIncomingCallSession();\n            setTimeout(()=>{\n                if (this.ringingEnabled) {\n                    if (this.currentCallSession) this.eventEmitter.emit(ON_PLAY_INBOUND_CALL_SIGNAL_SOUND, this.audioOutputDeviceId, this.audioOutputVolume, nextCallSession);\n                    else this.eventEmitter.emit(ON_PLAY_RING_SOUND, this.audioRingDeviceId, this.audioRingVolume, nextCallSession);\n                }\n                this.eventEmitter.emit(ON_CALL_INCOMING, nextCallSession, nextCallSession?.cameraEnabled);\n            }, 100);\n        }\n        if (callSession.getId() in this.ignoredSessions) return false;\n        if (!sipSession.isCanceled) setTimeout(()=>{\n            this.eventEmitter.emit(ON_PLAY_HANGUP_SOUND, this.audioOutputDeviceId, this.audioOutputVolume, callSession);\n        }, 10);\n        return isCurrentSession;\n    }\n    setActiveSipSession(callSession) {\n        const sipSessionId = this.findSipSession(callSession);\n        if (!sipSessionId) return;\n        this.currentSipSession = sipSessionId;\n        this.currentCallSession = callSession;\n    }\n    hasAnActiveCall() {\n        return !!this.currentSipSession;\n    }\n    hasActiveRemoteVideoStream() {\n        const sipSession = this.currentSipSession;\n        if (!sipSession) return false;\n        const sdh = sipSession.sessionDescriptionHandler;\n        const peerConnection = sdh.peerConnection;\n        const remoteStream = peerConnection.getRemoteStreams().find((stream)=>!!stream.getVideoTracks().length);\n        return remoteStream && remoteStream.getVideoTracks().some((track)=>!track.muted);\n    }\n    callCount() {\n        return Object.keys(this.callSessions).length;\n    }\n    isCurrentCallSipSession(callSession) {\n        if (!this.currentSipSession) return false;\n        return this.currentSipSession && this.getSipSessionId(this.currentSipSession) === callSession.getId();\n    }\n    hasVideo(callSession) {\n        return this.client.hasVideo(callSession.getId());\n    }\n    hasAVideoTrack(callSession) {\n        return this.client.hasAVideoTrack(callSession.getId());\n    }\n    getLocalStreamForCall(callSession) {\n        WebRTCPhone_logger.warn('WebRTCPhone.getLocalStreamForCall is deprecated, use WebRTCPhone.getLocalStream instead');\n        return this.getLocalStream(callSession);\n    }\n    getRemoteStreamForCall(callSession) {\n        WebRTCPhone_logger.warn('WebRTCPhone.getRemoteStreamForCall is deprecated, use WebRTCPhone.getRemoteStream instead');\n        return this.getRemoteVideoStream(callSession);\n    }\n    getRemoteStreamsForCall(callSession) {\n        WebRTCPhone_logger.warn('WebRTCPhone.getRemoteStreamsForCall is deprecated, use WebRTCPhone.getRemoteStreams instead');\n        return this.getRemoteStream(callSession);\n    }\n    accept(callSession, cameraEnabled) {\n        WebRTCPhone_logger.info('WebRTC phone - accept call', {\n            id: callSession ? callSession.getId() : 'n/a',\n            cameraEnabled\n        });\n        if (this.currentSipSession && !this.isCurrentCallSipSession(callSession)) this.holdSipSession(this.currentSipSession, this.currentCallSession, true);\n        if (!callSession) {\n            WebRTCPhone_logger.warn('no CallSession to accept.');\n            return Promise.resolve(null);\n        }\n        const sipSessionId = this.getSipSessionIdFromCallSession(callSession);\n        if (sipSessionId && !(sipSessionId in this.callSessions)) {\n            WebRTCPhone_logger.warn('Call session already ended or not found, can\\'t accept it.', {\n                sipSessionId\n            });\n            return Promise.resolve(null);\n        }\n        if (callSession.getId() in this.acceptedSessions) {\n            WebRTCPhone_logger.warn('CallSession already accepted.', {\n                id: callSession ? callSession.getId() : 'n/a'\n            });\n            return Promise.resolve(callSession.sipCallId);\n        }\n        this.shouldSendReinvite = false;\n        callSession.answerTime = new Date();\n        this._updateCallSession(callSession);\n        this.acceptedSessions[callSession.getId()] = true;\n        this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);\n        const sipSession = this.client.getSipSession(callSession.getId());\n        if (sipSession) {\n            WebRTCPhone_logger.info('accept call, session found', {\n                sipId: this.getSipSessionId(sipSession)\n            });\n            return this.client.answer(sipSession, !!this.allowVideo && cameraEnabled).then(()=>callSession.sipCallId).catch((e)=>{\n                WebRTCPhone_logger.error(e);\n                this.endCurrentCall(callSession);\n                throw e;\n            });\n        }\n        const error = 'No CallSession found to accept.';\n        WebRTCPhone_logger.warn(error, {\n            id: callSession ? callSession.getId() : 'n/a',\n            ids: this.client.getSipSessionIds()\n        });\n        if (callSession) this.eventEmitter.emit(ON_CALL_ERROR, new Error(error), callSession);\n        return Promise.resolve(null);\n    }\n    isAccepted(callSession) {\n        return callSession && callSession.getId() in this.acceptedSessions;\n    }\n    async reject(callSession) {\n        WebRTCPhone_logger.info('reject WebRTC called', {\n            id: callSession.getId()\n        });\n        this.eventEmitter.emit(ON_TERMINATE_SOUND, callSession, 'call rejected locally');\n        if (!callSession || callSession.getId() in this.rejectedSessions) return;\n        this.shouldSendReinvite = false;\n        this.rejectedSessions[callSession.getId()] = true;\n        const sipSession = this.findSipSession(callSession);\n        if (sipSession) {\n            WebRTCPhone_logger.info('WebRTC rejecting', {\n                sipId: this.getSipSessionId(sipSession)\n            });\n            this.client.hangup(sipSession);\n        }\n    }\n    async ignore(callSession) {\n        WebRTCPhone_logger.info('WebRTC ignore', {\n            id: callSession.getId()\n        });\n        this.eventEmitter.emit(ON_TERMINATE_SOUND, callSession, 'ignoring call');\n        this.ignoredSessions[callSession.getId()] = true;\n        callSession.ignore();\n    }\n    atxfer(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        if (sipSession) {\n            WebRTCPhone_logger.info('WebRTC atxfer', {\n                sipId: this.getSipSessionId(sipSession)\n            });\n            return this.client.atxfer(sipSession);\n        }\n    }\n    hold(callSession, withEvent = true) {\n        WebRTCPhone_logger.info('WebRTC hold', {\n            id: callSession.getId()\n        });\n        const sipSession = this.findSipSession(callSession);\n        return sipSession ? this.holdSipSession(sipSession, callSession, withEvent) : null;\n    }\n    unhold(callSession, withEvent = true) {\n        console.warn('Please note that `phone.unhold()` is being deprecated; `phone.resume()` is the preferred method');\n        return this.resume(callSession, withEvent);\n    }\n    resume(callSession, withEvent = true) {\n        WebRTCPhone_logger.info('WebRTC resume called', {\n            id: callSession ? callSession.getId() : null\n        });\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return new Promise((resolve, reject)=>reject(new Error('No session to resume')));\n        WebRTCPhone_logger.info('WebRTC resuming', {\n            sipId: this.getSipSessionId(sipSession)\n        });\n        if (this.currentSipSession && this.getSipSessionId(this.currentSipSession) !== this.getSipSessionId(sipSession)) {\n            WebRTCPhone_logger.info('WebRTC hold call after resume', {\n                id: this.getSipSessionId(this.currentSipSession)\n            });\n            this.holdSipSession(this.currentSipSession, this.currentCallSession, withEvent);\n        }\n        const promise = this.unholdSipSession(sipSession, callSession, withEvent);\n        this.currentSipSession = sipSession;\n        if (callSession) this.currentCallSession = callSession;\n        return promise;\n    }\n    async holdSipSession(sipSession, callSession, withEvent = true) {\n        if (!sipSession) return new Promise((resolve, reject)=>reject(new Error('No session to hold')));\n        const sessionId = this.getSipSessionId(sipSession);\n        const hasVideo = this.client.hasLocalVideo(sessionId);\n        WebRTCPhone_logger.info('WebRTC hold sip session', {\n            sipId: this.getSipSessionId(sipSession),\n            hasVideo\n        });\n        if (this.currentScreenShare && this.currentScreenShare.sipSessionId === sessionId) {\n            this.lastScreenShare = this.currentScreenShare;\n            await this.stopScreenSharing(false, callSession);\n        }\n        if (hasVideo) await this.client.downgradeToAudio(sipSession);\n        const isConference = !!callSession && callSession.isConference();\n        const promise = this.client.hold(sipSession, isConference, hasVideo);\n        if (withEvent) this.eventEmitter.emit(ON_CALL_HELD, this._createCallSession(sipSession, callSession));\n        return promise;\n    }\n    async unholdSipSession(sipSession, callSession, withEvent = true) {\n        if (!sipSession) return new Promise((resolve, reject)=>reject(new Error('No session to unhold')));\n        const isConference = !!callSession && callSession.isConference();\n        const sessionId = this.getSipSessionId(sipSession);\n        WebRTCPhone_logger.info('WebRTC unhold sip session', {\n            sessionId,\n            isConference\n        });\n        const { hasVideo } = this.client.getHeldSession(sessionId) || {};\n        const wasScreensharing = this.lastScreenShare && this.lastScreenShare.sipSessionId === sessionId;\n        const wasDesktop = this.lastScreenShare && this.lastScreenShare.desktop;\n        const promise = this.client.unhold(sipSession, isConference);\n        if (hasVideo) {\n            const constraints = {\n                audio: false,\n                video: true,\n                screen: wasScreensharing,\n                desktop: wasDesktop\n            };\n            await this.client.upgradeToVideo(sipSession, constraints, isConference);\n        }\n        const onScreenSharing = (stream)=>{\n            const hadVideo = this.lastScreenShare && this.lastScreenShare.hadVideo;\n            if (stream) this._onScreenSharing(stream, sipSession, callSession, hadVideo);\n            this.lastScreenShare = null;\n        };\n        if (withEvent) {\n            if (callSession) callSession.muted = false;\n            const updatedCallSession = this._createCallSession(sipSession, callSession);\n            this.eventEmitter.emit(ON_CALL_UNHELD, updatedCallSession);\n            this.eventEmitter.emit(ON_CALL_RESUMED, updatedCallSession);\n        }\n        return promise.then(()=>{\n            const stream = callSession ? this.getLocalVideoStream(callSession) : null;\n            if (wasScreensharing) onScreenSharing(stream);\n            return stream;\n        });\n    }\n    mute(callSession, withEvent = true) {\n        WebRTCPhone_logger.info('WebRTC mute called', {\n            id: callSession ? callSession.getId() : null\n        });\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return;\n        WebRTCPhone_logger.info('WebRTC muting', {\n            sipId: this.getSipSessionId(sipSession)\n        });\n        this.client.mute(sipSession);\n        const newCallSession = this._createCallSession(sipSession, callSession, {\n            muted: true\n        });\n        if (this.currentCallSession && newCallSession.is(this.currentCallSession)) this.currentCallSession = newCallSession;\n        if (withEvent) this.eventEmitter.emit(ON_CALL_MUTED, newCallSession);\n    }\n    unmute(callSession, withEvent = true) {\n        WebRTCPhone_logger.info('WebRTC unmute called', {\n            id: callSession ? callSession.getId() : null\n        });\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return;\n        WebRTCPhone_logger.info('WebRTC unmuting', {\n            sipId: this.getSipSessionId(sipSession)\n        });\n        this.client.unmute(sipSession);\n        const newCallSession = this._createCallSession(sipSession, callSession, {\n            muted: false\n        });\n        if (this.currentCallSession && newCallSession.is(this.currentCallSession)) this.currentCallSession = newCallSession;\n        if (withEvent) this.eventEmitter.emit(ON_CALL_UNMUTED, newCallSession);\n    }\n    isAudioMuted(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return true;\n        return this.client.isAudioMuted(sipSession);\n    }\n    turnCameraOn(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return;\n        WebRTCPhone_logger.info('WebRTC turn camera on', {\n            sipId: this.getSipSessionId(sipSession)\n        });\n        this.client.toggleCameraOn(sipSession);\n        this.eventEmitter.emit(ON_CAMERA_RESUMED, this._createCameraResumedCallSession(sipSession, callSession));\n    }\n    turnCameraOff(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return;\n        WebRTCPhone_logger.info('WebRTC turn camera off', {\n            sipId: this.getSipSessionId(sipSession)\n        });\n        this.client.toggleCameraOff(sipSession);\n        this.eventEmitter.emit(ON_CAMERA_DISABLED, this._createCameraDisabledCallSession(sipSession, callSession));\n    }\n    sendKey(callSession, tone) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return;\n        WebRTCPhone_logger.info('WebRTC send key', {\n            sipId: this.getSipSessionId(sipSession),\n            tone\n        });\n        this.client.sendDTMF(sipSession, tone);\n    }\n    async makeCall(number, line, cameraEnabled, audioOnly = false, conference = false, options = {}) {\n        WebRTCPhone_logger.info('make WebRTC call', {\n            number,\n            lineId: line ? line.id : null,\n            cameraEnabled,\n            audioOnly,\n            conference,\n            options\n        });\n        if (!number) return Promise.resolve(null);\n        if (!this.client.isRegistered()) await this.client.register();\n        if (this.currentSipSession) this.holdSipSession(this.currentSipSession, this.currentCallSession, true).catch((e)=>{\n            WebRTCPhone_logger.warn('Unable to hold current session when making another call', e);\n        });\n        let sipSession;\n        try {\n            sipSession = this.client.call(number, !!this.allowVideo && cameraEnabled, audioOnly, conference, options);\n            this._bindEvents(sipSession);\n        } catch (error) {\n            WebRTCPhone_logger.warn('make WebRTC call, error', {\n                message: error.message,\n                stack: error.stack\n            });\n            return Promise.resolve(null);\n        }\n        const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);\n        callSession.setIsConference(conference);\n        callSession.creationTime = new Date();\n        this._updateCallSession(callSession);\n        this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);\n        this.currentSipSession = sipSession;\n        this.currentCallSession = callSession;\n        this.eventEmitter.emit(ON_CALL_OUTGOING, callSession);\n        if (sipSession.invitePromise) sipSession.invitePromise.catch((error)=>{\n            this.eventEmitter.emit(ON_CALL_ERROR, error, callSession);\n        });\n        return Promise.resolve(callSession);\n    }\n    transfer(callSession, target) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) return;\n        WebRTCPhone_logger.info('WebRTC transfer', {\n            sipId: this.getSipSessionId(sipSession),\n            target\n        });\n        this.client.transfer(sipSession, target);\n    }\n    async indirectTransfer(source, destination) {\n        const sipSession = this.client.getSipSession(source.sipCallId);\n        const sipSessionTarget = this.client.getSipSession(destination.sipCallId);\n        WebRTCPhone_logger.info('WebRTC indirect transfer', {\n            sipId: sipSession ? this.getSipSessionId(sipSession) : null,\n            target: sipSessionTarget ? this.getSipSessionId(sipSessionTarget) : null\n        });\n        if (!sipSessionTarget) return Promise.reject();\n        return new Promise((resolve)=>{\n            const options = {\n                requestDelegate: {\n                    onAccept: ()=>{\n                        setTimeout(()=>{\n                            this.hangup(destination).then(resolve);\n                        }, 200);\n                    }\n                }\n            };\n            return sipSessionTarget.refer(sipSession, options);\n        });\n    }\n    initiateCTIIndirectTransfer() {\n        return Promise.resolve(null);\n    }\n    cancelCTIIndirectTransfer() {}\n    confirmCTIIndirectTransfer() {}\n    async hangup(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        if (!sipSession) {\n            console.error('Call is unknown to the WebRTC phone', callSession ? callSession.sipCallId : null, callSession ? callSession.callId : null);\n            return false;\n        }\n        const sipSessionId = this.getSipSessionId(sipSession);\n        WebRTCPhone_logger.info('WebRTC hangup', {\n            sipId: this.getSipSessionId(sipSession),\n            sipSessionId\n        });\n        await this.client.hangup(sipSession);\n        if (callSession) this.endCurrentCall(callSession);\n        else if (sipSessionId) delete this.callSessions[sipSessionId];\n        this.shouldSendReinvite = false;\n        return true;\n    }\n    async getStats(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        return sipSession ? this.client.getStats(sipSession) : null;\n    }\n    startNetworkMonitoring(callSession, interval = 1000) {\n        const sipSession = this.findSipSession(callSession);\n        return sipSession ? this.client.startNetworkMonitoring(sipSession, interval) : null;\n    }\n    stopNetworkMonitoring(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        return sipSession ? this.client.stopNetworkMonitoring(sipSession) : null;\n    }\n    forceCancel(sipSession) {\n        if (!sipSession || !sipSession.outgoingInviteRequest) return;\n        try {\n            sipSession.outgoingInviteRequest.cancel();\n        } catch (e) {\n            WebRTCPhone_logger.info('force cancel, error', e);\n        }\n    }\n    endCurrentCall(callSession) {\n        const isCurrent = this.isCurrentCallSipSession(callSession);\n        WebRTCPhone_logger.info('Ending current call', {\n            id: callSession ? callSession.getId() : null,\n            isCurrent\n        });\n        if (isCurrent) {\n            this.currentSipSession = void 0;\n            this.currentCallSession = void 0;\n        }\n        this.eventEmitter.emit(ON_TERMINATE_SOUND, callSession, 'locally ended');\n    }\n    onConnectionMade() {}\n    isConference(callSession) {\n        if (!callSession) return false;\n        return this.client && this.client.isConference(callSession.sipCallId);\n    }\n    async close(force = false) {\n        WebRTCPhone_logger.info('WebRTC close');\n        try {\n            await Promise.race([\n                this.unregister(),\n                new Promise((resolve, reject)=>setTimeout(()=>reject(new Error('Unregister, timed out')), 3000))\n            ]);\n        } catch (e) {\n            WebRTCPhone_logger.error('WebRTC close, unregister error', e);\n        }\n        await this.client.close(force);\n        this.unbind();\n        this.incomingSessions = [];\n        this.currentSipSession = void 0;\n        this.currentCallSession = void 0;\n        this.shouldSendReinvite = false;\n        this.rejectedSessions = {};\n    }\n    isRegistered() {\n        return this.client && this.client.isRegistered();\n    }\n    enableRinging() {\n        WebRTCPhone_logger.info('WebRTC enable ringing');\n        this.ringingEnabled = true;\n    }\n    disableRinging() {\n        WebRTCPhone_logger.info('WebRTC disable ringing');\n        this.ringingEnabled = false;\n    }\n    getCurrentCallSession() {\n        if (!this.currentSipSession) return null;\n        return this._createCallSession(this.currentSipSession, this.currentCallSession);\n    }\n    hasIncomingCallSession() {\n        return this.incomingSessions.length > 0;\n    }\n    getIncomingCallSession() {\n        if (!this.hasIncomingCallSession()) return null;\n        const sessionId = this.incomingSessions[0];\n        const sipSession = this.client.getSipSession(sessionId);\n        if (!sipSession) return null;\n        return this._createCallSession(sipSession);\n    }\n    sendMessage(sipSession = null, body, contentType = 'text/plain') {\n        return this.client.sendMessage(sipSession, body, contentType);\n    }\n    getLocalStream(callSession) {\n        return callSession ? this.client.getLocalStream(callSession.sipCallId) : null;\n    }\n    getLocalVideoStream(callSession) {\n        return callSession ? this.client.getLocalVideoStream(callSession.sipCallId) : null;\n    }\n    getLocalMediaStream(callSession) {\n        WebRTCPhone_logger.warn('WebRTCPhone.getLocalMediaStream is deprecated, use WebRTCPhone.getLocalStream instead');\n        return this.getLocalStream(callSession);\n    }\n    hasLocalVideo(callSession) {\n        return !!callSession && this.client.hasLocalVideo(callSession.sipCallId);\n    }\n    hasALocalVideoTrack(callSession) {\n        return !!callSession && this.client.hasALocalVideoTrack(callSession.sipCallId);\n    }\n    getRemoteStream(callSession) {\n        return callSession ? this.client.getRemoteStream(callSession.sipCallId) : null;\n    }\n    getRemoteVideoStream(callSession) {\n        return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;\n    }\n    getRemoteVideoStreamFromPc(callSession) {\n        return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;\n    }\n    hasRemoteVideo(callSession) {\n        return !!callSession && this.client.hasRemoteVideo(callSession.sipCallId);\n    }\n    setMediaConstraints(media) {\n        this.client.setMediaConstraints(media);\n    }\n    isVideoRemotelyHeld(callSession) {\n        return !!callSession && this.client.isVideoRemotelyHeld(callSession.sipCallId);\n    }\n    bindClientEvents() {\n        this.client.unbind();\n        this.client.on(this.client.INVITE, (sipSession, wantsToDoVideo)=>{\n            const autoAnswer = 'Auto' === sipSession.request.getHeader('Answer-Mode');\n            const withVideo = !!this.allowVideo && wantsToDoVideo;\n            WebRTCPhone_logger.info('WebRTC invite received', {\n                sipId: this.getSipSessionId(sipSession),\n                withVideo,\n                autoAnswer\n            });\n            const callSession = this._createIncomingCallSession(sipSession, withVideo, null, autoAnswer);\n            this.incomingSessions.push(callSession.getId());\n            this._bindEvents(sipSession);\n            this.client.storeSipSession(sipSession);\n            callSession.creationTime = new Date();\n            this._updateCallSession(callSession);\n            this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);\n            if (this.currentSipSession) this.eventEmitter.emit(ON_PLAY_INBOUND_CALL_SIGNAL_SOUND, this.audioOutputDeviceId, this.audioOutputVolume, callSession);\n            else if (this.ringingEnabled) this.eventEmitter.emit(ON_PLAY_RING_SOUND, this.audioRingDeviceId, this.audioRingVolume, callSession);\n        });\n        this.client.on(this.client.ON_REINVITE, (...args)=>{\n            WebRTCPhone_logger.info('WebRTC on reinvite', {\n                sessionId: args[0].id,\n                inviteId: args[1].id,\n                updatedCalleeName: args[2],\n                updatedNumber: args[3]\n            });\n            const sipSession = args[0];\n            setTimeout(()=>{\n                this._createCallSession(sipSession, this.callSessions[this.getSipSessionId(sipSession)]);\n                this.eventEmitter.emit.apply(this.eventEmitter, [\n                    this.client.ON_REINVITE,\n                    ...args\n                ]);\n            }, 2000);\n        });\n        this.client.on(this.client.ACCEPTED, async (sipSession)=>{\n            const sessionId = this.getSipSessionId(sipSession);\n            const hasSession = sessionId in this.callSessions;\n            WebRTCPhone_logger.info('WebRTC call accepted', {\n                sipId: sessionId,\n                hasSession\n            });\n            if (!hasSession) {\n                WebRTCPhone_logger.warn('Call accepted ignored, session is no longer present in the WebRtcPhone', {\n                    sessionId\n                });\n                return;\n            }\n            this._onCallAccepted(sipSession, this.client.hasVideo(sessionId));\n            if (this.audioOutputDeviceId) await this.client.changeAudioOutputDevice(this.audioOutputDeviceId);\n        });\n        this.client.on('ended', ()=>{});\n        this.client.on(this.client.ON_ERROR, (e)=>{\n            WebRTCPhone_logger.error('WebRTC error', e);\n            this.eventEmitter.emit(ON_CALL_ERROR, e);\n        });\n        this.client.on(this.client.REJECTED, (session)=>{\n            WebRTCPhone_logger.info('WebRTC call rejected', {\n                id: this.getSipSessionId(session)\n            });\n            const callSession = this._createCallSession(session);\n            delete this.callSessions[this.getSipSessionId(session)];\n            callSession.endTime = new Date();\n            this.eventEmitter.emit(ON_CALL_REJECTED, callSession);\n        });\n        this.client.on(this.client.UNREGISTERED, ()=>{\n            WebRTCPhone_logger.info('WebRTC unregistered');\n            this.eventEmitter.emit(ON_UNREGISTERED);\n        });\n        this.client.on(this.client.ON_ICE_DISCONNECTED, ()=>{\n            WebRTCPhone_logger.info('ICE connection disconnected');\n            this.eventEmitter.emit(WebRTCPhone_ON_ICE_DISCONNECTED);\n        });\n        this.client.on(this.client.ON_ICE_RECONNECTING, ()=>{\n            WebRTCPhone_logger.info('ICE connection reconnecting');\n            this.eventEmitter.emit(WebRTCPhone_ON_ICE_RECONNECTING);\n        });\n        this.client.on(this.client.ON_ICE_RECONNECTED, ()=>{\n            WebRTCPhone_logger.info('ICE connection reconnected');\n            this.eventEmitter.emit(WebRTCPhone_ON_ICE_RECONNECTED);\n        });\n        this.client.on(this.client.ON_PROGRESS, (session)=>{\n            WebRTCPhone_logger.info('WebRTC progress (180)');\n            const callSession = this._createCallSession(session, null, {\n                incoming: false,\n                ringing: true,\n                callId: this.getSipSessionId(session)\n            });\n            this.eventEmitter.emit(WebRTCPhone_ON_PROGRESS, callSession, this.audioOutputDeviceId, this.audioOutputVolume);\n        });\n        this.client.on(this.client.ON_EARLY_MEDIA, (session)=>{\n            WebRTCPhone_logger.info('WebRTC early media');\n            const callSession = this._createCallSession(session, null, {\n                incoming: false,\n                ringing: true,\n                callId: this.getSipSessionId(session)\n            });\n            this.eventEmitter.emit(WebRTCPhone_ON_EARLY_MEDIA, callSession, this.audioOutputDeviceId, this.audioOutputVolume);\n        });\n        this.client.on(this.client.REGISTERED, ()=>{\n            WebRTCPhone_logger.info('WebRTC registered', {\n                shouldSendReinvite: this.shouldSendReinvite,\n                state: this.currentSipSession ? this.currentSipSession.state : null,\n                currentSipSession: !!this.currentSipSession\n            });\n            this.stopHeartbeat();\n            this.eventEmitter.emit(ON_REGISTERED);\n            if (this.shouldSendReinvite && this.currentSipSession && this.currentSipSession.state === session_state_namespaceObject.SessionState.Established) {\n                this.shouldSendReinvite = false;\n                const pc = this.currentSipSession?.sessionDescriptionHandler?.peerConnection;\n                const isConference = !!pc && pc.sfu;\n                const hasVideo = this.currentCallSession && this.currentCallSession.cameraEnabled;\n                try {\n                    this.sendReinvite(this.currentCallSession, null, isConference, !hasVideo, true);\n                } catch (e) {\n                    WebRTCPhone_logger.error('WebRTC reinvite after register, error', {\n                        message: e.message,\n                        stack: e.stack\n                    });\n                }\n            }\n        });\n        this.client.on(this.client.CONNECTED, ()=>{\n            WebRTCPhone_logger.info('WebRTC client connected');\n            this.stopHeartbeat();\n        });\n        this.client.on(this.client.DISCONNECTED, ()=>{\n            WebRTCPhone_logger.info('WebRTC client disconnected');\n            this.eventEmitter.emit(ON_UNREGISTERED);\n            if (!this.client.hasHeartbeat()) this.startHeartbeat();\n            this.shouldSendReinvite = true;\n        });\n        this.client.on(this.client.ON_TRACK, (session, event)=>{\n            this.eventEmitter.emit(WebRTCPhone_ON_TRACK, session, event);\n        });\n        this.client.on('onVideoInputChange', (stream)=>{\n            this.eventEmitter.emit(ON_VIDEO_INPUT_CHANGE, stream);\n        });\n        this.client.on(this.client.MESSAGE, (message)=>{\n            this._onMessage(message);\n            this.eventEmitter.emit(ON_MESSAGE, message);\n        });\n        this.client.on(this.client.ON_NETWORK_STATS, (session, stats, previousStats)=>{\n            const callSession = this.getCallSession(this.getSipSessionId(session));\n            this.eventEmitter.emit(WebRTCPhone_ON_NETWORK_STATS, callSession, stats, previousStats);\n        });\n        this.client.on(this.client.ON_SCREEN_SHARING_REINVITE, (sipSession, response, desktop)=>{\n            const sipSessionId = this.getSipSessionId(sipSession);\n            const localStream = this.client.getLocalStream(sipSessionId);\n            const callSession = this.callSessions[sipSessionId];\n            WebRTCPhone_logger.info('Updrading directly in screensharing mode', {\n                sipSessionId,\n                tracks: localStream?.getTracks() || null\n            });\n            this._onScreenSharing(localStream, sipSession, callSession, false, desktop);\n        });\n    }\n    findSipSession(callSession) {\n        const keys = this.client.getSipSessionIds();\n        const keyIndex = keys.findIndex((sessionId)=>callSession && callSession.isId(sessionId));\n        if (-1 === keyIndex) {\n            const currentSipSessionId = this.currentSipSession ? this.getSipSessionId(this.currentSipSession) : this.client.getSipSessionIds()[0];\n            return currentSipSessionId ? this.client.getSipSession(currentSipSessionId) : null;\n        }\n        return this.client.getSipSession(keys[keyIndex]);\n    }\n    getCallSession(sipSessionId) {\n        return this.callSessions[sipSessionId];\n    }\n    getSipSessionId(sipSession) {\n        if (!sipSession) return '';\n        return this.client.getSipSessionId(sipSession);\n    }\n    getSipSessionIdFromCallSession(callSession) {\n        const sipSession = this.findSipSession(callSession);\n        return sipSession ? this.getSipSessionId(sipSession) : null;\n    }\n    _updateCallSession(callSession) {\n        const sipSessionId = this.getSipSessionIdFromCallSession(callSession);\n        if (sipSessionId) this.callSessions[sipSessionId] = callSession;\n    }\n    _onMessage(message) {\n        if (!message || 'MESSAGE' !== message.method) return;\n        let body;\n        try {\n            body = JSON.parse(message.body || '');\n        } catch (e) {\n            return;\n        }\n        const { type, content } = body;\n        switch(type){\n            case MESSAGE_TYPE_CHAT:\n                this.eventEmitter.emit(ON_CHAT, content);\n                break;\n            case MESSAGE_TYPE_SIGNAL:\n                this.eventEmitter.emit(ON_SIGNAL, content);\n                break;\n            default:\n        }\n    }\n    _createIncomingCallSession(sipSession, cameraEnabled, fromSession, autoAnswer = false) {\n        return this._createCallSession(sipSession, fromSession, {\n            incoming: true,\n            ringing: true,\n            cameraEnabled,\n            autoAnswer\n        });\n    }\n    _createOutgoingCallSession(sipSession, cameraEnabled, fromSession) {\n        return this._createCallSession(sipSession, fromSession, {\n            incoming: false,\n            ringing: true,\n            cameraEnabled\n        });\n    }\n    _createAcceptedCallSession(sipSession, cameraEnabled, fromSession) {\n        return this._createCallSession(sipSession, fromSession, {\n            cameraEnabled: void 0 !== cameraEnabled && cameraEnabled\n        });\n    }\n    _createMutedCallSession(sipSession, fromSession) {\n        return this._createCallSession(sipSession, fromSession, {\n            muted: true\n        });\n    }\n    _createUnmutedCallSession(sipSession, fromSession) {\n        return this._createCallSession(sipSession, fromSession, {\n            muted: false\n        });\n    }\n    _createCameraResumedCallSession(sipSession, fromSession) {\n        return this._createCallSession(sipSession, fromSession, {\n            videoMuted: false\n        });\n    }\n    _createCameraDisabledCallSession(sipSession, fromSession) {\n        return this._createCallSession(sipSession, fromSession, {\n            videoMuted: true\n        });\n    }\n    _createCallSession(sipSession, fromSession, extra = {}) {\n        const identity = sipSession ? sipSession.remoteIdentity || sipSession.assertedIdentity : null;\n        const number = identity ? identity.uri._normal.user : null;\n        const { state } = sipSession || {};\n        const sessionId = this.getSipSessionId(sipSession);\n        fromSession = fromSession || this.callSessions[sessionId];\n        const callSession = new CallSession({\n            callId: fromSession && fromSession.callId,\n            sipCallId: sessionId,\n            sipStatus: state,\n            displayName: identity ? identity.displayName || number : number,\n            startTime: fromSession ? fromSession.startTime : new Date(),\n            creationTime: fromSession ? fromSession.creationTime : null,\n            answerTime: fromSession ? fromSession.answerTime : null,\n            endTime: fromSession ? fromSession.endTime : null,\n            answered: state === session_state_namespaceObject.SessionState.Established,\n            paused: this.client.isCallHeld(sipSession),\n            isCaller: fromSession ? fromSession.isCaller : 'incoming' in extra && !extra.incoming,\n            cameraEnabled: fromSession ? fromSession.isCameraEnabled() : this.client.hasVideo(sessionId),\n            number,\n            ringing: false,\n            muted: fromSession ? fromSession.isMuted() : this.client.isAudioMuted(sipSession),\n            videoMuted: !!fromSession && fromSession.isVideoMuted(),\n            recording: !!fromSession && fromSession.isRecording(),\n            recordingPaused: !!fromSession && fromSession.isRecordingPaused(),\n            recordingState: fromSession ? fromSession.recordingState : RECORDING_STATE.INACTIVE,\n            sipSession,\n            conference: !!fromSession && fromSession.isConference(),\n            ...extra\n        });\n        this.callSessions[sessionId] = callSession;\n        return callSession;\n    }\n}\nclass Room {\n    id;\n    name;\n    connectedCallSession;\n    participants;\n    constructor({ id, connectedCallSession, participants, name }){\n        this.id = id;\n        this.connectedCallSession = connectedCallSession;\n        this.participants = participants;\n        this.name = name;\n    }\n    getExtension() {\n        return this.connectedCallSession ? this.connectedCallSession.number : null;\n    }\n    connect(callSession) {\n        return new Room({\n            ...this,\n            connectedCallSession: callSession\n        });\n    }\n    has(callSession) {\n        return !!this.connectedCallSession && this.connectedCallSession.is(callSession);\n    }\n    addParticipant(uuid, extension, talking = null) {\n        if (!this.participants.some((participant)=>participant.uuid === uuid || participant.extension === extension)) return new Room({\n            ...this,\n            participants: [\n                ...this.participants,\n                {\n                    uuid,\n                    extension,\n                    talking\n                }\n            ]\n        });\n        return this;\n    }\n    updateParticipant(uuid, participant, shouldAdd = false) {\n        const idx = this.participants.findIndex((someParticipant)=>someParticipant.uuid === uuid);\n        if (-1 === idx && !shouldAdd) return this;\n        const updatedParticipants = [\n            ...this.participants\n        ];\n        if (-1 !== idx) updatedParticipants[idx] = {\n            ...updatedParticipants[idx],\n            ...participant\n        };\n        else updatedParticipants.push(participant);\n        return new Room({\n            ...this,\n            participants: updatedParticipants\n        });\n    }\n    updateParticipantByExtension(extension, participant, shouldAdd = false) {\n        const idx = this.participants.findIndex((someParticipant)=>someParticipant.extension === extension);\n        if (-1 === idx && !shouldAdd) return this;\n        const updatedParticipants = [\n            ...this.participants\n        ];\n        if (-1 !== idx) updatedParticipants[idx] = {\n            ...updatedParticipants[idx],\n            ...participant\n        };\n        else updatedParticipants.push(participant);\n        return new Room({\n            ...this,\n            participants: updatedParticipants\n        });\n    }\n    hasCallWithId(id) {\n        return !!this.connectedCallSession && this.connectedCallSession.getId() === id;\n    }\n    disconnect() {\n        return new Room({\n            ...this,\n            connectedCallSession: null\n        });\n    }\n    removeParticipantWithUUID(uuid) {\n        return new Room({\n            ...this,\n            participants: this.participants.filter((participant)=>participant.uuid !== uuid)\n        });\n    }\n    removeParticipantWithExtension(extension) {\n        return new Room({\n            ...this,\n            participants: this.participants.filter((participant)=>participant.extension !== extension)\n        });\n    }\n    updateFrom(room) {\n        update_from(this, room);\n    }\n    static newFrom(room) {\n        return new_from(room, Room);\n    }\n}\nclass SFUNotAvailableError extends Error {\n    constructor(message = 'Sorry your user is not configured to support video conference'){\n        super(message);\n        this.name = 'SFUNotAvailableError';\n    }\n}\nclass SwitchboardCall {\n    static STATE;\n    id;\n    callSession;\n    callerIdName;\n    callerIdNumber;\n    answerTime;\n    participantId;\n    state;\n    switchboardName;\n    switchboardUuid;\n    type;\n    static parse(plain) {\n        return new SwitchboardCall({\n            id: plain.id,\n            callSession: plain.callSession || null,\n            callerIdName: plain.caller_id_name || null,\n            callerIdNumber: plain.caller_id_number || null,\n            participantId: plain.participantId || null,\n            answerTime: plain.startTime,\n            state: plain.state,\n            switchboardName: plain.switchboardName,\n            switchboardUuid: plain.switchboardUuid\n        });\n    }\n    constructor({ id, callSession, callerIdName, callerIdNumber, participantId, answerTime, state, switchboardName, switchboardUuid }){\n        this.id = id;\n        this.callSession = callSession;\n        this.callerIdName = callerIdName;\n        this.callerIdNumber = callerIdNumber;\n        this.participantId = participantId;\n        this.answerTime = answerTime;\n        this.state = state;\n        this.switchboardName = switchboardName;\n        this.switchboardUuid = switchboardUuid;\n        this.type = 'SwitchboardCall';\n    }\n    updateFrom(switchboardCall) {\n        update_from(this, switchboardCall);\n    }\n    getId() {\n        return this.id;\n    }\n    static newFrom(switchboardCall) {\n        return new_from(switchboardCall, SwitchboardCall);\n    }\n}\nSwitchboardCall.STATE = {\n    INCOMING: 'incoming',\n    ONGOING: 'ongoing',\n    HELD: 'held'\n};\nconst domain_SwitchboardCall = SwitchboardCall;\nclass InvalidSubscription extends Error {\n}\nclass InvalidAuthorization extends Error {\n}\nclass NoTenantIdError extends Error {\n}\nclass NoDomainNameError extends Error {\n}\nclass NoSamlRouteError extends Error {\n}\nclass SamlConfigError extends Error {\n}\nconst Auth_logger = IssueReporter.loggerFor('simple-auth');\nclass Auth_Auth {\n    clientId;\n    expiration;\n    minSubscriptionType;\n    authorizationName;\n    host;\n    session;\n    onRefreshTokenCallback;\n    onRefreshTokenCallbackError;\n    onHostFromHeadersCallback;\n    authenticated;\n    mobile;\n    BACKEND_WAZO;\n    BACKEND_LDAP;\n    usingEdgeServer;\n    onSetUsingEdgeServer;\n    constructor(){\n        this.expiration = DETAULT_EXPIRATION;\n        this.authenticated = false;\n        this.minSubscriptionType = null;\n        this.BACKEND_WAZO = DEFAULT_BACKEND_USER;\n        this.BACKEND_LDAP = BACKEND_LDAP_USER;\n    }\n    init(clientId, expiration, minSubscriptionType, authorizationName, mobile) {\n        this.clientId = clientId;\n        this.expiration = expiration;\n        this.minSubscriptionType = void 0 === minSubscriptionType ? null : minSubscriptionType;\n        this.authorizationName = authorizationName;\n        this.host = null;\n        this.session = null;\n        this.mobile = mobile || false;\n        setApiClientId(this.clientId);\n        setRefreshExpiration(this.expiration);\n        setOnRefreshToken((token, session)=>{\n            Auth_logger.info('on refresh token done', {\n                token: obfuscateToken(token)\n            });\n            setApiToken(token);\n            simple.Websocket.updateToken(token);\n            if (this.onRefreshTokenCallback) this.onRefreshTokenCallback(token, session);\n        });\n        setOnRefreshTokenError((error)=>{\n            Auth_logger.error('on refresh token error', error);\n            if (this.onRefreshTokenCallbackError) this.onRefreshTokenCallbackError(error);\n        });\n    }\n    setFetchOptions(options) {\n        setFetchOptions(options);\n    }\n    async logIn(username, password, backend, extra) {\n        let tenantId = null;\n        let domainName = null;\n        if ('string' == typeof extra) tenantId = extra;\n        if (extra && 'object' == typeof extra) domainName = extra.domainName;\n        if (backend && backend !== this.BACKEND_WAZO && !tenantId && !domainName) {\n            if (!tenantId) throw new NoTenantIdError('No tenant id');\n            if (!domainName) throw new NoDomainNameError('No domain name');\n        }\n        this.authenticated = false;\n        this.session = null;\n        const rawSession = await service_getApiClient().auth.logIn({\n            username,\n            password,\n            backend: backend,\n            tenantId: tenantId,\n            domainName: domainName,\n            expiration: this.expiration,\n            mobile: this.mobile\n        });\n        if (rawSession) {\n            const stackHostFromHeaders = rawSession.getHostFromHeader();\n            if (stackHostFromHeaders) {\n                this.setHost(stackHostFromHeaders);\n                if (this.onHostFromHeadersCallback) this.onHostFromHeadersCallback(stackHostFromHeaders);\n            }\n        }\n        if (backend) service_getApiClient().setRefreshBackend(backend);\n        if (tenantId) service_getApiClient().setRefreshTenantId(tenantId);\n        if (domainName) service_getApiClient().setRefreshDomainName(domainName);\n        return this._onAuthenticated(rawSession);\n    }\n    async samlLogIn(samlSessionId) {\n        const rawSession = await service_getApiClient().auth.samlLogIn(samlSessionId);\n        return this._onAuthenticated(rawSession);\n    }\n    async samlLogOut() {\n        return await this.logout(false, true);\n    }\n    async initiateIdpAuthentication(domain, redirectUrl) {\n        try {\n            return await service_getApiClient().auth.initiateIdpAuthentication(domain, redirectUrl);\n        } catch (e) {\n            Auth_logger.error('Error during IdP authentication initialization:', e.message);\n            if (404 === e.status) throw new NoSamlRouteError('No route found for SAML SSO');\n            if (500 === e.status) throw new SamlConfigError('SAML/server configuration error');\n            throw e;\n        }\n    }\n    async logInViaRefreshToken(refreshToken) {\n        const rawSession = await service_getApiClient().auth.refreshToken(refreshToken, '', this.expiration, this.mobile);\n        return this._onAuthenticated(rawSession);\n    }\n    async validateToken(token, refreshToken, headerUserUuid) {\n        if (!token) return;\n        if (this.usingEdgeServer && 'string' == typeof headerUserUuid) {\n            Auth_logger.info('using edge server, setting user UUID header', {\n                headerUserUuid\n            });\n            this.setHttpUserUuidHeader(headerUserUuid);\n        }\n        if (refreshToken) setRefreshToken(refreshToken);\n        try {\n            const rawSession = await service_getApiClient().auth.authenticate(token);\n            return this._onAuthenticated(rawSession);\n        } catch (e) {\n            Auth_logger.error('on validate token error', e);\n            console.warn(e);\n        }\n    }\n    async generateNewToken(refreshToken) {\n        return service_getApiClient().auth.refreshToken(refreshToken, '', this.expiration);\n    }\n    async logout(deleteRefreshToken = true, saml = false) {\n        try {\n            simple.Websocket.close(true);\n            if (!saml && this.clientId && deleteRefreshToken) await service_getApiClient().auth.deleteRefreshToken(this.clientId);\n        } catch (e) {}\n        let response;\n        try {\n            if (this.session?.token) {\n                if (saml) response = await service_getApiClient().auth.samlLogOut();\n                else await service_getApiClient().auth.logOut(this.session.token);\n            }\n        } catch (e) {}\n        setApiToken(null);\n        setRefreshToken(null);\n        this.session = null;\n        this.authenticated = false;\n        this.usingEdgeServer = void 0;\n        setFetchOptions({});\n        return response;\n    }\n    setOnHostFromHeaders(callback) {\n        this.onHostFromHeadersCallback = callback;\n    }\n    setOnSetUsingEdgeServer(callback) {\n        Auth_logger.info('setting onSetUsingEdgeServer callback', {\n            callback: 'function' == typeof callback\n        });\n        this.onSetUsingEdgeServer = callback;\n    }\n    setOnRefreshToken(callback) {\n        this.onRefreshTokenCallback = callback;\n    }\n    setOnRefreshTokenError(callback) {\n        this.onRefreshTokenCallbackError = callback;\n    }\n    checkAuthorizations(session, authorizationName) {\n        if (!authorizationName) return;\n        const { authorizations } = session;\n        if (!authorizations.find((authorization)=>authorization.rules.find((rule)=>rule.name === authorizationName))) throw new InvalidAuthorization(`No authorization '${authorizationName || ''}' found for your account.`);\n    }\n    checkSubscription(session, minSubscriptionType) {\n        const userSubscriptionType = session.profile?.subscriptionType || null;\n        if (null === userSubscriptionType || userSubscriptionType <= minSubscriptionType) {\n            const message = `Invalid subscription ${userSubscriptionType || 'n/a'}, required at least ${minSubscriptionType}`;\n            throw new InvalidSubscription(message);\n        }\n    }\n    setHost(host) {\n        this.host = host;\n        setCurrentServer(host);\n    }\n    setApiToken(token) {\n        setApiToken(token);\n    }\n    setRefreshToken(refreshToken) {\n        setRefreshToken(refreshToken);\n    }\n    setRefreshTenantId(refreshTenantId) {\n        console.warn('Use of `setRefreshTenantId` is deprecated, use `setRefreshDomainName` instead.');\n        setRefreshTenantId(refreshTenantId);\n        service_getApiClient().setRefreshTenantId(refreshTenantId);\n    }\n    setRefreshDomainName(domainName) {\n        setRefreshDomainName(domainName);\n        service_getApiClient().setRefreshDomainName(domainName);\n    }\n    setRequestTimeout(requestTimeout) {\n        setRequestTimeout(requestTimeout);\n        service_getApiClient().setRequestTimeout(requestTimeout);\n    }\n    forceRefreshToken() {\n        return service_getApiClient().forceRefreshToken();\n    }\n    setIsMobile(mobile) {\n        this.mobile = mobile;\n    }\n    getHost() {\n        return this.host || void 0;\n    }\n    getSession() {\n        return this.session || void 0;\n    }\n    getFirstName() {\n        if (!this.session || !this.session.profile) return '';\n        return this.session.profile.firstName;\n    }\n    getLastName() {\n        if (!this.session || !this.session.profile) return '';\n        return this.session.profile.lastName;\n    }\n    setClientId(clientId) {\n        this.clientId = clientId;\n        setApiClientId(this.clientId);\n    }\n    getName() {\n        return `${this.getFirstName()} ${this.getLastName()}`;\n    }\n    _getHttpUserUuidHeaders(uuid) {\n        return {\n            ...getFetchOptions()?.headers || {},\n            'X-User-UUID': uuid\n        };\n    }\n    setHttpUserUuidHeader(uuid) {\n        Auth_logger.info('Setting http header user uuid', {\n            uuid\n        });\n        if (!uuid) {\n            Auth_logger.warn('attempting to set a null value to user uuid header');\n            return;\n        }\n        const headers = this._getHttpUserUuidHeaders(uuid);\n        setFetchOptions({\n            ...getFetchOptions(),\n            headers\n        });\n    }\n    async checkHttpUserUuidHeader(uuid) {\n        Auth_logger.info('Checking user uuid http header', {\n            uuid\n        });\n        if (!uuid) return;\n        const headers = this._getHttpUserUuidHeaders(uuid);\n        try {\n            const response = await service_getApiClient().client.head('auth/0.1/status', null, headers, (r)=>r);\n            const allowsUserUuidHeader = response.headers.get('access-control-allow-headers')?.includes('X-User-UUID');\n            if (this.mobile && !allowsUserUuidHeader) throw new Error('Server does not allow user UUID header on mobile');\n            this.setHttpUserUuidHeader(uuid);\n            this.usingEdgeServer = true;\n            Auth_logger.info('Setting usingEdgeServer value to TRUE', {\n                requestHeaders: headers,\n                responseHeaders: response.headers,\n                allowsUserUuidHeader\n            });\n        } catch (e) {\n            this.usingEdgeServer = false;\n            Auth_logger.info('Setting usingEdgeServer to FALSE', {\n                justification: e\n            });\n        }\n        if ('function' == typeof this.onSetUsingEdgeServer) {\n            Auth_logger.info('calling onSetUsingEdgeServer', {\n                usingEdgeServer: this.usingEdgeServer\n            });\n            this.onSetUsingEdgeServer(this.usingEdgeServer);\n        }\n    }\n    async _onAuthenticated(rawSession) {\n        if (this.authenticated && this.session) return this.session;\n        const session = rawSession;\n        if (!session) return null;\n        if (this.usingEdgeServer) this.setHttpUserUuidHeader(session.uuid);\n        else if (void 0 === this.usingEdgeServer) await this.checkHttpUserUuidHeader(session.uuid);\n        setApiToken(session.token);\n        if (session.refreshToken) setRefreshToken(session.refreshToken);\n        try {\n            const [profile, { wazo_version: engineVersion }] = await Promise.all([\n                service_getApiClient().confd.getUser(session.uuid),\n                service_getApiClient().confd.getInfos()\n            ]);\n            session.engineVersion = engineVersion;\n            session.profile = profile;\n            this.checkAuthorizations(session, this.authorizationName);\n            if (null !== this.minSubscriptionType) this.checkSubscription(session, +this.minSubscriptionType);\n        } catch (e) {\n            Auth_logger.error('on authenticated error', e);\n            if (this.clientId) await service_getApiClient().auth.deleteRefreshToken(this.clientId);\n            if (session) await service_getApiClient().auth.logOut(session.token);\n            throw e;\n        }\n        try {\n            const lineIds = session.profile?.lines.filter((line)=>!line.endpointSccp).map((line)=>String(line.id));\n            const sipLines = await service_getApiClient().confd.getUserLinesSip(session.uuid, lineIds);\n            session.profile.sipLines = sipLines.filter((line)=>line instanceof SipLine);\n        } catch (e) {}\n        this.authenticated = true;\n        simple.Websocket.open(this.host, session);\n        this.session = session;\n        return session;\n    }\n}\nif (!__webpack_require__.g.wazoAuthInstance) __webpack_require__.g.wazoAuthInstance = new Auth_Auth();\nconst Auth = __webpack_require__.g.wazoAuthInstance;\nclass Configuration {\n    async getCurrentUser() {\n        const session = simple.Auth.getSession();\n        return service_getApiClient().confd.getUser(`${session ? session.uuid : ''}`);\n    }\n}\nif (!__webpack_require__.g.wazoConfigurationInstance) __webpack_require__.g.wazoConfigurationInstance = new Configuration();\nconst simple_Configuration = __webpack_require__.g.wazoConfigurationInstance;\nclass Directory_Directory {\n    async findMultipleContactsByNumber(numbers, fields) {\n        return service_getApiClient().dird.findMultipleContactsByNumber(numbers, fields);\n    }\n}\nif (!__webpack_require__.g.wazoDirectoryInstance) __webpack_require__.g.wazoDirectoryInstance = new Directory_Directory();\nconst Directory = __webpack_require__.g.wazoDirectoryInstance;\nclass AdHocAPIConference {\n    phone;\n    host;\n    participants;\n    started;\n    finished;\n    conferenceId;\n    answerTime;\n    muted;\n    paused;\n    constructor({ phone, host, participants, started, finished, answerTime, conferenceId, muted, paused }){\n        this.phone = phone;\n        this.host = host;\n        this.participants = participants || {};\n        this.started = started || false;\n        this.finished = finished || false;\n        this.answerTime = answerTime;\n        this.conferenceId = conferenceId || '';\n        this.muted = muted || false;\n        this.paused = paused || false;\n        if (this.host) this.host.setIsConference(true);\n    }\n    async start() {\n        this.started = true;\n        this.answerTime = Object.values(this.participants).length ? Object.values(this.participants)[0].answerTime : null;\n        const participantIds = Object.keys(this.participants);\n        const conference = await service_getApiClient().calld.createAdHocConference(this.host.callId, participantIds);\n        this.conferenceId = conference.conference_id;\n        return this;\n    }\n    getParticipants() {\n        return Object.values(this.participants);\n    }\n    async addParticipant(newParticipant) {\n        const participantCallId = newParticipant.getTalkingToIds()[0];\n        const participants = {\n            ...this.participants,\n            [participantCallId]: newParticipant\n        };\n        await service_getApiClient().calld.addAdHocConferenceParticipant(this.conferenceId, participantCallId);\n        return new AdHocAPIConference({\n            ...this,\n            participants\n        });\n    }\n    participantHasLeft(leaver) {\n        delete this.participants[leaver.getId()];\n        return new AdHocAPIConference({\n            ...this,\n            participants: this.participants\n        });\n    }\n    hasParticipants() {\n        return Object.keys(this.participants).length > 0;\n    }\n    mute() {\n        this.muted = true;\n        this.phone.mute(this.host);\n        return new AdHocAPIConference({\n            ...this\n        });\n    }\n    unmute() {\n        this.muted = false;\n        this.phone.unmute(this.host);\n        return new AdHocAPIConference({\n            ...this\n        });\n    }\n    hold() {\n        this.paused = true;\n        this.phone.hold(this.host);\n        return new AdHocAPIConference({\n            ...this\n        });\n    }\n    resume() {\n        this.paused = false;\n        this.phone.resume(this.host);\n        return new AdHocAPIConference({\n            ...this\n        });\n    }\n    isOnHold() {\n        return this.paused;\n    }\n    isMuted() {\n        return this.muted;\n    }\n    async hangup() {\n        await service_getApiClient().calld.deleteAdHocConference(this.conferenceId);\n        return new AdHocAPIConference({\n            ...this,\n            finished: true,\n            participant: []\n        });\n    }\n    async removeParticipant(participantToRemove) {\n        const callId = participantToRemove.getTalkingToIds()[0];\n        delete this.participants[callId];\n        await service_getApiClient().calld.removeAdHocConferenceParticipant(this.conferenceId, callId);\n        return new AdHocAPIConference({\n            ...this,\n            participants: this.participants\n        });\n    }\n}\nconst Phone_logger = IssueReporter.loggerFor('simple-phone');\nconst sipLogger = IssueReporter.loggerFor('sip.js');\nconst protocolLogger = IssueReporter.loggerFor('sip');\nconst protocolDebugMessages = [\n    'Received WebSocket text message:',\n    'Sending WebSocket message:'\n];\nclass Phone_Phone extends Emitter {\n    client;\n    phone;\n    session;\n    sipLine;\n    SessionState;\n    ON_USER_AGENT;\n    ON_REGISTERED;\n    ON_UNREGISTERED;\n    ON_PROGRESS;\n    ON_CALL_ACCEPTED;\n    ON_CALL_ANSWERED;\n    ON_CALL_INCOMING;\n    ON_CALL_OUTGOING;\n    ON_CALL_MUTED;\n    ON_CALL_UNMUTED;\n    ON_CALL_RESUMED;\n    ON_CALL_HELD;\n    ON_CALL_UNHELD;\n    ON_CAMERA_DISABLED;\n    ON_CAMERA_RESUMED;\n    ON_CALL_CANCELED;\n    ON_CALL_FAILED;\n    ON_CALL_REJECTED;\n    ON_CALL_ENDED;\n    ON_CALL_ENDING;\n    ON_MESSAGE;\n    ON_REINVITE;\n    ON_TRACK;\n    ON_AUDIO_STREAM;\n    ON_VIDEO_STREAM;\n    ON_REMOVE_STREAM;\n    ON_SHARE_SCREEN_STARTED;\n    ON_SHARE_SCREEN_ENDING;\n    ON_SHARE_SCREEN_ENDED;\n    ON_TERMINATE_SOUND;\n    ON_PLAY_RING_SOUND;\n    ON_PLAY_INBOUND_CALL_SIGNAL_SOUND;\n    ON_PLAY_HANGUP_SOUND;\n    ON_PLAY_PROGRESS_SOUND;\n    ON_VIDEO_INPUT_CHANGE;\n    ON_CALL_ERROR;\n    ON_MESSAGE_TRACK_UPDATED;\n    ON_NETWORK_STATS;\n    ON_CHAT;\n    ON_SIGNAL;\n    ON_ICE_DISCONNECTED;\n    ON_ICE_RECONNECTING;\n    ON_ICE_RECONNECTED;\n    ON_EARLY_MEDIA;\n    MESSAGE_TYPE_CHAT;\n    MESSAGE_TYPE_SIGNAL;\n    constructor(){\n        super();\n        Object.keys(WebRTCPhone_namespaceObject).forEach((key)=>{\n            this[key] = WebRTCPhone_namespaceObject[key];\n        });\n        this.SessionState = session_state_namespaceObject.SessionState;\n    }\n    async connect(rawOptions = {}, sipLine = null) {\n        const options = rawOptions;\n        if (this.phone) {\n            if (options.media) this.phone.setMediaConstraints(options.media);\n            return;\n        }\n        const server = simple.Auth.getHost();\n        const session = simple.Auth.getSession();\n        if (!server || !session) throw new Error('Please connect to the server using `Wazo.Auth.logIn` or `Wazo.Auth.authenticate` before using Room.connect().');\n        this.session = session;\n        this.sipLine = sipLine || this.getPrimaryWebRtcLine();\n        if (!this.sipLine) throw new Error('Sorry, no sip lines found for this user');\n        options.userUuid = session.uuid || '';\n        this.connectWithCredentials(server, this.sipLine, session.displayName(), options);\n    }\n    connectWithCredentials(server, sipLine, displayName, rawOptions = {}) {\n        if (this.phone) return;\n        const [host, port = 443] = server.split(':');\n        const options = rawOptions;\n        options.media = options.media || {\n            audio: true,\n            video: false\n        };\n        options.uaConfigOverrides = options.uaConfigOverrides || {};\n        if (IssueReporter.enabled) {\n            options.uaConfigOverrides.traceSip = true;\n            options.log = options.log || {};\n            options.log.builtinEnabled = false;\n            options.log.logLevel = 'debug';\n            options.log.connector = this._logConnector;\n        }\n        this.client = new WebRTCClient({\n            host,\n            port: 'string' == typeof port ? parseInt(port, 10) : port,\n            displayName,\n            authorizationUser: sipLine.username,\n            password: sipLine.secret,\n            uri: `${sipLine.username}@${server}`,\n            ...options\n        }, void 0, options.uaConfigOverrides);\n        this.phone = new WebRTCPhone(this.client, options.audioDeviceOutput, true, options.audioDeviceRing);\n        this._transferEvents();\n    }\n    async disconnect() {\n        if (this.phone) {\n            if (this.phone.hasAnActiveCall()) {\n                Phone_logger.info('hangup call on disconnect');\n                await this.phone.hangup();\n            }\n            await this.phone.close();\n        }\n        this.phone = null;\n    }\n    async call(extension, withCamera = false, rawSipLine = null, audioOnly = false, conference = false) {\n        if (!this.phone) return;\n        const sipLine = rawSipLine || this.getPrimaryWebRtcLine();\n        return this.phone.makeCall(extension, sipLine, withCamera, audioOnly, conference);\n    }\n    async hangup(callSession) {\n        Phone_logger.info('hangup via simple phone', {\n            callId: callSession.getId()\n        });\n        return !!this.phone && this.phone.hangup(callSession);\n    }\n    async accept(callSession, cameraEnabled) {\n        Phone_logger.info('accept via simple phone', {\n            callId: callSession.getId(),\n            cameraEnabled\n        });\n        return this.phone ? this.phone.accept(callSession, cameraEnabled) : null;\n    }\n    async startConference(host, otherCalls) {\n        const participants = [\n            host,\n            ...otherCalls\n        ].reduce((acc, participant)=>{\n            acc[participant.getTalkingToIds()[0]] = participant;\n            return acc;\n        }, {});\n        if (!this.phone) return Promise.reject();\n        const adHocConference = new AdHocAPIConference({\n            phone: this.phone,\n            host,\n            participants\n        });\n        return adHocConference.start();\n    }\n    mute(callSession, withApi = true) {\n        if (withApi) this.muteViaAPI(callSession);\n        this.phone?.mute(callSession);\n    }\n    unmute(callSession, withApi = true) {\n        if (withApi) this.unmuteViaAPI(callSession);\n        this.phone?.unmute(callSession);\n    }\n    muteViaAPI(callSession) {\n        if (callSession && callSession.callId) simple.getApiClient().calld.mute(callSession.callId).catch((e)=>{\n            Phone_logger.error('Mute via API, error', e);\n        });\n    }\n    unmuteViaAPI(callSession) {\n        if (callSession && callSession.callId) simple.getApiClient().calld.unmute(callSession.callId).catch((e)=>{\n            Phone_logger.error('Unmute via API, error', e);\n        });\n    }\n    hold(callSession) {\n        return this.phone?.hold(callSession, true);\n    }\n    async unhold(callSession) {\n        return this.phone?.unhold(callSession, true);\n    }\n    async resume(callSession) {\n        return this.phone?.resume(callSession) || null;\n    }\n    reject(callSession) {\n        return this.phone?.reject(callSession);\n    }\n    transfer(callSession, target) {\n        this.phone?.transfer(callSession, target);\n    }\n    atxfer(callSession) {\n        return this.phone?.atxfer(callSession) || null;\n    }\n    async reinvite(callSession, constraints = null, conference = false) {\n        return this.phone ? this.phone.sendReinvite(callSession, constraints, conference) : null;\n    }\n    async getStats(callSession) {\n        return this.phone ? this.phone.getStats(callSession) : null;\n    }\n    startNetworkMonitoring(callSession, interval = 1000) {\n        return this.phone ? this.phone.startNetworkMonitoring(callSession, interval) : null;\n    }\n    stopNetworkMonitoring(callSession) {\n        return this.phone ? this.phone.stopNetworkMonitoring(callSession) : null;\n    }\n    getSipSessionId(sipSession) {\n        if (!sipSession || !this.phone) return null;\n        return this.phone.getSipSessionId(sipSession);\n    }\n    sendMessage(body, sipSession, contentType = 'text/plain') {\n        const toSipSession = sipSession || this.getCurrentSipSession();\n        if (!toSipSession || !this.phone) return;\n        this.phone.sendMessage(toSipSession, body, contentType);\n    }\n    sendChat(content, sipSession) {\n        this.sendMessage(JSON.stringify({\n            type: MESSAGE_TYPE_CHAT,\n            content\n        }), sipSession, 'application/json');\n    }\n    sendSignal(content, sipSession) {\n        this.sendMessage(JSON.stringify({\n            type: MESSAGE_TYPE_SIGNAL,\n            content\n        }), sipSession, 'application/json');\n    }\n    turnCameraOff(callSession) {\n        this.phone?.turnCameraOff(callSession);\n    }\n    turnCameraOn(callSession) {\n        this.phone?.turnCameraOn(callSession);\n    }\n    async startScreenSharing(constraints, callSession) {\n        return this.phone?.startScreenSharing(constraints, callSession) || null;\n    }\n    stopScreenSharing(callSession, restoreLocalStream = true) {\n        return this.phone ? this.phone.stopScreenSharing(restoreLocalStream, callSession) : Promise.resolve();\n    }\n    sendDTMF(tone, callSession) {\n        this.phone?.sendKey(callSession, tone);\n    }\n    getLocalStream(callSession) {\n        return this.phone?.getLocalStream(callSession);\n    }\n    hasLocalVideo(callSession) {\n        return this.phone?.hasLocalVideo(callSession) || false;\n    }\n    hasALocalVideoTrack(callSession) {\n        return this.phone?.hasALocalVideoTrack(callSession) || false;\n    }\n    getLocalMediaStream(callSession) {\n        Phone_logger.warn('Phone.getLocalMediaStream is deprecated, use Phone.getLocalStream instead');\n        return this.phone?.getLocalStream(callSession);\n    }\n    getLocalVideoStream(callSession) {\n        return this.phone?.getLocalVideoStream(callSession) || null;\n    }\n    getRemoteStream(callSession) {\n        return this.phone?.getRemoteStream(callSession) || null;\n    }\n    getRemoteVideoStream(callSession) {\n        return this.phone?.getRemoteVideoStream(callSession) || null;\n    }\n    isVideoRemotelyHeld(callSession) {\n        return this.phone?.isVideoRemotelyHeld(callSession) || false;\n    }\n    getRemoteStreamForCall(callSession) {\n        Phone_logger.warn('Phone.getRemoteStreamForCall is deprecated, use Phone.getRemoteStream instead');\n        return this.getRemoteStream(callSession) || null;\n    }\n    getRemoteStreamsForCall(callSession) {\n        Phone_logger.warn('Phone.getRemoteStreamsForCall is deprecated, use Phone.getLocalStream instead');\n        return this.getLocalStream(callSession) || null;\n    }\n    getRemoteVideoStreamForCall(callSession) {\n        Phone_logger.warn('Phone.getRemoteVideoStreamForCall is deprecated, use Phone.getRemoteVideoStream instead');\n        return this.getRemoteVideoStream(callSession);\n    }\n    getRemoteVideoStreamFromPc(callSession) {\n        return this.phone?.getRemoteVideoStreamFromPc(callSession) || null;\n    }\n    hasVideo(callSession) {\n        return !!this.phone && this.phone.hasVideo(callSession);\n    }\n    hasAVideoTrack(callSession) {\n        return !!this.phone && this.phone.hasAVideoTrack(callSession);\n    }\n    getCurrentSipSession() {\n        return this.phone?.currentSipSession || null;\n    }\n    getPrimaryWebRtcLine() {\n        const session = simple.Auth.getSession();\n        return session?.primaryWebRtcLine() || null;\n    }\n    getOutputDevice() {\n        return this.phone?.audioOutputDeviceId || null;\n    }\n    getPrimaryLine() {\n        const session = simple.Auth.getSession();\n        return session?.primarySipLine() || null;\n    }\n    getLineById(lineId) {\n        return this.getSipLines().find((line)=>line && line.id === lineId) || null;\n    }\n    getSipLines() {\n        const session = simple.Auth.getSession();\n        if (!session) return [];\n        return session.profile?.sipLines || [];\n    }\n    hasSfu() {\n        return this.sipLine?.hasVideoConference() || false;\n    }\n    checkSfu() {\n        if (!this.hasSfu()) throw new SFUNotAvailableError();\n    }\n    enableLogger() {\n        this.client.enableLogger(this._logConnector);\n    }\n    _transferEvents() {\n        this.unbind();\n        [\n            ...web_rtc_client_events,\n            ...transportEvents\n        ].forEach((event)=>{\n            this.client.on(event, (...args)=>this.eventEmitter.emit.apply(this.eventEmitter.emit, [\n                    `client-${event}`,\n                    ...args\n                ]));\n        });\n        Object.values(WebRTCPhone_namespaceObject).forEach((event)=>{\n            if ('string' != typeof event || !this.phone) return;\n            this.phone.on(event, (...args)=>this.eventEmitter.emit.apply(this.eventEmitter, [\n                    event,\n                    ...args\n                ]));\n        });\n    }\n    _logConnector(level, className, label, content) {\n        const protocolIndex = content && content.indexOf ? protocolDebugMessages.findIndex((prefix)=>-1 !== content.indexOf(prefix)) : -1;\n        if ('sip.Transport' === className && -1 !== protocolIndex) {\n            const direction = 0 === protocolIndex ? 'receiving' : 'sending';\n            const message = content.replace(`${protocolDebugMessages[protocolIndex]}\\n\\n`, '').replace('\\r\\n', '\\n');\n            protocolLogger.trace(message, {\n                className,\n                direction\n            });\n        } else sipLogger.trace(content, {\n            className\n        });\n    }\n}\nif (!__webpack_require__.g.wazoTelephonyInstance) __webpack_require__.g.wazoTelephonyInstance = new Phone_Phone();\nconst Phone = __webpack_require__.g.wazoTelephonyInstance;\nconst SIGNAL_TYPE_PARTICIPANT_UPDATE = 'signal/PARTICIPANT_UPDATE';\nconst SIGNAL_TYPE_PARTICIPANT_REQUEST = 'signal/PARTICIPANT_REQUEST';\nconst Participant_logger = IssueReporter.loggerFor('room');\nclass Participant_Participant extends Emitter {\n    room;\n    uuid;\n    name;\n    number;\n    callId;\n    isTalking;\n    streams;\n    videoStreams;\n    audioMuted;\n    videoMuted;\n    screensharing;\n    isOnHold;\n    banned;\n    extra;\n    ON_UPDATED;\n    ON_START_TALKING;\n    ON_STOP_TALKING;\n    ON_DISCONNECT;\n    ON_STREAM_SUBSCRIBED;\n    ON_STREAM_UNSUBSCRIBED;\n    ON_AUDIO_MUTED;\n    ON_AUDIO_UNMUTED;\n    ON_VIDEO_MUTED;\n    ON_VIDEO_UNMUTED;\n    ON_SCREENSHARING;\n    ON_STOP_SCREENSHARING;\n    ON_EXTRA_CHANGE;\n    ON_HOLD;\n    ON_RESUME;\n    ON_BAN;\n    constructor(room, rawParticipant, extra = {}){\n        super();\n        this.room = room;\n        this.uuid = rawParticipant.user_uuid;\n        this.name = (rawParticipant.caller_id_name || '').replace(\"\\\\'\", \"'\");\n        this.number = rawParticipant.caller_id_number;\n        this.callId = rawParticipant.call_id;\n        this.isTalking = false;\n        this.streams = [];\n        this.videoStreams = [];\n        this.audioMuted = false;\n        this.videoMuted = false;\n        this.screensharing = false;\n        this.isOnHold = false;\n        this.extra = extra;\n        this.banned = false;\n        this.ON_UPDATED = 'participant/ON_UPDATED';\n        this.ON_START_TALKING = 'participant/ON_START_TALKING';\n        this.ON_STOP_TALKING = 'participant/ON_STOP_TALKING';\n        this.ON_DISCONNECT = 'participant/ON_DISCONNECT';\n        this.ON_STREAM_SUBSCRIBED = 'participant/ON_STREAM_SUBSCRIBED';\n        this.ON_STREAM_UNSUBSCRIBED = 'participant/ON_STREAM_UNSUBSCRIBED';\n        this.ON_AUDIO_MUTED = 'participant/ON_AUDIO_MUTED';\n        this.ON_AUDIO_UNMUTED = 'participant/ON_AUDIO_UNMUTED';\n        this.ON_VIDEO_MUTED = 'participant/ON_VIDEO_MUTED';\n        this.ON_VIDEO_UNMUTED = 'participant/ON_VIDEO_UNMUTED';\n        this.ON_SCREENSHARING = 'participant/ON_SCREENSHARING';\n        this.ON_STOP_SCREENSHARING = 'participant/ON_STOP_SCREENSHARING';\n        this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';\n        this.ON_HOLD = 'participant/ON_HOLD';\n        this.ON_RESUME = 'participant/ON_RESUME';\n        this.ON_BAN = 'participant/ON_BAN';\n    }\n    triggerEvent(name, ...args) {\n        this.eventEmitter.emit.apply(this.eventEmitter, [\n            name,\n            ...args\n        ]);\n        this.eventEmitter.emit.apply(this.eventEmitter, [\n            this.ON_UPDATED,\n            ...args\n        ]);\n    }\n    triggerUpdate(eventType, broadcast = true) {\n        const status = {\n            callId: this.callId\n        };\n        switch(eventType){\n            case this.ON_START_TALKING:\n            case this.ON_STOP_TALKING:\n                status.isTalking = this.isTalking;\n                break;\n            case this.ON_AUDIO_MUTED:\n            case this.ON_AUDIO_UNMUTED:\n                status.audioMuted = this.audioMuted;\n                break;\n            case this.ON_VIDEO_MUTED:\n            case this.ON_VIDEO_UNMUTED:\n                status.videoMuted = this.videoMuted;\n                break;\n            case this.ON_SCREENSHARING:\n            case this.ON_STOP_SCREENSHARING:\n                status.screensharing = this.screensharing;\n                break;\n            case this.ON_HOLD:\n            case this.ON_RESUME:\n                status.isOnHold = this.isOnHold;\n                break;\n            case this.ON_EXTRA_CHANGE:\n                status.extra = this.extra;\n                break;\n            case this.ON_BAN:\n                status.banned = true;\n                break;\n            default:\n                break;\n        }\n        if (broadcast) this.broadcastStatus(status);\n        this.eventEmitter.emit(eventType, status);\n        this.eventEmitter.emit(this.ON_UPDATED, eventType, status);\n    }\n    onTalking(isTalking) {\n        Participant_logger.info('on participant talking', {\n            name: this.name,\n            isTalking,\n            callId: this.callId\n        });\n        this.isTalking = isTalking;\n        this.triggerUpdate(this.isTalking ? this.ON_START_TALKING : this.ON_STOP_TALKING, false);\n    }\n    onDisconnect() {\n        return this.triggerEvent(this.ON_DISCONNECT);\n    }\n    onStreamSubscribed(stream) {\n        return this.triggerEvent(this.ON_STREAM_SUBSCRIBED, stream);\n    }\n    onStreamUnSubscribed(stream) {\n        return this.triggerEvent(this.ON_STREAM_UNSUBSCRIBED, stream);\n    }\n    onAudioMuted(broadcast = true) {\n        if (this.audioMuted) return;\n        this.audioMuted = true;\n        this.triggerUpdate(this.ON_AUDIO_MUTED, broadcast);\n    }\n    onAudioUnMuted(broadcast = true) {\n        if (!this.audioMuted) return;\n        this.audioMuted = false;\n        this.triggerUpdate(this.ON_AUDIO_UNMUTED, broadcast);\n    }\n    onVideoMuted(broadcast = true) {\n        if (this.videoMuted) return;\n        this.videoMuted = true;\n        this.triggerUpdate(this.ON_VIDEO_MUTED, broadcast);\n    }\n    onVideoUnMuted(broadcast = true) {\n        if (!this.videoMuted) return;\n        this.videoMuted = false;\n        this.triggerUpdate(this.ON_VIDEO_UNMUTED, broadcast);\n    }\n    onScreensharing(broadcast = true) {\n        if (this.screensharing) return;\n        this.screensharing = true;\n        this.triggerUpdate(this.ON_SCREENSHARING, broadcast);\n    }\n    onStopScreensharing(broadcast = true) {\n        if (!this.screensharing) return;\n        this.screensharing = false;\n        this.triggerUpdate(this.ON_STOP_SCREENSHARING, broadcast);\n    }\n    onHold(broadcast = true) {\n        if (this.isOnHold) return;\n        this.isOnHold = true;\n        this.triggerUpdate(this.ON_HOLD, broadcast);\n    }\n    onResume(broadcast = true) {\n        if (!this.isOnHold) return;\n        this.isOnHold = false;\n        this.triggerUpdate(this.ON_RESUME, broadcast);\n    }\n    onBan(broadcast = true) {\n        this.banned = true;\n        this.triggerUpdate(this.ON_BAN, broadcast);\n    }\n    getStatus() {\n        return {\n            callId: this.callId,\n            audioMuted: this.audioMuted,\n            videoMuted: this.videoMuted,\n            screensharing: this.screensharing,\n            isTalking: this.isTalking,\n            extra: this.extra\n        };\n    }\n    updateStatus(status, broadcast = true) {\n        Participant_logger.info('updating participant status', {\n            name: this.name,\n            status\n        });\n        if (void 0 !== status.audioMuted && status.audioMuted !== this.audioMuted) {\n            if (status.audioMuted) this.onAudioMuted(broadcast);\n            else this.onAudioUnMuted(broadcast);\n        }\n        if (void 0 !== status.videoMuted && status.videoMuted !== this.videoMuted) {\n            if (status.videoMuted) this.onVideoMuted(broadcast);\n            else this.onVideoUnMuted(broadcast);\n        }\n        if (void 0 !== status.screensharing && status.screensharing !== this.screensharing) {\n            if (status.screensharing) this.onScreensharing(broadcast);\n            else this.onStopScreensharing(broadcast);\n        }\n        if (void 0 !== status.isOnHold && status.isOnHold !== this.isOnHold) {\n            if (status.isOnHold) this.onHold(broadcast);\n            else this.onResume(broadcast);\n        }\n        if (status.banned) this.onBan(false);\n        if (void 0 !== status.extra && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {\n            this.extra = {\n                ...this.extra,\n                ...status.extra\n            };\n            if (this.extra.contact && !(this.extra.contact instanceof Contact)) this.extra.contact = new Contact(this.extra.contact);\n            this.triggerUpdate(this.ON_EXTRA_CHANGE, broadcast);\n        }\n    }\n    broadcastStatus(inboundStatus = null, sendReinvite = null) {\n        const status = inboundStatus || this.getStatus();\n        Participant_logger.info('broadcasting participant status', {\n            callId: this.callId,\n            status\n        });\n        if (sendReinvite && !this.streams.length && Phone.phone) Phone.phone._sendReinviteMessage(this.room?.callSession, false);\n        this.room?.sendSignal({\n            type: SIGNAL_TYPE_PARTICIPANT_UPDATE,\n            origin: this.callId,\n            status\n        });\n    }\n    resetStreams(streams) {\n        this.streams = streams;\n        this.videoStreams = streams;\n    }\n    async ban(apiRequestDelay = null) {\n        const { meetingUuid } = this.room || {};\n        if (!meetingUuid) throw new Error('Attempting to ban a participant without a `meetingUuid`');\n        this.onBan(true);\n        if (apiRequestDelay) await this.delay(apiRequestDelay);\n        return service_getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);\n    }\n    async delay(ms) {\n        return new Promise((resolve)=>setTimeout(resolve, ms));\n    }\n}\nconst Participant = Participant_Participant;\nclass LocalParticipant_LocalParticipant extends Participant {\n}\nconst LocalParticipant = LocalParticipant_LocalParticipant;\nclass RemoteParticipant extends Participant {\n    constructor(room, rawParticipant, extra = {}){\n        super(room, rawParticipant, extra);\n        if ('<unknown>' === this.name) this.name = String(this.number);\n    }\n}\nconst room_RemoteParticipant = RemoteParticipant;\nconst Room_logger = IssueReporter.loggerFor('sdk-room');\nclass Room_Room extends Emitter {\n    callSession;\n    name;\n    extension;\n    sourceId;\n    meetingUuid;\n    participants;\n    callId;\n    connected;\n    localParticipant;\n    _callIdStreamIdMap;\n    _unassociatedVideoStreams;\n    _unassociatedParticipants;\n    _boundOnParticipantJoined;\n    _boundOnParticipantLeft;\n    _boundOnMessage;\n    _boundOnChat;\n    _boundOnSignal;\n    _boundSaveLocalVideoStream;\n    _boundOnReinvite;\n    audioStream;\n    extra;\n    roomAudioElement;\n    CONFERENCE_USER_PARTICIPANT_JOINED;\n    CONFERENCE_USER_PARTICIPANT_LEFT;\n    MEETING_USER_PARTICIPANT_JOINED;\n    MEETING_USER_PARTICIPANT_LEFT;\n    ON_SHARE_SCREEN_ENDED;\n    ON_MESSAGE;\n    ON_CHAT;\n    ON_SIGNAL;\n    ON_AUDIO_STREAM;\n    ON_VIDEO_STREAM;\n    ON_REMOVE_STREAM;\n    ON_DISCONNECTED;\n    ON_JOINED;\n    ON_VIDEO_INPUT_CHANGE;\n    constructor(callSession, extension, sourceId, callId, meetingUuid, extra = {}){\n        super();\n        Room_logger.info('room initialized', {\n            callId,\n            extension,\n            sourceId,\n            meetingUuid\n        });\n        this.callSession = callSession;\n        this.extension = extension;\n        this.sourceId = sourceId;\n        this.meetingUuid = meetingUuid;\n        this.callId = callId;\n        this.participants = [];\n        this.connected = false;\n        this.localParticipant = null;\n        this._callIdStreamIdMap = {};\n        this._unassociatedVideoStreams = {};\n        this._unassociatedParticipants = {};\n        this.audioStream = null;\n        this.extra = extra;\n        this.CONFERENCE_USER_PARTICIPANT_JOINED = simple.Websocket.CONFERENCE_USER_PARTICIPANT_JOINED;\n        this.CONFERENCE_USER_PARTICIPANT_LEFT = simple.Websocket.CONFERENCE_USER_PARTICIPANT_LEFT;\n        this.MEETING_USER_PARTICIPANT_JOINED = simple.Websocket.MEETING_USER_PARTICIPANT_JOINED;\n        this.MEETING_USER_PARTICIPANT_LEFT = simple.Websocket.MEETING_USER_PARTICIPANT_LEFT;\n        this.ON_SHARE_SCREEN_ENDED = simple.Phone.ON_SHARE_SCREEN_ENDED;\n        this.ON_MESSAGE = simple.Phone.ON_MESSAGE;\n        this.ON_CHAT = simple.Phone.ON_CHAT;\n        this.ON_SIGNAL = simple.Phone.ON_SIGNAL;\n        this.ON_AUDIO_STREAM = simple.Phone.ON_AUDIO_STREAM;\n        this.ON_VIDEO_STREAM = simple.Phone.ON_VIDEO_STREAM;\n        this.ON_REMOVE_STREAM = simple.Phone.ON_REMOVE_STREAM;\n        this.ON_VIDEO_INPUT_CHANGE = simple.Phone.ON_VIDEO_INPUT_CHANGE;\n        this.ON_DISCONNECTED = 'room/ON_DISCONNECTED';\n        this.ON_JOINED = 'room/ON_JOINED';\n        this._boundOnParticipantJoined = this._onParticipantJoined.bind(this);\n        this._boundOnParticipantLeft = this._onParticipantLeft.bind(this);\n        this._boundOnMessage = this._onMessage.bind(this);\n        this._boundOnChat = this._onChat.bind(this);\n        this._boundOnSignal = this._onSignal.bind(this);\n        this._boundSaveLocalVideoStream = this._saveLocalVideoStream.bind(this);\n        this._boundOnReinvite = this._onReinvite.bind(this);\n        this.unbind();\n        this._bindEvents();\n        this._transferEvents();\n    }\n    static async connect({ extension, constraints, audioOnly = false, extra, room, meeting }) {\n        Room_logger.info('connecting to room', {\n            extension,\n            audioOnly,\n            room: !!room\n        });\n        if (!room) {\n            await simple.Phone.connect({\n                media: constraints\n            });\n            const withCamera = constraints && !!constraints.video;\n            if (withCamera) simple.Phone.checkSfu();\n            simple.Websocket.once(simple.Websocket.CALL_CREATED, ({ data })=>{\n                Room_logger.info('room call received via WS', {\n                    callId: data.call_id\n                });\n                if (room) room.setCallId(data.call_id);\n            });\n            const callSession = await simple.Phone.call(extension, withCamera, null, audioOnly, true);\n            room = new Room_Room(callSession, extension, null, null, null, extra);\n            await new Promise((resolve, reject)=>{\n                simple.Phone.once(simple.Phone.ON_CALL_ACCEPTED, resolve);\n                simple.Phone.once(simple.Phone.ON_CALL_FAILED, reject);\n            });\n        }\n        if (room && room.callSession && room.callSession.call) room.setCallId(room.callSession.call.id);\n        if (meeting) {\n            if (meeting) {\n                Room_logger.info('Already connected to meeting', {\n                    uuid: meeting.uuid,\n                    name: meeting.name\n                });\n                room.setMeetingUuid(meeting.uuid);\n                room.setName(meeting.name);\n            }\n        } else {\n            const sources = await service_getApiClient().dird.fetchConferenceSource('default');\n            const contacts = await service_getApiClient().dird.fetchConferenceContacts(sources.items[0]);\n            const conference = contacts?.find((contact)=>contact.numbers?.find((number)=>String(number.number) === String(extension)));\n            Room_logger.info('connected to room', {\n                sourceId: conference ? conference.sourceId : null,\n                name: conference ? conference.name : null\n            });\n            if (conference) {\n                room.setSourceId(parseInt(`${conference.sourceId}`, 10));\n                room.setName(`${conference.name}`);\n            }\n        }\n        return room;\n    }\n    static disconnect() {\n        Room_logger.info('static disconnection to room');\n        simple.Phone.disconnect();\n    }\n    async disconnect() {\n        Room_logger.info('disconnection to room called');\n        await simple.Phone.hangup(this.callSession);\n        this.callSession = void 0;\n        this.eventEmitter.emit(this.ON_DISCONNECTED, this);\n        this.connected = false;\n        this.unbind();\n        simple.Phone.off(this.ON_MESSAGE, this._boundOnMessage);\n        simple.Phone.off(this.ON_CHAT, this._boundOnChat);\n        simple.Phone.off(this.ON_SIGNAL, this._boundOnSignal);\n        simple.Phone.off(this.ON_VIDEO_INPUT_CHANGE, this._boundSaveLocalVideoStream);\n        simple.Phone.phone?.off(simple.Phone.phone.client.ON_REINVITE, this._boundOnReinvite);\n        simple.Websocket.off(this.CONFERENCE_USER_PARTICIPANT_JOINED, this._boundOnParticipantJoined);\n        simple.Websocket.off(this.CONFERENCE_USER_PARTICIPANT_LEFT, this._boundOnParticipantLeft);\n        simple.Websocket.off(this.MEETING_USER_PARTICIPANT_JOINED, this._boundOnParticipantJoined);\n        simple.Websocket.off(this.MEETING_USER_PARTICIPANT_LEFT, this._boundOnParticipantLeft);\n    }\n    setSourceId(sourceId) {\n        Room_logger.info('set room source id', {\n            sourceId\n        });\n        this.sourceId = sourceId;\n    }\n    setMeetingUuid(meetingUuid) {\n        Room_logger.info('set meeting uuid', {\n            meetingUuid\n        });\n        this.meetingUuid = meetingUuid;\n    }\n    setCallId(callId) {\n        Room_logger.info('set room call id', {\n            callId\n        });\n        if (callId) this.callId = callId;\n    }\n    setName(name) {\n        Room_logger.info('set room name', {\n            name\n        });\n        this.name = name;\n    }\n    sendMessage(body, sipSession = null) {\n        return simple.Phone.sendMessage(body, sipSession);\n    }\n    sendChat(content) {\n        return simple.Phone.sendChat(content);\n    }\n    sendSignal(content) {\n        return simple.Phone.sendSignal(content);\n    }\n    async startScreenSharing(constraints) {\n        Room_logger.info('start room screen sharing', {\n            constraints\n        });\n        const screensharingStream = await simple.Phone.startScreenSharing(constraints, this.callSession);\n        if (!screensharingStream) {\n            console.warn('screensharing stream is null (likely due to user cancellation)');\n            return null;\n        }\n        this._onScreenSharing();\n        return screensharingStream;\n    }\n    async stopScreenSharing(restoreLocalStream = true) {\n        Room_logger.info('stop room screen sharing');\n        await simple.Phone.stopScreenSharing(this.callSession, restoreLocalStream);\n        if (this.localParticipant) {\n            this._updateLocalParticipantStream();\n            this.localParticipant.onStopScreensharing();\n        }\n    }\n    turnCameraOff() {\n        Room_logger.info('turn room camera off');\n        simple.Phone.turnCameraOff(this.callSession);\n        if (this.localParticipant) this.localParticipant.onVideoMuted();\n    }\n    turnCameraOn() {\n        Room_logger.info('turn room camera on');\n        simple.Phone.turnCameraOn(this.callSession);\n        if (this.localParticipant) this.localParticipant.onVideoUnMuted();\n    }\n    mute() {\n        Room_logger.info('mute room');\n        simple.Phone.mute(this.callSession);\n        this.sendMuteStatus();\n    }\n    unmute() {\n        Room_logger.info('unmute room');\n        simple.Phone.unmute(this.callSession);\n        this.sendUnMuteStatus();\n    }\n    sendMuteStatus() {\n        if (this.localParticipant) this.localParticipant.onAudioMuted();\n    }\n    sendUnMuteStatus() {\n        if (this.localParticipant) this.localParticipant.onAudioUnMuted();\n    }\n    hold() {\n        Room_logger.info('hold room');\n        simple.Phone.hold(this.callSession);\n        if (this.localParticipant) this.localParticipant.onHold();\n    }\n    async resume() {\n        Room_logger.info('resume room');\n        const newStream = await simple.Phone.resume(this.callSession);\n        if (this.localParticipant) {\n            this._updateLocalParticipantStream();\n            this.localParticipant.onResume();\n            if (!newStream && this.localParticipant.screensharing) this.localParticipant.onStopScreensharing();\n        }\n    }\n    _updateLocalParticipantStream() {\n        const localStream = simple.Phone.getLocalStream(this.callSession);\n        if (this.localParticipant && localStream) {\n            const localWazoStream = new simple.Stream(localStream);\n            this.localParticipant.resetStreams([\n                localWazoStream\n            ]);\n        }\n    }\n    sendDTMF(tone) {\n        Room_logger.info('send room DTMF', {\n            tone\n        });\n        simple.Phone.sendDTMF(tone, this.callSession);\n    }\n    async sendReinvite(newConstraints = null) {\n        Room_logger.info('send room reinvite', {\n            callId: this.callSession ? this.callSession.getId() : null,\n            newConstraints\n        });\n        const wasScreensharing = this.localParticipant && this.localParticipant.screensharing;\n        simple.Phone.on(simple.Phone.ON_SHARE_SCREEN_STARTED, ()=>{\n            if (simple.Phone.phone && simple.Phone.phone.currentScreenShare) this._onScreenSharing();\n        });\n        const response = await simple.Phone.phone?.sendReinvite(this.callSession, newConstraints, true);\n        if (this.localParticipant && newConstraints && newConstraints.video) {\n            const localVideoStream = simple.Phone.phone?.getLocalVideoStream(this.callSession);\n            if (localVideoStream) this._associateStreamTo(localVideoStream, this.localParticipant);\n        } else if (this.localParticipant && wasScreensharing && newConstraints && !newConstraints.video) this.localParticipant.onStopScreensharing();\n        return response;\n    }\n    hasALocalVideoTrack() {\n        return simple.Phone.hasALocalVideoTrack(this.callSession);\n    }\n    getLocalStream() {\n        return simple.Phone.getLocalStream(this.callSession);\n    }\n    getRemoteStream() {\n        return simple.Phone.getRemoteStream(this.callSession);\n    }\n    getRemoteVideoStream() {\n        return simple.Phone.getRemoteVideoStream(this.callSession);\n    }\n    _bindEvents() {\n        if (!simple.Phone.phone || !simple.Phone.phone.currentSipSession) return;\n        simple.Phone.phone.currentSipSession.sessionDescriptionHandler?.on(\"setDescription\", ({ type, sdp: rawSdp })=>{\n            if ('offer' !== type) return;\n            this._mapMsid(rawSdp);\n        });\n        simple.Phone.phone.on(simple.Phone.phone.client.ON_REINVITE, this._boundOnReinvite);\n        this.on(this.ON_AUDIO_STREAM, async (stream)=>{\n            Room_logger.info('on room audio stream');\n            this.audioStream = stream;\n            if (this.roomAudioElement) this.roomAudioElement.srcObject = stream;\n            else {\n                const sessionId = simple.Phone.phone?.getSipSessionId(simple.Phone.phone?.currentSipSession);\n                this.roomAudioElement = await simple.Phone.phone?.createAudioElementFor(sessionId);\n                this.roomAudioElement.srcObject = stream;\n            }\n        });\n        this.on(this.ON_VIDEO_STREAM, (stream, streamId, event, sipSession)=>{\n            Room_logger.info('on room video stream', {\n                streamId\n            });\n            this._mapMsid(sipSession.body.body);\n            this._unassociatedVideoStreams[streamId] = stream;\n            const callId = this._getCallIdFromTrackId(streamId);\n            const participant = callId ? this._getParticipantFromCallId(callId) : null;\n            if (participant) this.__associateStreams(participant);\n        });\n        this.on(this.ON_REMOVE_STREAM, (stream)=>{\n            Room_logger.info('on room remove stream');\n            const participant = this.participants.find((someParticipant)=>someParticipant.streams.find((someStream)=>someStream && someStream.id === stream.id));\n            if (!participant) return;\n            participant.videoStreams = participant.videoStreams.filter((someStream)=>someStream.id !== stream.id);\n            participant.streams = participant.streams.filter((someStream)=>someStream.id !== stream.id);\n            participant.onStreamUnSubscribed(stream);\n        });\n    }\n    _onScreenSharing() {\n        if (this.localParticipant) this.localParticipant.onScreensharing();\n    }\n    _onReinvite(session, inviteRequest) {\n        const body = inviteRequest.body || inviteRequest.message.body;\n        if (body) {\n            this._mapMsid(body);\n            this.participants.forEach((participant)=>{\n                this.__associateStreams(participant);\n            });\n        }\n    }\n    _mapMsid(rawSdp) {\n        const sdp = external_sdp_transform_default().parse(rawSdp);\n        const labelMsidArray = sdp.media.filter((media)=>!!media.label).map(({ label, msid })=>({\n                label: String(label),\n                streamId: msid?.split(' ')[0],\n                trackId: msid?.split(' ')[1]\n            }));\n        labelMsidArray.forEach(({ label, streamId, trackId })=>{\n            this._callIdStreamIdMap[String(label)] = {\n                streamId,\n                trackId\n            };\n            const callId = String(label);\n            const participant = this._unassociatedParticipants[callId] || this._getParticipantFromCallId(callId);\n            if (participant) this.__associateStreams(participant);\n        });\n    }\n    _transferEvents() {\n        simple.Websocket.on(this.CONFERENCE_USER_PARTICIPANT_JOINED, this._boundOnParticipantJoined);\n        simple.Websocket.on(this.CONFERENCE_USER_PARTICIPANT_LEFT, this._boundOnParticipantLeft);\n        simple.Websocket.on(this.MEETING_USER_PARTICIPANT_JOINED, this._boundOnParticipantJoined);\n        simple.Websocket.on(this.MEETING_USER_PARTICIPANT_LEFT, this._boundOnParticipantLeft);\n        simple.Phone.on(this.ON_MESSAGE, this._boundOnMessage);\n        simple.Phone.on(this.ON_CHAT, this._boundOnChat);\n        simple.Phone.on(this.ON_SIGNAL, this._boundOnSignal);\n        simple.Phone.on(this.ON_VIDEO_INPUT_CHANGE, this._boundSaveLocalVideoStream);\n        [\n            this.ON_AUDIO_STREAM,\n            this.ON_VIDEO_STREAM,\n            this.ON_REMOVE_STREAM\n        ].forEach((event)=>simple.Phone.on(event, (...args)=>this.eventEmitter.emit.apply(this.eventEmitter, [\n                    event,\n                    ...args\n                ])));\n    }\n    _onMessage(message) {\n        if ('MESSAGE' !== message.method) return null;\n        let body;\n        try {\n            body = JSON.parse(message.body);\n        } catch (e) {\n            return null;\n        }\n        switch(body.type){\n            case 'ConfbridgeTalking':\n                {\n                    const channel = body.channels[0];\n                    const { id: callId, talking_status: talkingStatus } = channel;\n                    const isTalking = 'on' === talkingStatus;\n                    const participantIdx = this.participants.findIndex((participant)=>participant.callId === callId);\n                    if (-1 === participantIdx) return;\n                    this.participants[participantIdx].onTalking(isTalking);\n                    break;\n                }\n            default:\n        }\n        this.eventEmitter.emit(this.ON_MESSAGE, body);\n        return body;\n    }\n    _onChat(content) {\n        this.eventEmitter.emit(this.ON_CHAT, content);\n    }\n    _onSignal(content) {\n        const { type } = content;\n        switch(type){\n            case SIGNAL_TYPE_PARTICIPANT_UPDATE:\n                {\n                    const { status } = content;\n                    const participant = this._getParticipantFromCallId(status.callId);\n                    if (participant) participant.updateStatus(status, false);\n                    break;\n                }\n            case SIGNAL_TYPE_PARTICIPANT_REQUEST:\n                {\n                    const { callId, origin } = content;\n                    if (this.localParticipant && (!callId || callId === this.localParticipant.callId)) this.localParticipant.broadcastStatus(null, true);\n                    const requester = this._getParticipantFromCallId(origin.callId);\n                    if (requester) {\n                        Room_logger.info('trigger room requester status', {\n                            origin\n                        });\n                        requester.triggerUpdate('REQUESTER_UPDATE');\n                    }\n                    break;\n                }\n            case simple.Phone.ON_MESSAGE_TRACK_UPDATED:\n                {\n                    const { callId, update } = content;\n                    const participantIdx = this.participants.findIndex((p)=>p.callId === callId);\n                    if (-1 !== participantIdx) this.participants[participantIdx] = this._onParticipantTrackUpdate(this.participants[participantIdx], update);\n                    break;\n                }\n            default:\n                console.warn('uncaught signal', content);\n        }\n        this.eventEmitter.emit(simple.Phone.ON_SIGNAL, content);\n    }\n    async _onParticipantJoined(payload) {\n        const participant = payload.data;\n        const session = simple.Auth.getSession();\n        let participants = [];\n        if (participant.user_uuid === session?.uuid) {\n            Room_logger.info('room current user joined');\n            const conferenceId = this.sourceId || payload.data.conference_id;\n            let response;\n            try {\n                if (this.meetingUuid) {\n                    Room_logger.info('fetching meeting participants', {\n                        meetingUuid: this.meetingUuid\n                    });\n                    response = await service_getApiClient().calld.getMeetingParticipantsAsUser(this.meetingUuid);\n                } else {\n                    Room_logger.info('fetching conference participants', {\n                        conferenceId\n                    });\n                    response = await service_getApiClient().calld.getConferenceParticipantsAsUser(conferenceId);\n                }\n            } catch (e) {\n                Room_logger.error('room participants fetching, error', e);\n            }\n            if (response) {\n                Room_logger.info('conference participants fetched', {\n                    nb: response.items.length\n                });\n                participants = response.items.map((item)=>{\n                    const isMe = item.call_id === this.callId;\n                    return isMe && item.call_id ? new simple.LocalParticipant(this, item, this.extra) : new simple.RemoteParticipant(this, item);\n                });\n                this.participants = participants;\n                const localParticipant = participants.find((someParticipant)=>someParticipant instanceof simple.LocalParticipant);\n                if (!this.localParticipant && localParticipant) this._onLocalParticipantJoined(localParticipant);\n                participants.forEach((someParticipant)=>this._isParticipantJoining(someParticipant));\n                this.eventEmitter.emit(this.ON_JOINED, localParticipant, participants);\n            }\n            return this.participants;\n        }\n        const remoteParticipant = this.participants.some((p)=>p.callId === participant.call_id) ? null : new simple.RemoteParticipant(this, participant);\n        Room_logger.info('other room user joined', {\n            callId: participant.call_id,\n            remoteParticipant: !!remoteParticipant\n        });\n        if (remoteParticipant) {\n            this.participants.push(remoteParticipant);\n            this._isParticipantJoining(remoteParticipant);\n        }\n        return remoteParticipant;\n    }\n    _onLocalParticipantJoined(localParticipant) {\n        this.localParticipant = localParticipant;\n        const localVideoStream = this._getLocalVideoStream();\n        if (localVideoStream) this._saveLocalVideoStream(localVideoStream);\n        this.connected = true;\n        localParticipant.broadcastStatus(null, true);\n        if (this.localParticipant) this.sendSignal({\n            type: SIGNAL_TYPE_PARTICIPANT_REQUEST,\n            origin: this.localParticipant.getStatus()\n        });\n    }\n    _isParticipantJoining(participant) {\n        this.__associateStreams(participant);\n        if (participant instanceof room_RemoteParticipant) this.eventEmitter.emit(this.CONFERENCE_USER_PARTICIPANT_JOINED, participant);\n    }\n    _saveLocalVideoStream(stream) {\n        const { localParticipant } = this;\n        if (!localParticipant) return;\n        const videoStream = new simple.Stream(stream, localParticipant);\n        if (videoStream) {\n            localParticipant.resetStreams([\n                videoStream\n            ]);\n            localParticipant.onStreamSubscribed(videoStream);\n        }\n        return videoStream;\n    }\n    _onParticipantLeft(payload) {\n        const leftParticipant = this.participants.find((participant)=>participant && participant.callId === payload.data.call_id);\n        if (leftParticipant) leftParticipant.onDisconnect();\n        this.participants = this.participants.filter((participant)=>participant && participant.callId !== payload.data.call_id);\n        this.eventEmitter.emit(this.CONFERENCE_USER_PARTICIPANT_LEFT, leftParticipant);\n    }\n    _onParticipantTrackUpdate(oldParticipant, update) {\n        const newParticipant = oldParticipant;\n        const { trackId, streamId } = this._callIdStreamIdMap[newParticipant.callId] || {};\n        const pc = simple.Phone.phone?.currentSipSession?.sessionDescriptionHandler?.peerConnection;\n        const stream = pc.getRemoteStreams().find((someStream)=>someStream.id === streamId || someStream.getTracks().some((track)=>track.id === trackId));\n        if ('downgrade' === update) {\n            newParticipant.resetStreams([]);\n            newParticipant.onStreamUnSubscribed(stream);\n            return newParticipant;\n        }\n        if (stream) this._associateStreamTo(stream, newParticipant);\n        return newParticipant;\n    }\n    __associateStreams(participant) {\n        const { trackId } = this._callIdStreamIdMap[participant.callId] || {};\n        if (!trackId) {\n            this._unassociatedParticipants[participant.callId] = participant;\n            return;\n        }\n        if (!trackId || !participant || !this.localParticipant || participant.callId === this.localParticipant.callId) return;\n        const streamId = this._getStreamIdFrTrackId(trackId);\n        const key = this._getUnassociatedMapIdFromTrackIdOrStreamId(trackId, streamId);\n        const stream = key ? this._unassociatedVideoStreams[key] : null;\n        if (stream) {\n            this._associateStreamTo(stream, participant);\n            if (key) delete this._unassociatedVideoStreams[key];\n            delete this._unassociatedParticipants[participant.callId];\n        }\n    }\n    _getUnassociatedMapIdFromTrackIdOrStreamId(trackId, streamId) {\n        if (trackId in this._unassociatedVideoStreams) return trackId;\n        if (streamId && streamId in this._unassociatedVideoStreams) return streamId;\n        const idx = Object.values(this._unassociatedVideoStreams).findIndex((stream)=>stream && stream.id === streamId);\n        return -1 === idx ? null : Object.keys(this._unassociatedVideoStreams)[idx];\n    }\n    _getStreamIdFrTrackId(trackId) {\n        const mapping = Object.values(this._callIdStreamIdMap).find((map)=>map.trackId === trackId);\n        return mapping ? mapping.streamId : null;\n    }\n    _associateStreamTo(rawStream, participant) {\n        const stream = new simple.Stream(rawStream, participant);\n        participant.streams.push(stream);\n        participant.videoStreams.push(stream);\n        participant.onStreamSubscribed(stream);\n    }\n    _getCallIdFromTrackId(trackId) {\n        return Object.keys(this._callIdStreamIdMap).find((key)=>this._callIdStreamIdMap[key].trackId === trackId);\n    }\n    _getParticipantFromCallId(callId) {\n        return this.participants.find((participant)=>participant.callId === callId);\n    }\n    _getLocalVideoStream() {\n        return simple.Phone.getLocalVideoStream(this.callSession);\n    }\n}\nconst room_Room = Room_Room;\nconst SipRoom_logger = IssueReporter.loggerFor('sdk-sip-room');\nclass SipRoom extends room_Room {\n    static async connect({ extension, constraints, audioOnly = false, extra, room }) {\n        SipRoom_logger.info('connecting to sip room', {\n            extension,\n            audioOnly,\n            room: !!room\n        });\n        if (!room) {\n            await simple.Phone.connect({\n                media: constraints\n            });\n            const withCamera = constraints && !!constraints.video;\n            const callSession = await simple.Phone.call(extension, withCamera, null, audioOnly, true);\n            room = new SipRoom(callSession, extension, null, null, extra);\n        }\n        if (room && room.callSession && room.callSession.call) room.setCallId(room.callSession.call.id);\n        SipRoom_logger.info('connected to room', {\n            extension: room.extension\n        });\n        return room;\n    }\n    mute() {\n        SipRoom_logger.info('mute sip room');\n        simple.Phone.mute(this.callSession, false);\n        this.sendMuteStatus();\n    }\n    unmute() {\n        SipRoom_logger.info('unmute sip room');\n        simple.Phone.unmute(this.callSession, false);\n        this.sendUnMuteStatus();\n    }\n    getLocalGuestName() {\n        return simple.Phone.phone?.client.userAgent?.options.displayName || null;\n    }\n    _transferEvents() {\n        simple.Phone.on(this.ON_MESSAGE, this._boundOnMessage);\n        simple.Phone.on(this.ON_CHAT, this._boundOnChat);\n        simple.Phone.on(this.ON_SIGNAL, this._boundOnSignal);\n        simple.Phone.on(this.ON_VIDEO_INPUT_CHANGE, this._boundSaveLocalVideoStream);\n        [\n            this.ON_AUDIO_STREAM,\n            this.ON_VIDEO_STREAM,\n            this.ON_REMOVE_STREAM\n        ].forEach((event)=>simple.Phone.on(event, (...args)=>this.eventEmitter.emit.apply(this.eventEmitter, [\n                    event,\n                    ...args\n                ])));\n    }\n    _onMessage(message) {\n        const body = super._onMessage(message);\n        if (!body) return;\n        const getChannel = ()=>body.channels[0];\n        switch(body.type){\n            case 'ConfbridgeWelcome':\n                body.channels.forEach((channel)=>{\n                    this._onParticipantJoined(channel);\n                });\n                break;\n            case 'ConfbridgeJoin':\n                {\n                    const channel = getChannel();\n                    this._onParticipantJoined(channel);\n                    break;\n                }\n            case 'ConfbridgeLeave':\n                {\n                    const channel = getChannel();\n                    this._onParticipantLeft({\n                        data: {\n                            call_id: channel.id\n                        }\n                    });\n                    break;\n                }\n            default:\n                break;\n        }\n    }\n    async _onParticipantJoined(channel) {\n        const isLocal = channel.channelvars.WAZO_SIP_CALL_ID === this._getCurrentSipCallIs();\n        const callId = channel.id;\n        const ParticipantClass = isLocal ? simple.LocalParticipant : simple.RemoteParticipant;\n        const name = channel.caller ? channel.caller.name : null;\n        const extra = isLocal ? {\n            guestName: this.getLocalGuestName()\n        } : {};\n        const participant = new ParticipantClass(this, {\n            caller_id_name: name,\n            call_id: callId\n        }, extra);\n        const participantIdx = this.participants.findIndex((other)=>other.callId === participant.callId);\n        if (-1 !== participantIdx && name) {\n            this.participants[participantIdx].name = name;\n            return;\n        }\n        if (isLocal) {\n            if (this.callSession) this.callSession.ringing = false;\n            this._onLocalParticipantJoined(participant);\n            setTimeout(()=>{\n                this.eventEmitter.emit(this.ON_JOINED, participant, this.participants);\n            }, 1000);\n        }\n        this.participants.push(participant);\n        this._isParticipantJoining(participant);\n        return participant;\n    }\n    _getCurrentSipCallIs() {\n        return simple.Phone.getSipSessionId(simple.Phone.phone?.currentSipSession);\n    }\n}\nconst room_SipRoom = SipRoom;\nclass Stream_Stream {\n    htmlStream;\n    participant;\n    static detachStream(stream) {\n        stream.getTracks().filter((track)=>track.enabled).forEach((track)=>track.stop());\n    }\n    constructor(htmlStream, participant){\n        this.htmlStream = htmlStream;\n        this.participant = participant;\n    }\n    attach(rawElement) {\n        const element = rawElement || document.createElement('video');\n        const isLocal = this.participant instanceof simple.LocalParticipant;\n        element.autoplay = true;\n        element.srcObject = this.htmlStream;\n        element.muted = isLocal;\n        if (isLocal) element.style.transform = 'scale(-1, 1)';\n        element.onloadedmetadata = ()=>{\n            const tracks = this.htmlStream ? this.htmlStream.getVideoTracks() : [];\n            tracks.forEach((track)=>{\n                track.enabled = true;\n                track.loaded = true;\n            });\n        };\n        return element;\n    }\n    detach() {\n        Stream_Stream.detachStream(this.htmlStream);\n    }\n    hasVideo() {\n        if (!this.htmlStream) return false;\n        return this.htmlStream.getTracks().some((track)=>'video' === track.kind && 'ended' !== track.readyState);\n    }\n    get id() {\n        return this.htmlStream ? this.htmlStream.id : null;\n    }\n}\nconst Stream = Stream_Stream;\nconst createLocalStream = async (kind, options = {})=>{\n    const createOptions = {};\n    createOptions[kind] = !(Object.keys(options).length > 0) || options;\n    const mediaStream = await navigator.mediaDevices.getUserMedia(createOptions);\n    return new simple.Stream(mediaStream, new simple.LocalParticipant(null, {\n        call_id: 'some-call-id',\n        caller_id_name: 'some-call-id-name'\n    }));\n};\nconst createLocalVideoStream = async (options)=>createLocalStream('video', options);\nconst createLocalAudioStream = async (options)=>createLocalStream('audio', options);\nconst { SOCKET_EVENTS: Websocket_SOCKET_EVENTS, ...OTHER_EVENTS } = websocket_client_namespaceObject;\nconst ALL_EVENTS = [\n    ...Object.values(Websocket_SOCKET_EVENTS),\n    ...Object.values(OTHER_EVENTS)\n];\nconst Websocket_logger = IssueReporter.loggerFor('simple-ws-client');\nclass Websocket extends Emitter {\n    ws;\n    eventLists;\n    CONFERENCE_USER_PARTICIPANT_JOINED;\n    CONFERENCE_USER_PARTICIPANT_LEFT;\n    MEETING_USER_PARTICIPANT_JOINED;\n    MEETING_USER_PARTICIPANT_LEFT;\n    CALL_CREATED;\n    constructor(){\n        super();\n        Object.keys(OTHER_EVENTS).forEach((key)=>{\n            this[key] = OTHER_EVENTS[key];\n        });\n        Object.keys(Websocket_SOCKET_EVENTS).forEach((key)=>{\n            this[key] = Websocket_SOCKET_EVENTS[key];\n        });\n        this.eventLists = websocket_client.eventLists;\n        this.ws = null;\n    }\n    open(host, session) {\n        Websocket_logger.info('open simple WebSocket', {\n            host,\n            token: obfuscateToken(session.token)\n        });\n        this.ws = new websocket_client({\n            host,\n            token: session.token,\n            events: [\n                '*'\n            ],\n            version: 2,\n            session\n        }, {\n            rejectUnauthorized: false,\n            binaryType: 'arraybuffer'\n        });\n        this.ws.connect();\n        ALL_EVENTS.forEach((event)=>{\n            if (!this.ws) return;\n            this.ws.on(event, (payload)=>{\n                this.eventEmitter.emit(event, payload);\n            });\n        });\n    }\n    updateToken(token) {\n        Websocket_logger.info('update token via simple Websocket', {\n            token,\n            ws: !!this.ws\n        });\n        if (!this.ws) return;\n        this.ws.updateToken(token);\n    }\n    isOpen() {\n        return this.ws?.isConnected() || false;\n    }\n    close(force = false) {\n        Websocket_logger.info('Closing event transport websocket', {\n            force,\n            ws: !!this.ws\n        });\n        if (this.ws) this.ws.close(force);\n        this.unbind();\n    }\n}\nif (!__webpack_require__.g.wazoWebsocketInstance) __webpack_require__.g.wazoWebsocketInstance = new Websocket();\nconst simple_Websocket = __webpack_require__.g.wazoWebsocketInstance;\nconst simple_Wazo = {\n    Auth: Auth,\n    Phone: Phone,\n    Websocket: simple_Websocket,\n    Room: room_Room,\n    SipRoom: room_SipRoom,\n    RemoteParticipant: room_RemoteParticipant,\n    LocalParticipant: LocalParticipant,\n    Participant: Participant,\n    Stream: Stream,\n    createLocalVideoStream: createLocalVideoStream,\n    createLocalAudioStream: createLocalAudioStream,\n    Configuration: simple_Configuration,\n    Directory: Directory,\n    getApiClient: service_getApiClient,\n    IssueReporter: IssueReporter,\n    loggerFor: IssueReporter.loggerFor.bind(IssueReporter),\n    Features: domain_Features,\n    Checker: checker_Checker,\n    domain: {\n        BadResponse: BadResponse,\n        ServerError: ServerError,\n        Call: Call,\n        CallLog: CallLog,\n        CTIPhone: CTIPhone,\n        Recording: Recording,\n        ChatMessage: ChatMessage,\n        ChatRoom: ChatRoom,\n        Contact: Contact,\n        ForwardOption: ForwardOption,\n        Line: Line,\n        NotificationOptions: NotificationOptions,\n        Profile: Profile,\n        Session: Session,\n        Voicemail: Voicemail,\n        Relocation: domain_Relocation,\n        ConferenceRoom: Room,\n        CallSession: CallSession,\n        IndirectTransfer: IndirectTransfer,\n        SwitchboardCall: domain_SwitchboardCall,\n        WebRTCPhone: WebRTCPhone,\n        Meeting: Meeting\n    },\n    get api () {\n        return service_getApiClient();\n    },\n    get agentd () {\n        return service_getApiClient().agentd;\n    },\n    get amid () {\n        return service_getApiClient().amid;\n    },\n    get application () {\n        return service_getApiClient().application;\n    },\n    get auth () {\n        return service_getApiClient().auth;\n    },\n    get callLogd () {\n        return service_getApiClient().callLogd;\n    },\n    get calld () {\n        return service_getApiClient().calld;\n    },\n    get chatd () {\n        return service_getApiClient().chatd;\n    },\n    get confd () {\n        return service_getApiClient().confd;\n    },\n    get dird () {\n        return service_getApiClient().dird;\n    },\n    get webhookd () {\n        return service_getApiClient().webhookd;\n    },\n    InvalidSubscription: InvalidSubscription,\n    InvalidAuthorization: InvalidAuthorization,\n    CanceledCallError: CanceledCallError,\n    SFUNotAvailableError: SFUNotAvailableError,\n    NoTenantIdError: NoTenantIdError,\n    NoDomainNameError: NoDomainNameError,\n    NoSamlRouteError: NoSamlRouteError,\n    SamlConfigError: SamlConfigError\n};\nif ('undefined' != typeof window) window.Wazo = simple_Wazo;\nif (void 0 !== __webpack_require__.g) __webpack_require__.g.Wazo = simple_Wazo;\nconst simple = simple_Wazo;\nconst Country = {\n    AUSTRALIA: 'AU',\n    BELGIUM: 'BE',\n    CANADA: 'CA',\n    FRANCE: 'FR',\n    GERMANY: 'DE',\n    ISRAEL: 'IL',\n    ITALY: 'IT',\n    LUXEMBOURG: 'LU',\n    MALAYSIA: 'MY',\n    MONACO: 'MC',\n    NETHERLANDS: 'NL',\n    POLAND: 'PL',\n    PORTUGAL: 'PT',\n    UNITED_KINGDOM: 'GB',\n    UNITED_STATES: 'US',\n    SPAIN: 'ES',\n    SWITZERLAND: 'CH'\n};\nclass DebugDevice {\n    connectToCall() {\n        console.info('DebugDevice - Connected to call');\n    }\n    disconnectFromCall() {\n        console.info('DebugDevice - Disconnected from call');\n    }\n    ringback() {\n        console.info('DebugDevice - Ringback');\n    }\n    stopRingback() {\n        console.info('DebugDevice - Stop ringback');\n    }\n    playRingtone() {\n        console.info('DebugDevice - Play ringtone');\n    }\n    stopRingtone() {\n        console.info('DebugDevice - Stop ringtone');\n    }\n    mute() {\n        console.info('DebugDevice - Mute');\n    }\n    unmute() {\n        console.info('DebugDevice - Unmute');\n    }\n    putOnSpeaker() {\n        console.info('DebugDevice - Put on speaker');\n    }\n    putOffSpeaker() {\n        console.info('DebugDevice - Put off speaker');\n    }\n}\nconst external_libphonenumber_js_namespaceObject = require(\"libphonenumber-js\");\nconst EXTRA_CHAR_REGEXP = /[^+*\\d]/g;\nconst DEFAULT_GUESSING_COUNTRIES = [\n    'US',\n    'FR',\n    'GB',\n    'AU'\n];\nconst shouldBeFormatted = (number)=>{\n    if (!number || number.length <= 5) return false;\n    return !number.includes('#') && !number.includes('*') && !number.match(/[aA-zZ]/);\n};\nconst isSameCountry = (country1, country2)=>{\n    if ('US' === country1 && 'CA' === country2 || 'US' === country2 && 'CA' === country1) return true;\n    return country1 === country2;\n};\nconst guessParsePhoneNumber = (number, defaultCountry, guessingCountries = DEFAULT_GUESSING_COUNTRIES)=>{\n    const mergedCountries = [\n        ...new Set([\n            defaultCountry,\n            ...guessingCountries\n        ])\n    ].filter(Boolean);\n    let parsedNumber;\n    for(let i = 0; i < mergedCountries.length; i++){\n        const country = mergedCountries[i];\n        parsedNumber = (0, external_libphonenumber_js_namespaceObject.parsePhoneNumber)(number, country);\n        if (parsedNumber.isValid()) break;\n    }\n    return parsedNumber;\n};\nconst getDisplayableNumber = (rawNumber, country, asYouType = false, guessingCountries = DEFAULT_GUESSING_COUNTRIES)=>{\n    if (!rawNumber) return rawNumber;\n    const number = String(rawNumber);\n    if (!shouldBeFormatted(number)) return number;\n    let displayValue = '';\n    if (asYouType) displayValue = new external_libphonenumber_js_namespaceObject.AsYouType(country).input(number);\n    else try {\n        const parsedNumber = guessParsePhoneNumber(number, country, guessingCountries);\n        displayValue = parsedNumber?.isValid() ? isSameCountry(String(parsedNumber.country), country) ? parsedNumber.formatNational() : parsedNumber.formatInternational() : rawNumber;\n    } catch (error) {\n        displayValue = rawNumber;\n    }\n    return displayValue;\n};\nconst parsePhoneNumber = (phoneNumber)=>phoneNumber.replace(EXTRA_CHAR_REGEXP, '');\nconst getCallableNumber = (number, country)=>{\n    try {\n        const callableNumber = country ? getDisplayableNumber(number, country) : number;\n        return parsePhoneNumber(callableNumber);\n    } catch (_) {\n        return number;\n    }\n};\nconst { SOCKET_EVENTS: types_SOCKET_EVENTS, ...types_OTHER_EVENTS } = websocket_client_namespaceObject;\nconst src_0 = simple;\nvar __webpack_export_target__ = exports;\nfor(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];\nif (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {\n    value: true\n});\n"]}