@nethesis/phone-island 0.7.102 → 0.7.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var o=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var a=require("../events/SocketEvents.js"),u=require("../utils/genericFunctions/timestamp.js"),s=require("../node_modules/react-redux/es/hooks/useDispatch.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=i(n);exports.Socket=function(i){var d=i.hostName,m=i.username,p=i.authToken,f=i.reload,g=i.reloadedCallback,b=i.children,k=s.useDispatch(),v=n.useRef(),h=n.useRef();return n.useEffect((function(){return h.current=t.io(d,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),h.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(h.current.id))})),h.current.on("disconnect",(function(e){console.log("Socket disconnect - reason: ".concat(e))})),h.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),h.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),h.current.io.on("reconnect",(function(e){console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(h.current.id,")"))})),h.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),h.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),h.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),v.current=setInterval((function(){var e=Date.now();h.current.volatile.emit("ping",c.withTimeout((function(){k.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){k.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),7e3))}),7e3),h.current.on("connect",(function(){console.log("Socket on: "+d+" is connected!"),h.current.emit("login",{accessKeyId:"".concat(m),token:p,uaType:"desktop"})})),h.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),h.current.on("userMainPresenceUpdate",(function(n){o.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),a.dispatchMainPresence(n)})),h.current.on("extenUpdate",(function(e){k.users.updateExtension(e),a.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===m&&(function(e,n){var t=o.store.getState().currentCall,c=t.transferring,a=t.transferSwitching,s=t.transferCalls;if(Object.keys(n).length>0&&e.status){var i=o.store.getState().users.extensions;switch(e.status){case"ringing":k.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""});break;case"busy":if(n&&n.connected)k.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""}),k.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(u.getTimestampInSeconds())});else if(n&&!n.connected&&c&&!a){var l=s.find((function(e){return e.number===n.counterpartNum}));!n.connected&&l&&(k.currentCall.updateCurrentCall({transferring:!1}),k.currentCall.updateTransferSwitching(!1))}n&&!n.connected&&"out"===n.direction&&k.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""});case"onhold":var d=n.counterpartName,m=n.counterpartNum,p=n.startTime;c&&m&&d&&"<unknown>"!==d&&(k.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:m,startTime:"".concat(u.getTimestampInSeconds())}),k.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:m,startTime:"".concat(p/1e3)}),k.island.setIslandView("call"))}}}(e,n),k.currentUser.updateConversations(e))})),h.current.on("queueUpdate",(function(e){a.dispatchQueueUpdate(e)})),h.current.on("queueMemberUpdate",(function(e){a.dispatchQueueMemberUpdate(e)})),h.current.on("takeOver",(function(){a.dispatchAlreadyLogin()})),h.current.on("serverReload",(function(){a.dispatchServerReload()})),function(){clearInterval(v.current),h.current.close()}}),[]),n.useEffect((function(){f&&(console.info("websocket reconnection"),h.current.disconnect(),h.current.connect(),g())}),[f]),l.default.createElement(l.default.Fragment,null,b)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/eventDispatch.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var a=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var u=require("../events/SocketEvents.js"),s=require("../utils/genericFunctions/timestamp.js"),i=require("../node_modules/react-redux/es/hooks/useDispatch.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=l(n);exports.Socket=function(l){var m=l.hostName,p=l.username,f=l.authToken,g=l.reload,b=l.reloadedCallback,k=l.children,v=i.useDispatch(),h=n.useRef(),N=n.useRef();return n.useEffect((function(){return N.current=t.io(m,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),N.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(N.current.id))})),N.current.on("disconnect",(function(e){console.log("Socket disconnect - reason: ".concat(e)),c.eventDispatch("phone-island-socket-disconnected",{})})),N.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),N.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),N.current.io.on("reconnect",(function(e){console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(N.current.id,")"))})),N.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),N.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),N.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),h.current=setInterval((function(){var e=Date.now();N.current.volatile.emit("ping",o.withTimeout((function(){v.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){v.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),7e3))}),7e3),N.current.on("connect",(function(){console.log("Socket on: "+m+" is connected!"),N.current.emit("login",{accessKeyId:"".concat(p),token:f,uaType:"desktop"})})),N.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),N.current.on("userMainPresenceUpdate",(function(n){a.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),u.dispatchMainPresence(n)})),N.current.on("extenUpdate",(function(e){v.users.updateExtension(e),u.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===p&&(function(e,n){var t=a.store.getState().currentCall,c=t.transferring,o=t.transferSwitching,u=t.transferCalls;if(Object.keys(n).length>0&&e.status){var i=a.store.getState().users.extensions;switch(e.status){case"ringing":v.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""});break;case"busy":if(n&&n.connected)v.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""}),v.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(s.getTimestampInSeconds())});else if(n&&!n.connected&&c&&!o){var l=u.find((function(e){return e.number===n.counterpartNum}));!n.connected&&l&&(v.currentCall.updateCurrentCall({transferring:!1}),v.currentCall.updateTransferSwitching(!1))}n&&!n.connected&&"out"===n.direction&&v.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""});case"onhold":var d=n.counterpartName,m=n.counterpartNum,p=n.startTime;c&&m&&d&&"<unknown>"!==d&&(v.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:m,startTime:"".concat(s.getTimestampInSeconds())}),v.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:m,startTime:"".concat(p/1e3)}),v.island.setIslandView("call"))}}}(e,n),v.currentUser.updateConversations(e))})),N.current.on("queueUpdate",(function(e){u.dispatchQueueUpdate(e)})),N.current.on("queueMemberUpdate",(function(e){u.dispatchQueueMemberUpdate(e)})),N.current.on("takeOver",(function(){u.dispatchAlreadyLogin()})),N.current.on("serverReload",(function(){u.dispatchServerReload()})),function(){clearInterval(h.current),N.current.close()}}),[]),n.useEffect((function(){g&&(console.info("websocket reconnection"),N.current.disconnect(),N.current.connect(),b())}),[g]),d.default.createElement(d.default.Fragment,null,k)};
2
2
  //# sourceMappingURL=Socket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n} from '../events'\nimport { store } from '../store'\nimport { withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n // if (status) {\n // if (res.status == 'online' && userTotallyFree()) {\n // // Stop ringing sounds\n // dispatch.player.stopAudioPlayer()\n // // Reset current call info\n // dispatch.currentCall.reset()\n // }\n // }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io(hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n })\n socket.current.on('disconnect', (reason) => {\n console.log(`Socket disconnect - reason: ${reason}`)\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n console.debug('Socket is unreachable!')\n },\n 7 * 1000, // Waits for the response 7 seconds\n ),\n )\n }, 7 * 1000) // Executes a new check every 7 seconds\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReload', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useEffect","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","concat","id","reason","log","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","res","store","users","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conv","conversations","Object","keys","getState","currentCall","transferring","transferSwitching","transferCalls","length","status","extensions","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","inTransferCalls","find","item","updateTransferSwitching","direction","checkOutgoingUpdate","outgoingSocket","counterpartName","island","setIslandView","handleCurrentUserEvents","currentUser","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n // if (status) {\n // if (res.status == 'online' && userTotallyFree()) {\n // // Stop ringing sounds\n // dispatch.player.stopAudioPlayer()\n // // Reset current call info\n // dispatch.currentCall.reset()\n // }\n // }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io(hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n })\n socket.current.on('disconnect', (reason) => {\n console.log(`Socket disconnect - reason: ${reason}`)\n eventDispatch('phone-island-socket-disconnected', {})\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n console.debug('Socket is unreachable!')\n },\n 7 * 1000, // Waits for the response 7 seconds\n ),\n )\n }, 7 * 1000) // Executes a new check every 7 seconds\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReload', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useEffect","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","concat","id","reason","log","eventDispatch","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","res","store","users","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conv","conversations","Object","keys","getState","currentCall","transferring","transferSwitching","transferCalls","length","status","extensions","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","inTransferCalls","find","item","updateTransferSwitching","direction","checkOutgoingUpdate","outgoingSocket","counterpartName","island","setIslandView","handleCurrentUserEvents","currentUser","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../devices/devices.js"),r=require("../webrtc/janus.js"),n=require("../webrtc/messages.js"),o=require("../../store/index.js"),i=require("../user/default_device.js"),a=require("../../services/astproxy.js"),s=require("../../static/dtmf/index.js");function u(o){var i=this;t.getSupportedDevices((function(){return e.__awaiter(i,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return r.default.log("This is a SIP call"),[4,n.call(o,{audio:{mandatory:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,googEchoCancellation:!0,googAutoGainControl:!0,googNoiseSuppression:!0,googHighpassFilter:!0,googTypingNoiseDetection:!0,googNoiseReduction:!0,volume:1}},audioSend:!0,audioRecv:!0,videoSend:!1,videoRecv:!1})];case 1:return e.sent(),[2]}}))}))}))}exports.answerIncomingCall=function(){i.isWebRTC()&&n.answerWebRTC()},exports.attendedTransfer=function(t){return e.__awaiter(this,void 0,void 0,(function(){var r,n;return e.__generator(this,(function(e){switch(e.label){case 0:return r=o.store.getState().currentCall.conversationId,n=o.store.getState().currentUser.default_device,r&&(null==n?void 0:n.id)&&t?[4,a.attendedTransfer({convid:r,to:t,endpointId:n.id})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,t){u("sip:".concat(e,"@").concat(t))},exports.callSipURI=u,exports.hangupAllExtensions=function(){var e=o.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){a.hangupConversation({convid:e,endpointId:t})}))};for(var r in e)t(r)},exports.hangupCurrentCall=function(){var e=o.store.getState().currentCall,t=e.outgoing,r=e.accepted;(t||r)&&n.hangup(),o.store.dispatch.player.stopAudioPlayer(),o.store.dispatch.currentCall.reset()},exports.muteCurrentCall=function(){i.isWebRTC()&&n.muteWebRTC()&&o.store.dispatch.currentCall.updateCurrentCall({muted:!0})},exports.park=function(){var e,t,r,n,i=null===(t=null===(e=null===o.store||void 0===o.store?void 0:o.store.getState())||void 0===e?void 0:e.currentCall)||void 0===t?void 0:t.conversationId;if(i){var s=i.split(">"),u=s[0],d=null==u?void 0:u.match(/\/(\d+)-/),l=s[1],c=null==l?void 0:l.match(/\/(\d+)-/),p=null===(n=null===(r=null===o.store||void 0===o.store?void 0:o.store.getState())||void 0===r?void 0:r.currentUser)||void 0===n?void 0:n.endpoints;if(Array.isArray(p.extension)){var v=p.extension.map((function(e){return e.id}));if(-1!==v.indexOf(d[1])){var C=d[1];a.parkConversation({applicantId:C,convid:i,endpointId:C})}else if(-1!==v.indexOf(c[1])){C=c[1];a.parkConversation({applicantId:C,convid:i,endpointId:C})}}}},exports.pauseCurrentCall=function(){i.isWebRTC()&&n.pauseWebRTC()&&(o.store.dispatch.currentCall.updateCurrentCall({paused:!0}),o.store.dispatch.player.pauseRemoteAudio())},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),o.store.dispatch.player.updateStartAudioPlayer({src:s.default["dtmf_".concat(e)]})},exports.unmuteCurrentCall=function(){i.isWebRTC()&&n.unmuteWebRTC()&&o.store.dispatch.currentCall.updateCurrentCall({muted:!1})},exports.unpauseCurrentCall=function(){i.isWebRTC()&&n.unpauseWebRTC()&&(o.store.dispatch.currentCall.updateCurrentCall({paused:!1}),o.store.dispatch.player.playRemoteAudio())};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../devices/devices.js"),r=require("../webrtc/janus.js"),n=require("../webrtc/messages.js"),o=require("../../store/index.js"),i=require("../user/default_device.js"),a=require("../../services/astproxy.js"),s=require("../../static/dtmf/index.js");function u(o){var i=this;t.getSupportedDevices((function(){return e.__awaiter(i,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return r.default.log("This is a SIP call"),[4,n.call(o,{audio:{mandatory:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,googEchoCancellation:!0,googAutoGainControl:!0,googNoiseSuppression:!0,googHighpassFilter:!0,googTypingNoiseDetection:!0,googNoiseReduction:!0,volume:1}},audioSend:!0,audioRecv:!0,videoSend:!1,videoRecv:!1})];case 1:return e.sent(),[2]}}))}))}))}exports.answerIncomingCall=function(){i.isWebRTC()&&n.answerWebRTC()},exports.attendedTransfer=function(t){return e.__awaiter(this,void 0,void 0,(function(){var r,n;return e.__generator(this,(function(e){switch(e.label){case 0:return r=o.store.getState().currentCall.conversationId,n=o.store.getState().currentUser.default_device,r&&(null==n?void 0:n.id)&&t?[4,a.attendedTransfer({convid:r,to:t,endpointId:n.id})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,t){u("sip:".concat(e,"@").concat(t))},exports.callSipURI=u,exports.hangupAllExtensions=function(){var e=o.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){a.hangupConversation({convid:e,endpointId:t})}))};for(var r in e)t(r)},exports.hangupCurrentCall=function(){var e=o.store.getState().currentCall,t=e.outgoing,r=e.accepted;(t||r)&&n.hangup(),o.store.dispatch.player.stopAudioPlayer(),o.store.dispatch.currentCall.reset()},exports.muteCurrentCall=function(){i.isWebRTC()&&n.muteWebRTC()&&o.store.dispatch.currentCall.updateCurrentCall({muted:!0})},exports.park=function(){var e,t,r,n,i=null===(t=null===(e=null===o.store||void 0===o.store?void 0:o.store.getState())||void 0===e?void 0:e.currentCall)||void 0===t?void 0:t.conversationId,s=null===(n=null===(r=null===o.store||void 0===o.store?void 0:o.store.getState())||void 0===r?void 0:r.currentUser)||void 0===n?void 0:n.conversations,u={};if(i){if(s)for(var l in s)if(s.hasOwnProperty(l)){var d=s[l];Object.keys(d).length>0&&(u={numberParkId:l,idConversation:i})}Object.keys(u).length>0&&(null==u?void 0:u.numberParkId)&&a.parkConversation({applicantId:null==u?void 0:u.numberParkId,convid:i,endpointId:null==u?void 0:u.numberParkId})}},exports.pauseCurrentCall=function(){i.isWebRTC()&&n.pauseWebRTC()&&(o.store.dispatch.currentCall.updateCurrentCall({paused:!0}),o.store.dispatch.player.pauseRemoteAudio())},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),o.store.dispatch.player.updateStartAudioPlayer({src:s.default["dtmf_".concat(e)]})},exports.unmuteCurrentCall=function(){i.isWebRTC()&&n.unmuteWebRTC()&&o.store.dispatch.currentCall.updateCurrentCall({muted:!1})},exports.unpauseCurrentCall=function(){i.isWebRTC()&&n.unpauseWebRTC()&&(o.store.dispatch.currentCall.updateCurrentCall({paused:!1}),o.store.dispatch.player.playRemoteAudio())};
2
2
  //# sourceMappingURL=call.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { getSupportedDevices } from '../devices/devices'\nimport Janus from '../webrtc/janus'\nimport {\n call,\n hangup,\n answerWebRTC,\n muteWebRTC,\n unmuteWebRTC,\n pauseWebRTC,\n unpauseWebRTC,\n} from '../webrtc/messages'\nimport { store } from '../../store'\nimport { isWebRTC } from '../user/default_device'\nimport {\n blindTransfer as blindTransferRequest,\n attendedTransfer as attendedTransferRequest,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\n\n/**\n * Starts a call to a number\n * @param number The number string\n */\nexport function callNumber(number: string, sipHost: string) {\n const sipURI = `sip:${number}@${sipHost}`\n callSipURI(sipURI)\n}\n\n/**\n * Starts a call to a SIP URI\n *\n * @param sipURI The SIP URI string\n */\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n await call(sipURI, {\n audio: {\n mandatory: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n googEchoCancellation: true,\n googAutoGainControl: true,\n googNoiseSuppression: true,\n googHighpassFilter: true,\n googTypingNoiseDetection: true,\n googNoiseReduction: true,\n volume: 1.0,\n },\n },\n audioSend: true,\n audioRecv: true,\n videoSend: false,\n videoRecv: false,\n })\n })\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n }\n}\n\n/**\n * Hangup all the conversations of all the extensions of the current user\n */\nexport function hangupAllExtensions() {\n // Get current user endpoints\n const { conversations } = store.getState().currentUser\n // Hangup all the conversations of all extensions of the current user\n for (const extension in conversations) {\n const conversationsIds = Object.keys(conversations[extension])\n conversationsIds.forEach((id) => {\n hangupConversation({\n convid: id,\n endpointId: extension,\n })\n })\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted } = store.getState().currentCall\n if (outgoing || accepted) {\n hangup()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n}\n\n/**\n * Mute the current call\n */\nexport function muteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const muted = muteWebRTC()\n if (muted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: true,\n })\n }\n }\n}\n\n/**\n * Unmute the current call\n */\nexport function unmuteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unmuted = unmuteWebRTC()\n if (unmuted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: false,\n })\n }\n }\n}\n\n/**\n * Pause the current call\n */\nexport function pauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const paused = pauseWebRTC()\n if (paused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: true,\n })\n // Pause remote audio\n store.dispatch.player.pauseRemoteAudio()\n }\n }\n}\n\n/**\n * Unpause the current call\n */\nexport function unpauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unpaused = unpauseWebRTC()\n if (unpaused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: false,\n })\n // Play remote audio\n store.dispatch.player.playRemoteAudio()\n }\n }\n}\n\n/**\n * Transfer the current call through a blind transfer (not in use)\n */\nexport async function blindTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n // Transfer the call through blind transfer\n if (conversationId && default_device?.id && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device.id,\n })\n }\n}\n\n/**\n * Transfer the current call through a attended transfer\n */\nexport async function attendedTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n // Transfer the call through attended transfer\n if (conversationId && default_device?.id && number) {\n return await attendedTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device.id,\n })\n }\n}\n\n/**\n * Play the dtmf audio files\n */\nexport function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n store.dispatch.player.updateStartAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n}\n\nexport function park() {\n const conversationId = store?.getState()?.currentCall?.conversationId\n\n if (conversationId) {\n let conversationIdSplitted = conversationId.split('>')\n let firstConversationIdSplitted = conversationIdSplitted[0]\n let firstConversationIdNumber: any = firstConversationIdSplitted?.match(/\\/(\\d+)-/)\n let secondConversationIdSplitted = conversationIdSplitted[1]\n let secondConversationIdNumber: any = secondConversationIdSplitted?.match(/\\/(\\d+)-/)\n\n const endpoints: any = store?.getState()?.currentUser?.endpoints\n\n if (Array.isArray(endpoints.extension)) {\n // Get id from extensions\n const extensionIds = endpoints.extension.map((endpoint) => endpoint.id)\n // Map id and check if conversation id numbers is equal to extension id\n if (extensionIds.indexOf(firstConversationIdNumber[1]) !== -1) {\n const endpointId = firstConversationIdNumber[1]\n parkConversation({\n applicantId: endpointId,\n convid: conversationId,\n endpointId: endpointId,\n })\n } else if (extensionIds.indexOf(secondConversationIdNumber[1]) !== -1) {\n const endpointId = secondConversationIdNumber[1]\n parkConversation({\n applicantId: endpointId,\n convid: conversationId,\n endpointId: endpointId,\n })\n }\n }\n }\n}\n"],"names":["callSipURI","sipURI","_this","this","getSupportedDevices","__awaiter","Janus","log","call","audio","mandatory","echoCancellation","noiseSuppression","autoGainControl","googEchoCancellation","googAutoGainControl","googNoiseSuppression","googHighpassFilter","googTypingNoiseDetection","googNoiseReduction","volume","audioSend","audioRecv","videoSend","videoRecv","_a","sent","isWebRTC","answerWebRTC","number","conversationId","store","getState","currentCall","default_device","currentUser","id","attendedTransferRequest","convid","to","endpointId","sipHost","concat","conversations","extension","Object","keys","forEach","hangupConversation","outgoing","accepted","hangup","dispatch","player","stopAudioPlayer","reset","muteWebRTC","updateCurrentCall","muted","_b","conversationIdSplitted","split","firstConversationIdSplitted","firstConversationIdNumber","match","secondConversationIdSplitted","secondConversationIdNumber","endpoints","_d","_c","Array","isArray","extensionIds","map","endpoint","indexOf","parkConversation","applicantId","pauseWebRTC","paused","pauseRemoteAudio","key","updateStartAudioPlayer","src","dtmfAudios","unmuteWebRTC","unpauseWebRTC","playRemoteAudio"],"mappings":"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"}
1
+ {"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { getSupportedDevices } from '../devices/devices'\nimport Janus from '../webrtc/janus'\nimport {\n call,\n hangup,\n answerWebRTC,\n muteWebRTC,\n unmuteWebRTC,\n pauseWebRTC,\n unpauseWebRTC,\n} from '../webrtc/messages'\nimport { store } from '../../store'\nimport { isWebRTC } from '../user/default_device'\nimport {\n blindTransfer as blindTransferRequest,\n attendedTransfer as attendedTransferRequest,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\n\n/**\n * Starts a call to a number\n * @param number The number string\n */\nexport function callNumber(number: string, sipHost: string) {\n const sipURI = `sip:${number}@${sipHost}`\n callSipURI(sipURI)\n}\n\n/**\n * Starts a call to a SIP URI\n *\n * @param sipURI The SIP URI string\n */\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n await call(sipURI, {\n audio: {\n mandatory: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n googEchoCancellation: true,\n googAutoGainControl: true,\n googNoiseSuppression: true,\n googHighpassFilter: true,\n googTypingNoiseDetection: true,\n googNoiseReduction: true,\n volume: 1.0,\n },\n },\n audioSend: true,\n audioRecv: true,\n videoSend: false,\n videoRecv: false,\n })\n })\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n }\n}\n\n/**\n * Hangup all the conversations of all the extensions of the current user\n */\nexport function hangupAllExtensions() {\n // Get current user endpoints\n const { conversations } = store.getState().currentUser\n // Hangup all the conversations of all extensions of the current user\n for (const extension in conversations) {\n const conversationsIds = Object.keys(conversations[extension])\n conversationsIds.forEach((id) => {\n hangupConversation({\n convid: id,\n endpointId: extension,\n })\n })\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted } = store.getState().currentCall\n if (outgoing || accepted) {\n hangup()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n}\n\n/**\n * Mute the current call\n */\nexport function muteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const muted = muteWebRTC()\n if (muted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: true,\n })\n }\n }\n}\n\n/**\n * Unmute the current call\n */\nexport function unmuteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unmuted = unmuteWebRTC()\n if (unmuted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: false,\n })\n }\n }\n}\n\n/**\n * Pause the current call\n */\nexport function pauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const paused = pauseWebRTC()\n if (paused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: true,\n })\n // Pause remote audio\n store.dispatch.player.pauseRemoteAudio()\n }\n }\n}\n\n/**\n * Unpause the current call\n */\nexport function unpauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unpaused = unpauseWebRTC()\n if (unpaused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: false,\n })\n // Play remote audio\n store.dispatch.player.playRemoteAudio()\n }\n }\n}\n\n/**\n * Transfer the current call through a blind transfer (not in use)\n */\nexport async function blindTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n // Transfer the call through blind transfer\n if (conversationId && default_device?.id && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device.id,\n })\n }\n}\n\n/**\n * Transfer the current call through a attended transfer\n */\nexport async function attendedTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n // Transfer the call through attended transfer\n if (conversationId && default_device?.id && number) {\n return await attendedTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device.id,\n })\n }\n}\n\n/**\n * Play the dtmf audio files\n */\nexport function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n store.dispatch.player.updateStartAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n}\n\nexport function park() {\n const conversationId = store?.getState()?.currentCall?.conversationId\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n let parkingInformation: any = {}\n\n if (conversationId) {\n if (userConversationInformations) {\n for (const key in userConversationInformations) {\n if (userConversationInformations.hasOwnProperty(key)) {\n const conversation = userConversationInformations[key]\n if (Object.keys(conversation).length > 0) {\n parkingInformation = {\n numberParkId: key,\n idConversation: conversationId,\n }\n }\n }\n }\n }\n\n if (Object.keys(parkingInformation).length > 0) {\n if (parkingInformation?.numberParkId) {\n // If park information are not empty park call\n parkConversation({\n applicantId: parkingInformation?.numberParkId,\n convid: conversationId,\n endpointId: parkingInformation?.numberParkId,\n })\n }\n }\n }\n}\n"],"names":["callSipURI","sipURI","_this","this","getSupportedDevices","__awaiter","Janus","log","call","audio","mandatory","echoCancellation","noiseSuppression","autoGainControl","googEchoCancellation","googAutoGainControl","googNoiseSuppression","googHighpassFilter","googTypingNoiseDetection","googNoiseReduction","volume","audioSend","audioRecv","videoSend","videoRecv","_a","sent","isWebRTC","answerWebRTC","number","conversationId","store","getState","currentCall","default_device","currentUser","id","attendedTransferRequest","convid","to","endpointId","sipHost","concat","conversations","extension","Object","keys","forEach","hangupConversation","outgoing","accepted","hangup","dispatch","player","stopAudioPlayer","reset","muteWebRTC","updateCurrentCall","muted","_b","userConversationInformations","_d","_c","parkingInformation","key","hasOwnProperty","conversation","length","numberParkId","idConversation","parkConversation","applicantId","pauseWebRTC","paused","pauseRemoteAudio","updateStartAudioPlayer","src","dtmfAudios","unmuteWebRTC","unpauseWebRTC","playRemoteAudio"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nethesis/phone-island",
3
3
  "author": "Nethesis",
4
- "version": "0.7.102",
4
+ "version": "0.7.103",
5
5
  "description": "NethVoice CTI Phone Island",
6
6
  "keywords": [
7
7
  "nethserver",