@nethesis/phone-island 0.8.40 → 0.8.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/models/currentCall.d.ts +55 -0
- package/dist/models/currentCall.js +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/services/astproxy.d.ts +1 -1
- package/dist/services/astproxy.js +1 -1
- package/dist/services/astproxy.js.map +1 -1
- package/dist/types/user.d.ts +1 -0
- package/package.json +1 -1
|
@@ -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"),
|
|
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"),o=require("../utils/genericFunctions/eventDispatch.js"),c=require("../utils/genericFunctions/withTimeout.js");require("../lib/webrtc/janus.js");var s=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../node_modules/mic-check/lib/index.js");var a=require("../lib/user/default_device.js"),i=require("../events/SocketEvents.js"),u=require("../utils/genericFunctions/timestamp.js"),l=require("../lib/user/extensions.js"),d=require("../utils/genericFunctions/isEmpty.js"),p=require("../node_modules/react-redux/es/hooks/useSelector.js");require("../node_modules/react-redux/es/components/Context.js"),require("../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("../node_modules/react-redux/node_modules/react-is/index.js");var m=require("../node_modules/react-redux/es/hooks/useDispatch.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=f(n);exports.Socket=function(f){var h=f.hostName,g=f.username,b=f.authToken,y=f.reload,k=f.reloadedCallback,C=f.children,S=f.uaType,_=m.useDispatch(),j=n.useRef(),x=n.useRef();p.useSelector((function(e){return e.currentUser}));return n.useEffect((function(){var n=function(e,n){var t=s.store.getState().currentCall,c=t.transferring,i=t.transferSwitching,d=t.transferCalls,p=s.store.getState().island.view;if(Object.keys(n).length>0){if(e.status){var m=s.store.getState().users.extensions,f=s.store.getState().currentUser.default_device,v=s.store.getState().currentUser,h=v.endpoints,g=v.username,b=s.store.getState().currentCall;b.incoming,b.outgoing;var y=function(){if(!m||!g)return!1;var e=Object.values(m).filter((function(e){return(null==e?void 0:e.username)===g}));return null==e?void 0:e.some((function(e){var n=null==h?void 0:h.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(e.status){case"ringing":("mobile"===S&&y()||"desktop"===S&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!y()||!y()&&"physical"===(null==f?void 0:f.type)))&&(_.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(m&&m[n.counterpartNum]&&m[n.counterpartNum].username)||"",ownerExtension:n.owner}),s.store.dispatch.island.setIslandView("call"),o.eventDispatch("phone-island-call-ringing",{}));break;case"busy":if("mobile"===S&&y()||"desktop"===S&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!y()||!y()&&"physical"===(null==f?void 0:f.type))){if(n&&n.connected&&(_.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),ownerExtension:n.owner,username:"".concat(m&&m[n.counterpartNum]&&m[n.counterpartNum].username)||""}),_.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),_.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(u.getTimestampInSeconds())}),a.isPhysical()&&function(e){_.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),o.eventDispatch("phone-island-call-answered",{}),s.store.dispatch.player.stopAudioPlayer(),s.store.dispatch.player.setAudioPlayerLoop(!1)}(n),"call"===p&&c&&_.currentCall.updateCurrentCall({transferring:!1})),d.length>1)_.currentCall.deleteTransferCalls();else if(n&&!n.connected){if(c&&!i){var k=d.find((function(e){return e.number===n.counterpartNum}));!n.connected&&k&&(_.currentCall.updateCurrentCall({transferring:!1}),o.eventDispatch("phone-island-call-transfer-failed",{}),_.currentCall.updateTransferSwitching(!1))}"REC"===(null==n?void 0:n.counterpartName)&&_.physicalRecorder.setRecordingTempVariable(!0)}n&&!n.connected&&"out"===n.direction&&_.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(m&&m[n.counterpartNum]&&m[n.counterpartNum].username)||""})}case"onhold":var C=n.counterpartName,j=n.counterpartNum,x=n.startTime;c&&j&&C&&"<unknown>"!==C&&(_.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:j,startTime:"".concat(u.getTimestampInSeconds())}),_.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:j,startTime:"".concat(x/1e3),conversationId:n.id}),_.island.setIslandView("call"));break;case"busy_ringing":o.eventDispatch("phone-island-call-ringing",{})}}}else"online"==e.status&&l.userTotallyFree()&&(_.player.stopAudioPlayer(),_.currentCall.reset(),_.physicalRecorder.setRecordingTempVariable(!1))};return x.current=t.io("https://"+h,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),x.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(x.current.id)),o.eventDispatch("phone-island-socket-connected",{})})),x.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),e.includes("server disconnect")?o.eventDispatch("phone-island-server-disconnected",{}):o.eventDispatch("phone-island-socket-disconnected",{})})),x.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),x.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),x.current.io.on("reconnect",(function(e){o.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(x.current.id,")"))})),x.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),x.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),x.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),j.current=setInterval((function(){var e=Date.now();x.current.volatile.emit("ping",c.withTimeout((function(){_.alerts.removeAlert("socket_down"),o.eventDispatch("phone-island-socket-disconnected-popup-close",{});var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){_.alerts.setAlert("socket_down"),o.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.debug("Socket is unreachable!")}),7e3))}),7e3),x.current.on("connect",(function(){console.debug("Socket on: "+h+" is connected!"),x.current.emit("login",{accessKeyId:"".concat(g),token:b,uaType:S})})),x.current.on("authe_ok",(function(){console.debug("Socket authentication success!")})),x.current.on("userMainPresenceUpdate",(function(n){s.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),i.dispatchMainPresence(n)})),x.current.on("extenUpdate",(function(e){_.users.updateExtension(e);var t=s.store.getState().users.extensions,r={};for(var o in t){var c=t[o].username,a=t[o].exten;r[c]||(r[c]=[]),r[c].push(a)}var u=r[e.username],l=e.conversations[Object.keys(e.conversations)[0]]||{};if(i.dispatchExtensions(e),d.isEmpty(l)){var p=null==u?void 0:u.some((function(e){var n,r=null===(n=t[e])||void 0===n?void 0:n.conversations;return!d.isEmpty(r)}));p||i.dispatchConversations(e)}else i.dispatchConversations(e);e.username===g&&(n(e,l),_.currentUser.updateConversations(e))})),x.current.on("queueUpdate",(function(e){i.dispatchQueueUpdate(e)})),x.current.on("queueMemberUpdate",(function(e){i.dispatchQueueMemberUpdate(e)})),x.current.on("takeOver",(function(){i.dispatchAlreadyLogin()})),x.current.on("serverReloaded",(function(){i.dispatchServerReload()})),x.current.on("parkingUpdate",(function(){i.dispatchParkingUpdate()})),x.current.on("actionNethLink",(function(e,n){i.dispatchUrlCall(e,n)})),x.current.on("updateDefaultDevice",(function(n){i.dispatchDefaultDeviceUpdate(n);var t=s.store.getState().users.extensions,r=s.store.getState().currentUser.endpoints;if(t&&r){var o=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==o.length){var c=o[0],a=r.extension.find((function(e){return e.id===c.exten}));a&&(c=e.__assign(e.__assign({},c),{type:a.type})),s.store.dispatch.currentUser.updateCurrentDefaultDevice(c)}}})),function(){clearInterval(j.current),x.current.close()}}),[]),n.useEffect((function(){y&&(console.info("websocket reconnection"),x.current.disconnect(),x.current.connect(),k())}),[y]),v.default.createElement(v.default.Fragment,null,C)};
|
|
2
2
|
//# sourceMappingURL=Socket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2024 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, useSelector } from 'react-redux'\nimport { Dispatch, RootState } 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 dispatchParkingUpdate,\n dispatchExtensions,\n dispatchUrlCall,\n dispatchDefaultDeviceUpdate,\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'\nimport { userTotallyFree } from '../lib/user/extensions'\nimport { isEmpty } from '../utils/genericFunctions/isEmpty'\nimport { isPhysical } from '../lib/user/default_device'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.player.setAudioPlayerLoop(false)\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\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\n const view = store.getState().island.view\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 ownerExtension: conv.owner,\n })\n\n eventDispatch('phone-island-call-ringing', {})\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 ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Update the current call informations for physical devices\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedSocket: true,\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 if (isPhysical()) {\n checkDefaultDeviceConversationActive(conv)\n }\n if (view === 'call' && transferring) {\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n }\n }\n // Delete transfer calls if there are more than one ( in case of call switch after transfer)\n if (transferCalls.length > 1) {\n dispatch.currentCall.deleteTransferCalls()\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 eventDispatch('phone-island-call-transfer-failed', {})\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 if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\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 conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n case 'busy_ringing':\n eventDispatch('phone-island-call-ringing', {})\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io('https://' + 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 eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\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 eventDispatch('phone-island-socket-reconnected', {})\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 eventDispatch('phone-island-socket-disconnected-popup-close', {})\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 eventDispatch('phone-island-socket-disconnected-popup-open', {})\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.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('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\n //retrieve all extensions from store\n const { extensions }: any = store.getState().users\n const deviceMap: any = {}\n\n // Create a map of extensions for each user\n for (const key in extensions) {\n const user: any = extensions[key].username\n const ext: any = extensions[key].exten\n\n if (!deviceMap[user]) {\n deviceMap[user] = []\n }\n\n deviceMap[user].push(ext)\n }\n\n const associatedExtensions: any = deviceMap[res.username]\n\n // Initialize conversation\n let conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n\n // Update all extensions and send the dispatch event\n dispatchExtensions(res)\n\n // second step update conversation\n\n // Check if conversation is empty\n if (isEmpty(conv)) {\n // Check if there is at least one conversation not empty\n const hasNonEmptyConversation = associatedExtensions?.some((ext: any) => {\n const extConversations = extensions[ext]?.conversations\n\n if (!isEmpty(extConversations)) {\n // not empty conversation found\n return true\n }\n\n return false\n })\n\n if (!hasNonEmptyConversation) {\n // Conversation is empty and there is no conversation for the user\n dispatchConversations(res)\n }\n } else {\n // Dispatch conversation event\n dispatchConversations(res)\n }\n\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('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('parkingUpdate', () => {\n // Dispatch serverReload event\n dispatchParkingUpdate()\n })\n\n // `actionNethLink` is the socket event when user make a call or a action from NethLink and has a physical device\n socket.current.on('actionNethLink', (link, urlType) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchUrlCall(link, urlType)\n })\n\n // `updateDefaultDevice` is the socket event when user change the default device\n socket.current.on('updateDefaultDevice', (extension: string) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchDefaultDeviceUpdate(extension)\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","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useSelector","state","currentUser","useEffect","handleCurrentUserEvents","res","conv","store","getState","currentCall","transferring","transferSwitching","transferCalls","view","island","Object","keys","length","status","extensions","users","checkIncomingUpdatePlay","conversationId","id","displayName","getDisplayName","number","concat","counterpartNum","incomingSocket","ownerExtension","owner","eventDispatch","connected","updateCurrentCall","checkAcceptedUpdate","acceptedSocket","addTransferCalls","type","startTime","getTimestampInSeconds","isPhysical","accepted","incoming","direction","undefined","player","stopAudioPlayer","setAudioPlayerLoop","checkDefaultDeviceConversationActive","deleteTransferCalls","inTransferCalls","find","item","updateTransferSwitching","counterpartName","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","setIslandView","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","includes","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","deviceMap","key","user","ext","exten","push","associatedExtensions","conversations","dispatchExtensions","isEmpty","hasNonEmptyConversation","some","extConversations","dispatchConversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","dispatchParkingUpdate","link","urlType","dispatchUrlCall","extension","dispatchDefaultDeviceUpdate","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) 2024 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, useSelector } from 'react-redux'\nimport { Dispatch, RootState } 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 dispatchParkingUpdate,\n dispatchExtensions,\n dispatchUrlCall,\n dispatchDefaultDeviceUpdate,\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'\nimport { userTotallyFree } from '../lib/user/extensions'\nimport { isEmpty } from '../utils/genericFunctions/isEmpty'\nimport { isPhysical } from '../lib/user/default_device'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.player.setAudioPlayerLoop(false)\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\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\n const view = store.getState().island.view\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 const { default_device } = store.getState().currentUser\n const { endpoints, username } = store.getState().currentUser\n const { incoming, outgoing } = store.getState().currentCall\n\n const hasOnlineNethlink = () => {\n if (!extensions || !username) return false\n\n // Get all extensions for current user\n const userExtensions: any = Object.values(extensions).filter(\n (ext) => ext?.username === username,\n )\n\n // Check if any extension is nethlink type and online\n return userExtensions?.some((ext) => {\n const endpointExtension = endpoints?.extension.find(\n (endpoint) => endpoint.id === ext?.exten,\n )\n return endpointExtension?.type === 'nethlink' && ext?.status !== 'offline'\n })\n }\n switch (res.status) {\n case 'ringing':\n if (\n (uaType === 'mobile' && hasOnlineNethlink()) ||\n (uaType === 'desktop' &&\n (default_device?.type === 'webrtc' ||\n (default_device?.type === undefined && !hasOnlineNethlink()) ||\n (!hasOnlineNethlink() && default_device?.type === 'physical')))\n ) {\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 ownerExtension: conv.owner,\n })\n store.dispatch.island.setIslandView('call')\n\n eventDispatch('phone-island-call-ringing', {})\n }\n break\n // @ts-ignore\n case 'busy':\n if (\n (uaType === 'mobile' && hasOnlineNethlink()) ||\n (uaType === 'desktop' &&\n (default_device?.type === 'webrtc' ||\n (default_device?.type === undefined && !hasOnlineNethlink()) ||\n (!hasOnlineNethlink() && default_device?.type === 'physical')))\n ) {\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 ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Update the current call informations for physical devices\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedSocket: true,\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 if (isPhysical()) {\n checkDefaultDeviceConversationActive(conv)\n }\n if (view === 'call' && transferring) {\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n }\n }\n // Delete transfer calls if there are more than one ( in case of call switch after transfer)\n if (transferCalls.length > 1) {\n dispatch.currentCall.deleteTransferCalls()\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 eventDispatch('phone-island-call-transfer-failed', {})\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 if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\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 }\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 conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n case 'busy_ringing':\n eventDispatch('phone-island-call-ringing', {})\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io('https://' + 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 eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\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 eventDispatch('phone-island-socket-reconnected', {})\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 eventDispatch('phone-island-socket-disconnected-popup-close', {})\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 eventDispatch('phone-island-socket-disconnected-popup-open', {})\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.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('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\n //retrieve all extensions from store\n const { extensions }: any = store.getState().users\n const deviceMap: any = {}\n\n // Create a map of extensions for each user\n for (const key in extensions) {\n const user: any = extensions[key].username\n const ext: any = extensions[key].exten\n\n if (!deviceMap[user]) {\n deviceMap[user] = []\n }\n\n deviceMap[user].push(ext)\n }\n\n const associatedExtensions: any = deviceMap[res.username]\n\n // Initialize conversation\n let conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n\n // Update all extensions and send the dispatch event\n dispatchExtensions(res)\n\n // second step update conversation\n\n // Check if conversation is empty\n if (isEmpty(conv)) {\n // Check if there is at least one conversation not empty\n const hasNonEmptyConversation = associatedExtensions?.some((ext: any) => {\n const extConversations = extensions[ext]?.conversations\n\n if (!isEmpty(extConversations)) {\n // not empty conversation found\n return true\n }\n\n return false\n })\n\n if (!hasNonEmptyConversation) {\n // Conversation is empty and there is no conversation for the user\n dispatchConversations(res)\n }\n } else {\n // Dispatch conversation event\n dispatchConversations(res)\n }\n\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('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('parkingUpdate', () => {\n // Dispatch serverReload event\n dispatchParkingUpdate()\n })\n\n // `actionNethLink` is the socket event when user make a call or a action from NethLink and has a physical device\n socket.current.on('actionNethLink', (link, urlType) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchUrlCall(link, urlType)\n })\n\n // `updateDefaultDevice` is the socket event when user change the default device\n socket.current.on('updateDefaultDevice', (extension: string) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchDefaultDeviceUpdate(extension)\n // Update the internal store\n const { extensions } = store.getState().users\n const { endpoints } = store.getState().currentUser\n if (!extensions || !endpoints) return\n\n const extensionInformations: any = Object.values(extensions).filter(\n (ext) => ext?.exten === extension,\n )\n if (extensionInformations.length === 0) return\n\n let objectComplete = extensionInformations[0]\n const endpointExtension = endpoints.extension.find(\n (endpoint) => endpoint.id === objectComplete.exten,\n )\n if (endpointExtension) {\n objectComplete = { ...objectComplete, type: endpointExtension.type }\n }\n\n store.dispatch.currentUser.updateCurrentDefaultDevice(objectComplete)\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","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useSelector","state","currentUser","useEffect","handleCurrentUserEvents","res","conv","store","getState","currentCall","transferring","transferSwitching","transferCalls","view","island","Object","keys","length","status","extensions_1","users","extensions","default_device","_b","endpoints_1","endpoints","username_1","_c","incoming","hasOnlineNethlink","userExtensions","values","filter","ext","some","endpointExtension","extension","find","endpoint","id","exten","type","undefined","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","concat","counterpartNum","incomingSocket","ownerExtension","owner","setIslandView","eventDispatch","connected","updateCurrentCall","checkAcceptedUpdate","acceptedSocket","addTransferCalls","startTime","getTimestampInSeconds","isPhysical","accepted","direction","player","stopAudioPlayer","setAudioPlayerLoop","checkDefaultDeviceConversationActive","deleteTransferCalls","inTransferCalls","item","updateTransferSwitching","counterpartName","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","includes","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","deviceMap","key","user","push","associatedExtensions","conversations","dispatchExtensions","isEmpty","hasNonEmptyConversation","extConversations","dispatchConversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","dispatchParkingUpdate","link","urlType","dispatchUrlCall","dispatchDefaultDeviceUpdate","extensionInformations","objectComplete","updateCurrentDefaultDevice","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("react");require("../node_modules/react-redux/es/index.js");var r=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),n=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),c=require("../store/index.js"),o=require("../lib/devices/devices.js"),i=require("../lib/phone/call.js"),s=require("../lib/webrtc/connection.js"),u=require("../static/outgoing_ringtone.js"),l=require("../utils/customHooks/useEventListener.js"),d=require("../utils/genericFunctions/eventDispatch.js"),g=require("../lib/user/default_device.js"),p=require("../node_modules/react-redux/es/hooks/useDispatch.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),n=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),c=require("../store/index.js"),o=require("../lib/devices/devices.js"),i=require("../lib/phone/call.js"),s=require("../lib/webrtc/connection.js"),u=require("../static/outgoing_ringtone.js"),l=require("../utils/customHooks/useEventListener.js"),d=require("../utils/genericFunctions/eventDispatch.js"),g=require("../lib/user/default_device.js"),p=require("../node_modules/react-redux/es/hooks/useDispatch.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=f(t);exports.WebRTC=function(f){var b=f.hostName,m=f.sipExten,w=f.sipSecret,h=f.children,y=f.sipHost,S=f.sipPort,k=f.reload,C=f.uaType,T=f.reloadedCallback,j=p.useDispatch(),A=t.useRef(null),E=t.useRef(n.default),_=t.useCallback((function(){E.current.init({debug:"all",dependencies:E.current.useDefaultDependencies({adapter:r.default}),callback:function(){var e=new E.current({server:"https://".concat(b,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(j.webrtc.updateWebRTC({sipcall:e}),a.register({sipExten:m,sipSecret:w,sipHost:y,sipPort:S}),e&&E.current.log&&E.current.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){E.current.error&&(E.current.error(" -- Error attaching plugin..."),E.current.error(e))},consentDialog:function(e){E.current.log&&E.current.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){E.current.log&&E.current.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){c.store.getState().webrtc.sipcall&&E.current.log&&E.current.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,t){E.current.log&&E.current.log("Janus "+(t?"started":"stopped")+" receiving our "+e)},slowLink:function(e,t){e?E.current.warn&&E.current.warn("SLOW link: several missing packets from janus (".concat(t,")")):E.current.warn&&E.current.warn("SLOW link: janus is not receiving all your packets (".concat(t,")"))},onmessage:function(e,t){var r=c.store.getState().webrtc.sipcall;E.current.debug&&(E.current.debug(" ::: Got a message :::"),E.current.debug(JSON.stringify(e)));var n=e.error;if(null==n||null==n){var o=e.result;if(null!=o&&void 0!==o.event&&null!==o.event){var s=o.event,l=c.store.getState().recorder.recording,p=c.store.getState().island.view;switch(s){case"registration_failed":E.current.error&&E.current.error("Registration failed: "+o.code+" "+o.reason);break;case"unregistered":E.current.log&&E.current.log("Successfully un-registered as "+o.username+"!"),d.eventDispatch("phone-island-webrtc-unregistered",{});break;case"registered":E.current.log&&E.current.log("Successfully registered as "+o.username+"!"),d.eventDispatch("phone-island-webrtc-registered",{}),c.store.getState().webrtc.registered||c.store.dispatch.webrtc.updateWebRTC({registered:!0}),j.alerts.removeAlert("webrtc_down"),j.webrtc.updateLastActivity((new Date).getTime());break;case"registering":E.current.log&&E.current.log("janus registering");break;case"calling":j.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),j.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":c.store.getState().player.audioPlayerPlaying||j.player.updateStartAudioPlayer({src:u.default,loop:!0}),j.webrtc.updateLastActivity((new Date).getTime()),"call"!==p&&j.island.setIslandView("call");break;case"progress":E.current.log&&E.current.log("There's early media from "+o.username+", wairing for the call!"),t&&a.handleRemote(t),j.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":var f=c.store.getState().currentUser.default_device,v=c.store.getState().currentUser,b=v.endpoints,m=v.username,w=c.store.getState().users.extensions,h=function(){if(!w||!m)return!1;var e=Object.values(w).filter((function(e){return(null==e?void 0:e.username)===m}));return null==e?void 0:e.some((function(e){var t=null==b?void 0:b.extension.find((function(t){return t.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==t?void 0:t.type)&&"offline"!==(null==e?void 0:e.status)}))};("mobile"===C&&h()||"desktop"===C&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!h()||!h()&&"physical"===(null==f?void 0:f.type)))&&(j.webrtc.updateWebRTC({jsepGlobal:t}),l?j.recorder.setIncoming(!0):(j.currentCall.checkIncomingUpdatePlay({incomingWebRTC:!0}),E.current.log&&(j.currentCall.updateIncoming(!0),E.current.log("Incoming call from "+o.username+"!"))),j.webrtc.updateLastActivity((new Date).getTime()),c.store.dispatch.island.setIslandView("call"));break;case"accepted":var y=Math.floor(Date.now()/1e3);E.current.log&&E.current.log(o.username+" accepted the call!"),t&&a.handleRemote(t),j.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),j.currentCall.updateCurrentCall({incoming:!1,incomingWebRTC:!1,startTime:null==y?void 0:y.toString()}),c.store.dispatch.player.stopAudioPlayer(),j.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":l&&j.recorder.setRecording(!1),g.isPhysical()||"mobile"===C||(i.hangupCurrentCall(),r.hangup(),c.store.dispatch.player.stopAudioPlayer(),c.store.dispatch.currentCall.reset(),E.current.log&&E.current.log("Call hung up ("+o.code+" "+o.reason+")!"),j.webrtc.updateLastActivity((new Date).getTime())),c.store.dispatch.player.stopAudioPlayer();break;case"gateway_down":console.warn("THE GATEWAY IS DOWN")}}}else c.store.getState().webrtc.registered?(r&&r.hangup(),c.store.dispatch.player.stopAudioPlayer()):E.current.log&&E.current.log("User is not registered")},onlocalstream:function(e){E.current.debug&&(E.current.debug(" ::: Got a local stream :::"),E.current.debug(e));var t=c.store.getState().player.localVideo,r=e.getAudioTracks(),n=e.getVideoTracks();if(E.current.attachMediaStream){if(r&&r.length>0){var a=new MediaStream(r);c.store.dispatch.webrtc.updateLocalAudioStream(a)}else console.warn("No audio tracks on local stream");if(n&&n.length>0){var o=new MediaStream(n);t&&t.current&&E.current.attachMediaStream(t.current,o)}else console.warn("No video tracks on local stream")}},onremotestream:function(e){E.current.debug&&E.current.debug(" ::: Got a remote stream :::"),c.store.dispatch.player.stopAudioPlayer();var t=c.store.getState().player.remoteAudio,r=c.store.getState().player.remoteVideo,n=e.getAudioTracks(),a=e.getVideoTracks();if(E.current.attachMediaStream){if(n&&n.length>0){var o=new MediaStream(n);t&&t.current&&E.current.attachMediaStream(t.current,o),c.store.dispatch.webrtc.updateRemoteAudioStream(o)}else console.warn("No audio tracks on remote stream");if(a&&a.length>0){var i=new MediaStream(a);r&&r.current&&E.current.attachMediaStream(r.current,i)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){E.current.log&&E.current.log(" ::: janus Got a cleanup notification :::")},detached:function(){E.current.warn&&E.current.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){E.current.log&&E.current.log("error",e),j.alerts.setAlert("webrtc_down")},destroyed:function(){j.webrtc.updateWebRTC({destroyed:!0}),j.alerts.setAlert("webrtc_down")}})}})}),[E.current]);t.useEffect((function(){o.checkMediaPermissions()}),[]);var D=t.useState(navigator.onLine),L=D[0],P=D[1],R=t.useState(!1),I=R[0],q=R[1],W=t.useRef(!1);return t.useEffect((function(){var e=function(){return P(!0)},t=function(){return P(!1)};return window.addEventListener("online",e),window.addEventListener("offline",t),function(){window.removeEventListener("online",e),window.removeEventListener("offline",t)}}),[]),t.useEffect((function(){L?W.current&&(console.log("Internet connection restored."),q(!0),W.current=!1):(console.log("Internet connection lost."),W.current=!0,q(!1))}),[L]),t.useEffect((function(){var e;return _(),e=c.store.getState().webrtc.CHECK_INTERVAL_TIME,A.current||(A.current=setInterval((function(){return s.webrtcCheck((function(){a.register({sipExten:m,sipSecret:w,sipHost:y,sipPort:S})}))}),e)),function(){a.unregister(),clearInterval(A.current)}}),[]),t.useEffect((function(){if(k||I){a.unregister();var e=c.store.getState().webrtc.sipcall;e&&e.detach(),E.current.destroy&&E.current.destroy(),setTimeout((function(){_(),T&&T()}),1e4)}}),[k,I]),l.useEventListener("phone-island-attach",(function(e){_(),d.eventDispatch("phone-island-attached",{})})),l.useEventListener("phone-island-call-transfer",(function(t){var r=null==t?void 0:t.to;j.island.toggleIsOpen(!0),function(t){e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,i.attendedTransfer(t)];case 1:return e.sent()&&(j.currentCall.updateCurrentCall({transferring:!0,paused:!1}),j.player.playRemoteAudio()),[2]}}))}))}(r),d.eventDispatch("phone-island-call-transfer-opened",{})})),v.default.createElement(v.default.Fragment,null,h)};
|
|
2
2
|
//# sourceMappingURL=WebRTC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef, useCallback, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { attendedTransfer, hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\nimport { eventDispatch, useEventListener } from '../utils'\nimport { isPhysical } from '../lib/user/default_device'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n reload: boolean\n uaType: string\n reloadedCallback?: () => void\n}\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n reload,\n uaType,\n reloadedCallback,\n}) => {\n // Initialize store dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // Initialize Janus from Janus library\n const janus = useRef<JanusTypes>(JanusLib)\n\n // Initializes the webrtc connection and handlers\n const initWebRTC = useCallback(() => {\n janus.current.init({\n debug: 'all',\n dependencies: janus.current.useDefaultDependencies({\n adapter,\n }),\n callback: function () {\n const janusInstance = new janus.current({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (janus.current.log)\n janus.current.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (janus.current.error) {\n janus.current.error(' -- Error attaching plugin...')\n janus.current.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (janus.current.log) janus.current.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (janus.current.log)\n janus.current.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (janus.current.warn)\n janus.current.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (janus.current.warn)\n janus.current.warn(\n `SLOW link: janus is not receiving all your packets (${count})`,\n )\n }\n },\n onmessage: function (msg, jsep) {\n // Get webrtc state\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a message :::')\n janus.current.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (janus.current.log) janus.current.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // Get event data\n var event = result['event']\n // Get the recording state\n const { recording } = store.getState().recorder\n\n // Manage different types of events\n switch (event) {\n case 'registration_failed':\n if (janus.current.error)\n janus.current.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully un-registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-unregistered', {})\n break\n\n case 'registered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-registered', {})\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Remove WebRTC connections alert if any\n dispatch.alerts.removeAlert('webrtc_down')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (janus.current.log) {\n janus.current.log('janus registering')\n }\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log) {\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n const { default_device } = store.getState().currentUser\n if (\n (uaType === 'mobile' && default_device?.type === 'nethlink') ||\n (uaType === 'desktop' && default_device?.type === 'webrtc')\n ) {\n // Update webrtc state\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n // Check if is recording an audio through call\n // ...recording an audio is a request made by the user\n // ...it must be managed differently than an incoming call\n if (recording) {\n // Update the recorder state\n dispatch.recorder.setIncoming(true)\n } else {\n // Manage the incoming message as a webrtc call\n // Update incoming webrtc state, number and display name\n // ...are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log) {\n janus.current.log('Incoming call from ' + result['username'] + '!')\n }\n }\n\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n }\n\n break\n\n case 'accepted':\n const acceptedTimestamp = Math.floor(Date.now() / 1000)\n if (janus.current.log) {\n janus.current.log(result['username'] + ' accepted the call!')\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n\n // Set incoming value to false and set start time\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n startTime: acceptedTimestamp?.toString(),\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n // Manage hangup message during recording\n if (recording) {\n dispatch.recorder.setRecording(false)\n }\n if (!isPhysical() && uaType !== 'mobile') {\n hangupCurrentCall()\n sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Check the janus doc before enable the following\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n // Reset current call info\n store.dispatch.currentCall.reset()\n if (janus.current.log)\n janus.current.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n }\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n break\n\n case 'gateway_down':\n console.warn('THE GATEWAY IS DOWN')\n\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a local stream :::')\n janus.current.debug(stream)\n }\n\n // Get local video element\n const localVideoElement = store.getState().player.localVideo\n\n // Get audio and video tracks from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for local audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateLocalAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on local stream')\n }\n // Initialize the new media stream for local video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (localVideoElement && localVideoElement.current) {\n janus.current.attachMediaStream(localVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on local stream')\n }\n }\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n if (remoteAudioElement && remoteAudioElement.current) {\n janus.current.attachMediaStream(remoteAudioElement.current, audioStream)\n }\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (remoteVideoElement && remoteVideoElement.current) {\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (janus.current.log) {\n janus.current.log(' ::: janus Got a cleanup notification :::')\n }\n },\n detached: function () {\n if (janus.current.warn) {\n janus.current.warn('SIP plugin handle detached from the plugin itself')\n }\n },\n })\n }\n },\n error: (err: any) => {\n if (janus.current.log) janus.current.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }, [janus.current])\n\n // Check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n const [isOnline, setIsOnline] = useState(navigator.onLine)\n const [connectionReturned, setConnectionReturned] = useState(false)\n const wasOfflineRef = useRef(false)\n\n useEffect(() => {\n // Event listeners for online/offline status\n const handleOnline = () => setIsOnline(true)\n const handleOffline = () => setIsOnline(false)\n\n window.addEventListener('online', handleOnline)\n window.addEventListener('offline', handleOffline)\n\n return () => {\n window.removeEventListener('online', handleOnline)\n window.removeEventListener('offline', handleOffline)\n }\n }, [])\n\n // Reconnection management\n useEffect(() => {\n if (!isOnline) {\n console.log('Internet connection lost.')\n wasOfflineRef.current = true\n setConnectionReturned(false)\n } else if (wasOfflineRef.current) {\n console.log('Internet connection restored.')\n setConnectionReturned(true)\n wasOfflineRef.current = false\n }\n }, [isOnline])\n\n // Manage webrtc connections and events\n useEffect(() => {\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload || connectionReturned) {\n // Unregister the WebRTC extension\n unregister()\n // Detach sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) sipcall.detach()\n // Destroy Janus session\n if (janus.current.destroy) janus.current.destroy()\n // Initialize a new Janus session\n setTimeout(() => {\n initWebRTC()\n // Execute the reloaded callback\n if (reloadedCallback) reloadedCallback()\n }, 10000)\n }\n }, [reload, connectionReturned])\n\n useEventListener('phone-island-attach', (data) => {\n initWebRTC()\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-attached', {})\n })\n\n /**\n * Event listner for phone-island-call-transfer event\n */\n useEventListener('phone-island-call-transfer', (data) => {\n const transferNumber = data?.to\n dispatch.island.toggleIsOpen(true)\n handleAttendedTransfer(transferNumber)\n eventDispatch('phone-island-call-transfer-opened', {})\n })\n\n async function handleAttendedTransfer(number: string) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n // Play the remote audio element\n dispatch.player.playRemoteAudio()\n }\n }\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","reload","uaType","reloadedCallback","dispatch","useDispatch","janusCheckInterval","useRef","janus","JanusLib","initWebRTC","useCallback","current","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","event","recording","recorder","eventDispatch","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","default_device","currentUser","type","jsepGlobal","setIncoming","checkIncomingUpdatePlay","incomingWebRTC","acceptedTimestamp","Math","floor","now","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","startTime","toString","stopAudioPlayer","setRecording","isPhysical","hangupCurrentCall","hangup","reset","console","onlocalstream","stream","localVideoElement","localVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateLocalAudioStream","videoStream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","updateRemoteAudioStream","oncleanup","detached","err","setAlert","destroyed","useEffect","checkMediaPermissions","_b","useState","navigator","onLine","isOnline","setIsOnline","_c","connectionReturned","setConnectionReturned","wasOfflineRef","handleOnline","handleOffline","window","addEventListener","removeEventListener","CHECK_INTERVAL_TIME","setInterval","webrtcCheck","unregister","clearInterval","detach","destroy","setTimeout","useEventListener","data","updateCurrentDefaultDevice","deviceInformationObject","transferNumber","to","island","toggleIsOpen","number","attendedTransfer","sent","transferring","paused","playRemoteAudio","handleAttendedTransfer","React","createElement","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef, useCallback, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { attendedTransfer, hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\nimport { eventDispatch, useEventListener } from '../utils'\nimport { isPhysical } from '../lib/user/default_device'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n reload: boolean\n uaType: string\n reloadedCallback?: () => void\n}\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n reload,\n uaType,\n reloadedCallback,\n}) => {\n // Initialize store dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // Initialize Janus from Janus library\n const janus = useRef<JanusTypes>(JanusLib)\n\n // Initializes the webrtc connection and handlers\n const initWebRTC = useCallback(() => {\n janus.current.init({\n debug: 'all',\n dependencies: janus.current.useDefaultDependencies({\n adapter,\n }),\n callback: function () {\n const janusInstance = new janus.current({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (janus.current.log)\n janus.current.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (janus.current.error) {\n janus.current.error(' -- Error attaching plugin...')\n janus.current.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (janus.current.log) janus.current.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (janus.current.log)\n janus.current.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (janus.current.warn)\n janus.current.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (janus.current.warn)\n janus.current.warn(\n `SLOW link: janus is not receiving all your packets (${count})`,\n )\n }\n },\n onmessage: function (msg, jsep) {\n // Get webrtc state\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a message :::')\n janus.current.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (janus.current.log) janus.current.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // Get event data\n var event = result['event']\n // Get the recording state\n const { recording } = store.getState().recorder\n const { view } = store.getState().island\n\n // Manage different types of events\n switch (event) {\n case 'registration_failed':\n if (janus.current.error)\n janus.current.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully un-registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-unregistered', {})\n break\n\n case 'registered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-registered', {})\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Remove WebRTC connections alert if any\n dispatch.alerts.removeAlert('webrtc_down')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (janus.current.log) {\n janus.current.log('janus registering')\n }\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n if (view !== 'call') {\n dispatch.island.setIslandView('call')\n }\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log) {\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n const { default_device } = store.getState().currentUser\n const { endpoints, username } = store.getState().currentUser\n const { extensions } = store.getState().users\n\n const hasOnlineNethlink = () => {\n if (!extensions || !username) return false\n\n // Get all extensions for current user\n const userExtensions: any = Object.values(extensions).filter(\n (ext) => ext?.username === username,\n )\n\n // Check if any extension is nethlink type and online\n return userExtensions?.some((ext) => {\n const endpointExtension = endpoints?.extension.find(\n (endpoint) => endpoint.id === ext?.exten,\n )\n return (\n endpointExtension?.type === 'nethlink' && ext?.status !== 'offline'\n )\n })\n }\n\n if (\n (uaType === 'mobile' && hasOnlineNethlink()) ||\n (uaType === 'desktop' &&\n (default_device?.type === 'webrtc' ||\n (default_device?.type === undefined && !hasOnlineNethlink()) ||\n (!hasOnlineNethlink() && default_device?.type === 'physical')))\n ) {\n // Update webrtc state\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n // Check if is recording an audio through call\n // ...recording an audio is a request made by the user\n // ...it must be managed differently than an incoming call\n if (recording) {\n // Update the recorder state\n dispatch.recorder.setIncoming(true)\n } else {\n // Manage the incoming message as a webrtc call\n // Update incoming webrtc state, number and display name\n // ...are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log) {\n dispatch.currentCall.updateIncoming(true)\n janus.current.log('Incoming call from ' + result['username'] + '!')\n }\n }\n\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n store.dispatch.island.setIslandView('call')\n }\n\n break\n\n case 'accepted':\n const acceptedTimestamp = Math.floor(Date.now() / 1000)\n if (janus.current.log) {\n janus.current.log(result['username'] + ' accepted the call!')\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n\n // Set incoming value to false and set start time\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n startTime: acceptedTimestamp?.toString(),\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n // Manage hangup message during recording\n if (recording) {\n dispatch.recorder.setRecording(false)\n }\n if (!isPhysical() && uaType !== 'mobile') {\n hangupCurrentCall()\n sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Check the janus doc before enable the following\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n // Reset current call info\n store.dispatch.currentCall.reset()\n if (janus.current.log)\n janus.current.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n }\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n break\n\n case 'gateway_down':\n console.warn('THE GATEWAY IS DOWN')\n\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a local stream :::')\n janus.current.debug(stream)\n }\n\n // Get local video element\n const localVideoElement = store.getState().player.localVideo\n\n // Get audio and video tracks from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for local audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateLocalAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on local stream')\n }\n // Initialize the new media stream for local video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (localVideoElement && localVideoElement.current) {\n janus.current.attachMediaStream(localVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on local stream')\n }\n }\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n if (remoteAudioElement && remoteAudioElement.current) {\n janus.current.attachMediaStream(remoteAudioElement.current, audioStream)\n }\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (remoteVideoElement && remoteVideoElement.current) {\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (janus.current.log) {\n janus.current.log(' ::: janus Got a cleanup notification :::')\n }\n },\n detached: function () {\n if (janus.current.warn) {\n janus.current.warn('SIP plugin handle detached from the plugin itself')\n }\n },\n })\n }\n },\n error: (err: any) => {\n if (janus.current.log) janus.current.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }, [janus.current])\n\n // Check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n const [isOnline, setIsOnline] = useState(navigator.onLine)\n const [connectionReturned, setConnectionReturned] = useState(false)\n const wasOfflineRef = useRef(false)\n\n useEffect(() => {\n // Event listeners for online/offline status\n const handleOnline = () => setIsOnline(true)\n const handleOffline = () => setIsOnline(false)\n\n window.addEventListener('online', handleOnline)\n window.addEventListener('offline', handleOffline)\n\n return () => {\n window.removeEventListener('online', handleOnline)\n window.removeEventListener('offline', handleOffline)\n }\n }, [])\n\n // Reconnection management\n useEffect(() => {\n if (!isOnline) {\n console.log('Internet connection lost.')\n wasOfflineRef.current = true\n setConnectionReturned(false)\n } else if (wasOfflineRef.current) {\n console.log('Internet connection restored.')\n setConnectionReturned(true)\n wasOfflineRef.current = false\n }\n }, [isOnline])\n\n // Manage webrtc connections and events\n useEffect(() => {\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload || connectionReturned) {\n // Unregister the WebRTC extension\n unregister()\n // Detach sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) sipcall.detach()\n // Destroy Janus session\n if (janus.current.destroy) janus.current.destroy()\n // Initialize a new Janus session\n setTimeout(() => {\n initWebRTC()\n // Execute the reloaded callback\n if (reloadedCallback) reloadedCallback()\n }, 10000)\n }\n }, [reload, connectionReturned])\n\n useEventListener('phone-island-attach', (data) => {\n initWebRTC()\n eventDispatch('phone-island-attached', {})\n })\n\n /**\n * Event listner for phone-island-call-transfer event\n */\n useEventListener('phone-island-call-transfer', (data) => {\n const transferNumber = data?.to\n dispatch.island.toggleIsOpen(true)\n handleAttendedTransfer(transferNumber)\n eventDispatch('phone-island-call-transfer-opened', {})\n })\n\n async function handleAttendedTransfer(number: string) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n // Play the remote audio element\n dispatch.player.playRemoteAudio()\n }\n }\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","reload","uaType","reloadedCallback","dispatch","useDispatch","janusCheckInterval","useRef","janus","JanusLib","initWebRTC","useCallback","current","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","event","recording","recorder","view","island","eventDispatch","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setIslandView","handleRemote","default_device","currentUser","endpoints_1","endpoints","username_1","extensions_1","users","extensions","hasOnlineNethlink","userExtensions","Object","values","filter","ext","username","some","endpointExtension","extension","find","endpoint","id","exten","type","status","jsepGlobal","setIncoming","checkIncomingUpdatePlay","incomingWebRTC","updateIncoming","acceptedTimestamp","Math","floor","now","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","startTime","toString","stopAudioPlayer","setRecording","isPhysical","hangupCurrentCall","hangup","reset","console","onlocalstream","stream","localVideoElement","localVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateLocalAudioStream","videoStream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","updateRemoteAudioStream","oncleanup","detached","err","setAlert","destroyed","useEffect","checkMediaPermissions","_b","useState","navigator","onLine","isOnline","setIsOnline","_c","connectionReturned","setConnectionReturned","wasOfflineRef","handleOnline","handleOffline","window","addEventListener","removeEventListener","CHECK_INTERVAL_TIME","setInterval","webrtcCheck","unregister","clearInterval","detach","destroy","setTimeout","useEventListener","data","transferNumber","to","toggleIsOpen","number","attendedTransfer","sent","transferring","paused","playRemoteAudio","handleAttendedTransfer","React","createElement","Fragment"],"mappings":"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"}
|
package/dist/lib/phone/call.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../webrtc/messages.js"),r=require("../../store/index.js"),n=require("../user/default_device.js"),a=require("../../services/astproxy.js"),s=require("../../static/dtmf/index.js");require("react");var i=require("../../utils/genericFunctions/eventDispatch.js");exports.answerIncomingCall=function(){n.isWebRTC()?t.answerWebRTC():a.answerPhysical()},exports.attendedTransfer=function(t){return e.__awaiter(this,void 0,void 0,(function(){var n,s;return e.__generator(this,(function(e){switch(e.label){case 0:return n=r.store.getState().currentCall.conversationId,s=r.store.getState().currentUser.default_device,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../webrtc/messages.js"),r=require("../../store/index.js"),n=require("../user/default_device.js"),a=require("../../services/astproxy.js"),s=require("../../static/dtmf/index.js");require("react");var i=require("../../utils/genericFunctions/eventDispatch.js");exports.answerIncomingCall=function(){n.isWebRTC()?t.answerWebRTC():a.answerPhysical()},exports.attendedTransfer=function(t){return e.__awaiter(this,void 0,void 0,(function(){var n,s,i;return e.__generator(this,(function(e){switch(e.label){case 0:return n=r.store.getState().currentCall.conversationId,s=r.store.getState().currentUser.default_device,i=(null==s?void 0:s.id)||(null==s?void 0:s.exten),n&&i&&t?[4,a.attendedTransfer({convid:n,to:t,endpointId:i})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,r){var s="sip:".concat(e,"@").concat(r);n.isWebRTC()?t.callSipURI(s):a.callPhysical(e),i.eventDispatch("phone-island-call-started",{})},exports.hangupAllExtensions=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){a.hangupConversation({convid:e,endpointId:t})}))};for(var n in e)t(n)},exports.hangupCurrentCall=function(){var e=r.store.getState().currentCall,s=e.outgoing,o=e.accepted;(s||o)&&(n.isWebRTC()?t.hangup():a.hangupPhysical(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.currentCall.reset(),r.store.dispatch.listen.reset()),i.eventDispatch("phone-island-call-ended",{})},exports.hangupCurrentPhysicalRecording=function(){a.hangupPhysicalRecordingCall(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.physicalRecorder.reset(),r.store.dispatch.physicalRecorder.setRecording(!1),r.store.dispatch.island.setIslandView(null),r.store.dispatch.listen.reset(),i.eventDispatch("phone-island-call-ended",{})},exports.muteCurrentCall=function(){n.isWebRTC()?t.muteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!0}):a.mutePhysical(!0),i.eventDispatch("phone-island-call-muted",{})},exports.parkCurrentCall=function(){var e,t,n,s,o=null===(t=null===(e=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===e?void 0:e.currentCall)||void 0===t?void 0:t.conversationId,l=null===(s=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===s?void 0:s.conversations,u={};if(o){if(l)for(var c in l)if(l.hasOwnProperty(c)){var d=l[c];Object.keys(d).length>0&&(u={numberParkId:c,idConversation:o})}Object.keys(u).length>0&&(null==u?void 0:u.numberParkId)&&(a.parkConversation({applicantId:null==u?void 0:u.numberParkId,convid:o,endpointId:null==u?void 0:u.numberParkId}),r.store.dispatch.currentCall.setParked(!0),i.eventDispatch("phone-island-call-parked",{}))}},exports.pauseCurrentCall=function(){n.isWebRTC()?t.pauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!0}),r.store.dispatch.player.pauseRemoteAudio()):a.pausePhysical(!0),i.eventDispatch("phone-island-call-held",{})},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),r.store.dispatch.player.updateStartAudioPlayer({src:s.default["dtmf_".concat(e)]})},exports.recordCurrentCall=function(t){var n,s,i,o;return e.__awaiter(this,void 0,void 0,(function(){var l,u,c,d,p,v,h;return e.__generator(this,(function(e){switch(e.label){case 0:return r.store.dispatch.currentCall.updateRecordingStatus(!t),l=null===(s=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===s?void 0:s.conversations,(u=function(e){for(var t in e)if(0!==Object.keys(e[t]).length){var r=Object.values(e[t])[0];return{id:r.id,recording:r.recording}}return null}(l))?[3,1]:[2];case 1:switch(c=null===(i=null==u?void 0:u.id)||void 0===i?void 0:i.match(/\/(\d+)-/),d=c[1],p={convid:null===(o=null==u?void 0:u.id)||void 0===o?void 0:o.toString(),endpointId:null==d?void 0:d.toString()},v="",null==u?void 0:u.recording){case"false":v="start_record";break;case"true":v="mute_record";break;case"mute":v="unmute_record";break;default:v=""}if(!p)return[3,5];e.label=2;case 2:return e.trys.push([2,4,,5]),[4,a.toggleRecord(v,p)];case 3:return e.sent(),[3,5];case 4:return h=e.sent(),console.error(h),[2,[]];case 5:return[2]}}))}))},exports.unmuteCurrentCall=function(){n.isWebRTC()?t.unmuteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!1}):a.mutePhysical(!1),i.eventDispatch("phone-island-call-unmuted",{})},exports.unpauseCurrentCall=function(){n.isWebRTC()?t.unpauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!1}),r.store.dispatch.player.playRemoteAudio()):a.pausePhysical(!1),i.eventDispatch("phone-island-call-unheld",{})};
|
|
2
2
|
//# sourceMappingURL=call.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport {\n callSipURI,\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 hangupPhysical,\n answerPhysical,\n mutePhysical,\n pausePhysical,\n callPhysical,\n toggleRecord,\n hangupPhysicalRecordingCall,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\nimport { eventDispatch } from '../../utils'\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 if (isWebRTC()) {\n callSipURI(sipURI)\n } else {\n callPhysical(number)\n }\n\n eventDispatch('phone-island-call-started', {})\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n } else {\n answerPhysical()\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 if (isWebRTC()) {\n hangup()\n } else {\n hangupPhysical()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n store.dispatch.listen.reset()\n }\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\n}\n\n/**\n * Hangup current physical recording\n */\nexport function hangupCurrentPhysicalRecording() {\n hangupPhysicalRecordingCall()\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.physicalRecorder.reset()\n store.dispatch.physicalRecorder.setRecording(false)\n store.dispatch.island.setIslandView(null)\n store.dispatch.listen.reset()\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\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 } else {\n mutePhysical(true)\n }\n eventDispatch('phone-island-call-muted', {})\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 } else {\n mutePhysical(false)\n }\n eventDispatch('phone-island-call-unmuted', {})\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 } else {\n pausePhysical(true)\n }\n eventDispatch('phone-island-call-held', {})\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 } else {\n pausePhysical(false)\n }\n eventDispatch('phone-island-call-unheld', {})\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\n/**\n * Park the current call\n */\nexport function parkCurrentCall() {\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 store.dispatch.currentCall.setParked(true)\n\n eventDispatch('phone-island-call-parked', {})\n }\n }\n }\n}\n\nconst findFirstExtesnionNotEmpty = (data) => {\n for (const key in data) {\n if (Object.keys(data[key]).length !== 0) {\n const firstEntry: any = Object.values(data[key])[0]\n return {\n id: firstEntry.id,\n recording: firstEntry.recording,\n }\n }\n }\n return null\n}\n\nexport async function recordCurrentCall(recordingValue: boolean) {\n store.dispatch.currentCall.updateRecordingStatus(!recordingValue)\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n const firstExtensionNotEmpty = findFirstExtesnionNotEmpty(userConversationInformations)\n\n if (!firstExtensionNotEmpty) {\n return\n } else {\n const numberToSendCall = firstExtensionNotEmpty?.id?.match(/\\/(\\d+)-/)\n const endpointId = numberToSendCall[1]\n\n const listenInformations = {\n convid: firstExtensionNotEmpty?.id?.toString(),\n endpointId: endpointId?.toString(),\n }\n\n let recordingValues = ''\n switch (firstExtensionNotEmpty?.recording) {\n case 'false':\n recordingValues = 'start_record'\n break\n case 'true':\n recordingValues = 'mute_record'\n break\n case 'mute':\n recordingValues = 'unmute_record'\n break\n default:\n recordingValues = ''\n break\n }\n\n if (listenInformations) {\n try {\n await toggleRecord(recordingValues, listenInformations)\n } catch (e) {\n console.error(e)\n return []\n }\n }\n }\n}\n"],"names":["isWebRTC","answerWebRTC","answerPhysical","number","conversationId","store","getState","currentCall","default_device","currentUser","id","attendedTransferRequest","convid","to","endpointId","_a","sipHost","sipURI","concat","callSipURI","callPhysical","eventDispatch","conversations","extension","Object","keys","forEach","hangupConversation","outgoing","accepted","hangup","hangupPhysical","dispatch","player","stopAudioPlayer","reset","listen","hangupPhysicalRecordingCall","physicalRecorder","setRecording","island","setIslandView","muteWebRTC","updateCurrentCall","muted","mutePhysical","_b","userConversationInformations","_d","_c","parkingInformation","key","hasOwnProperty","conversation","length","numberParkId","idConversation","parkConversation","applicantId","setParked","pauseWebRTC","paused","pauseRemoteAudio","pausePhysical","updateStartAudioPlayer","src","dtmfAudios","recordingValue","updateRecordingStatus","firstExtensionNotEmpty","data","firstEntry","values","recording","findFirstExtesnionNotEmpty","numberToSendCall","match","listenInformations","toString","recordingValues","toggleRecord","_e","sent","console","error","e_1","unmuteWebRTC","unpauseWebRTC","playRemoteAudio"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport {\n callSipURI,\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 hangupPhysical,\n answerPhysical,\n mutePhysical,\n pausePhysical,\n callPhysical,\n toggleRecord,\n hangupPhysicalRecordingCall,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\nimport { eventDispatch } from '../../utils'\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 if (isWebRTC()) {\n callSipURI(sipURI)\n } else {\n callPhysical(number)\n }\n\n eventDispatch('phone-island-call-started', {})\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n } else {\n answerPhysical()\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 if (isWebRTC()) {\n hangup()\n } else {\n hangupPhysical()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n store.dispatch.listen.reset()\n }\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\n}\n\n/**\n * Hangup current physical recording\n */\nexport function hangupCurrentPhysicalRecording() {\n hangupPhysicalRecordingCall()\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.physicalRecorder.reset()\n store.dispatch.physicalRecorder.setRecording(false)\n store.dispatch.island.setIslandView(null)\n store.dispatch.listen.reset()\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\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 } else {\n mutePhysical(true)\n }\n eventDispatch('phone-island-call-muted', {})\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 } else {\n mutePhysical(false)\n }\n eventDispatch('phone-island-call-unmuted', {})\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 } else {\n pausePhysical(true)\n }\n eventDispatch('phone-island-call-held', {})\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 } else {\n pausePhysical(false)\n }\n eventDispatch('phone-island-call-unheld', {})\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 let default_device_details = default_device?.id || default_device?.exten\n if (conversationId && default_device_details && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device_details,\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 let default_device_details = default_device?.id || default_device?.exten\n // Transfer the call through attended transfer\n if (conversationId && default_device_details && number) {\n return await attendedTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device_details,\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\n/**\n * Park the current call\n */\nexport function parkCurrentCall() {\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 store.dispatch.currentCall.setParked(true)\n\n eventDispatch('phone-island-call-parked', {})\n }\n }\n }\n}\n\nconst findFirstExtesnionNotEmpty = (data) => {\n for (const key in data) {\n if (Object.keys(data[key]).length !== 0) {\n const firstEntry: any = Object.values(data[key])[0]\n return {\n id: firstEntry.id,\n recording: firstEntry.recording,\n }\n }\n }\n return null\n}\n\nexport async function recordCurrentCall(recordingValue: boolean) {\n store.dispatch.currentCall.updateRecordingStatus(!recordingValue)\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n const firstExtensionNotEmpty = findFirstExtesnionNotEmpty(userConversationInformations)\n\n if (!firstExtensionNotEmpty) {\n return\n } else {\n const numberToSendCall = firstExtensionNotEmpty?.id?.match(/\\/(\\d+)-/)\n const endpointId = numberToSendCall[1]\n\n const listenInformations = {\n convid: firstExtensionNotEmpty?.id?.toString(),\n endpointId: endpointId?.toString(),\n }\n\n let recordingValues = ''\n switch (firstExtensionNotEmpty?.recording) {\n case 'false':\n recordingValues = 'start_record'\n break\n case 'true':\n recordingValues = 'mute_record'\n break\n case 'mute':\n recordingValues = 'unmute_record'\n break\n default:\n recordingValues = ''\n break\n }\n\n if (listenInformations) {\n try {\n await toggleRecord(recordingValues, listenInformations)\n } catch (e) {\n console.error(e)\n return []\n }\n }\n }\n}\n"],"names":["isWebRTC","answerWebRTC","answerPhysical","number","conversationId","store","getState","currentCall","default_device","currentUser","default_device_details","id","exten","attendedTransferRequest","convid","to","endpointId","_a","sipHost","sipURI","concat","callSipURI","callPhysical","eventDispatch","conversations","extension","Object","keys","forEach","hangupConversation","outgoing","accepted","hangup","hangupPhysical","dispatch","player","stopAudioPlayer","reset","listen","hangupPhysicalRecordingCall","physicalRecorder","setRecording","island","setIslandView","muteWebRTC","updateCurrentCall","muted","mutePhysical","_b","userConversationInformations","_d","_c","parkingInformation","key","hasOwnProperty","conversation","length","numberParkId","idConversation","parkConversation","applicantId","setParked","pauseWebRTC","paused","pauseRemoteAudio","pausePhysical","updateStartAudioPlayer","src","dtmfAudios","recordingValue","updateRecordingStatus","firstExtensionNotEmpty","data","firstEntry","values","recording","findFirstExtesnionNotEmpty","numberToSendCall","match","listenInformations","toString","recordingValues","toggleRecord","_e","sent","console","error","e_1","unmuteWebRTC","unpauseWebRTC","playRemoteAudio"],"mappings":"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"}
|
|
@@ -532,6 +532,61 @@ export declare const currentCall: {
|
|
|
532
532
|
ownerExtension: string;
|
|
533
533
|
isRecording: boolean;
|
|
534
534
|
};
|
|
535
|
+
updateIncoming: (state: {
|
|
536
|
+
displayName: string;
|
|
537
|
+
username: string;
|
|
538
|
+
number: string;
|
|
539
|
+
incomingSocket: boolean;
|
|
540
|
+
incomingWebRTC: boolean;
|
|
541
|
+
incoming: boolean;
|
|
542
|
+
acceptedSocket: boolean;
|
|
543
|
+
acceptedWebRTC: boolean;
|
|
544
|
+
accepted: boolean;
|
|
545
|
+
outgoingSocket: boolean;
|
|
546
|
+
outgoingWebRTC: boolean;
|
|
547
|
+
parked: boolean;
|
|
548
|
+
outgoing: boolean;
|
|
549
|
+
startTime: string;
|
|
550
|
+
muted: boolean;
|
|
551
|
+
paused: boolean;
|
|
552
|
+
keypadValue: string;
|
|
553
|
+
conversationId: string;
|
|
554
|
+
transferring: boolean;
|
|
555
|
+
transferringName: string;
|
|
556
|
+
transferringNumber: string;
|
|
557
|
+
transferringStartTime: string;
|
|
558
|
+
transferSwitching: boolean;
|
|
559
|
+
transferCalls: any[];
|
|
560
|
+
ownerExtension: string;
|
|
561
|
+
isRecording: boolean;
|
|
562
|
+
}, payload: boolean) => {
|
|
563
|
+
displayName: string;
|
|
564
|
+
username: string;
|
|
565
|
+
number: string;
|
|
566
|
+
incomingSocket: boolean;
|
|
567
|
+
incomingWebRTC: boolean;
|
|
568
|
+
incoming: boolean;
|
|
569
|
+
acceptedSocket: boolean;
|
|
570
|
+
acceptedWebRTC: boolean;
|
|
571
|
+
accepted: boolean;
|
|
572
|
+
outgoingSocket: boolean;
|
|
573
|
+
outgoingWebRTC: boolean;
|
|
574
|
+
parked: boolean;
|
|
575
|
+
outgoing: boolean;
|
|
576
|
+
startTime: string;
|
|
577
|
+
muted: boolean;
|
|
578
|
+
paused: boolean;
|
|
579
|
+
keypadValue: string;
|
|
580
|
+
conversationId: string;
|
|
581
|
+
transferring: boolean;
|
|
582
|
+
transferringName: string;
|
|
583
|
+
transferringNumber: string;
|
|
584
|
+
transferringStartTime: string;
|
|
585
|
+
transferSwitching: boolean;
|
|
586
|
+
transferCalls: any[];
|
|
587
|
+
ownerExtension: string;
|
|
588
|
+
isRecording: boolean;
|
|
589
|
+
};
|
|
535
590
|
reset: () => {
|
|
536
591
|
displayName: string;
|
|
537
592
|
username: string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),r=require("../node_modules/@rematch/core/dist/core.esm.js"),n=require("../static/incoming_ringtone.js"),t=require("../events/CallEvents.js");require("react");var i=require("../utils/genericFunctions/eventDispatch.js");require("../store/index.js"),require("../node_modules/react-redux/es/index.js");var a={displayName:"",username:"",number:"",incomingSocket:!1,incomingWebRTC:!1,incoming:!1,acceptedSocket:!1,acceptedWebRTC:!1,accepted:!1,outgoingSocket:!1,outgoingWebRTC:!1,parked:!1,outgoing:!1,startTime:"",muted:!1,paused:!1,keypadValue:"",conversationId:"",transferring:!1,transferringName:"",transferringNumber:"",transferringStartTime:"",transferSwitching:!1,transferCalls:new Array,ownerExtension:"",isRecording:!1},s=r.createModel()({state:a,reducers:{updateCurrentCall:function(r,n){return e.__assign(e.__assign(e.__assign({},r),n),{transferCalls:r.transferCalls})},updateKeypadValue:function(r,n){return e.__assign(e.__assign({},r),{keypadValue:n})},updateTransferring:function(r,n){return e.__assign(e.__assign({},r),{transferring:n})},updateTransferSwitching:function(r,n){return e.__assign(e.__assign({},r),{transferSwitching:n})},addTransferCalls:function(r,n){return r.transferCalls.find((function(e){return e.number===n.number}))?r:e.__assign(e.__assign({},r),{transferCalls:e.__spreadArray(e.__spreadArray([],r.transferCalls,!0),[n],!1)})},deleteTransferCalls:function(r){return e.__assign(e.__assign({},r),{transferCalls:r.transferCalls.filter((function(e){return"transferred"!==e.type}))})},setParked:function(e,r){return e.parked=r,e},updateRecordingStatus:function(e,r){return e.isRecording=r,e},updateStartTime:function(e,r){return e.startTime=r,e},reset:function(){return a}},effects:function(r){return{checkIncomingUpdatePlay:function(t,i){var a,s,u,c;("webrtc"===(null===(a=i.currentUser.default_device)||void 0===a?void 0:a.type)&&t.incomingWebRTC||"physical"===(null===(s=i.currentUser.default_device)||void 0===s?void 0:s.type)&&t.incomingSocket||"nethlink"===(null===(c=null===(u=null==i?void 0:i.currentUser)||void 0===u?void 0:u.default_device)||void 0===c?void 0:c.type)&&(null==t?void 0:t.incomingWebRTC))&&(t.incoming=!0,r.player.updateStartAudioPlayer({src:n.default,loop:!0})),r.currentCall.updateCurrentCall(e.__assign({},t))},checkOutgoingUpdate:function(n,i){var a,s,u;("webrtc"===(null===(a=i.currentUser.default_device)||void 0===a?void 0:a.type)&&n.outgoingWebRTC||"physical"===(null===(s=i.currentUser.default_device)||void 0===s?void 0:s.type)&&n.outgoingSocket||"nethlink"===(null===(u=i.currentUser.default_device)||void 0===u?void 0:u.type)&&n.outgoingWebRTC)&&(n.outgoing=!0,t.dispatchOutgoingCallStarted(n.displayName,n.number)),r.currentCall.updateCurrentCall(e.__assign({},n))},checkAcceptedUpdate:function(n,t){var a,s,u;("webrtc"===(null===(a=t.currentUser.default_device)||void 0===a?void 0:a.type)&&n.acceptedWebRTC||"physical"===(null===(s=t.currentUser.default_device)||void 0===s?void 0:s.type)&&n.acceptedSocket||"nethlink"===(null===(u=t.currentUser.default_device)||void 0===u?void 0:u.type)&&n.acceptedWebRTC)&&(n.accepted=!0,i.eventDispatch("phone-island-call-answered",{})),r.currentCall.updateCurrentCall(e.__assign({},n))}}}});exports.currentCall=s;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),r=require("../node_modules/@rematch/core/dist/core.esm.js"),n=require("../static/incoming_ringtone.js"),t=require("../events/CallEvents.js");require("react");var i=require("../utils/genericFunctions/eventDispatch.js");require("../store/index.js"),require("../node_modules/react-redux/es/index.js");var a={displayName:"",username:"",number:"",incomingSocket:!1,incomingWebRTC:!1,incoming:!1,acceptedSocket:!1,acceptedWebRTC:!1,accepted:!1,outgoingSocket:!1,outgoingWebRTC:!1,parked:!1,outgoing:!1,startTime:"",muted:!1,paused:!1,keypadValue:"",conversationId:"",transferring:!1,transferringName:"",transferringNumber:"",transferringStartTime:"",transferSwitching:!1,transferCalls:new Array,ownerExtension:"",isRecording:!1},s=r.createModel()({state:a,reducers:{updateCurrentCall:function(r,n){return e.__assign(e.__assign(e.__assign({},r),n),{transferCalls:r.transferCalls})},updateKeypadValue:function(r,n){return e.__assign(e.__assign({},r),{keypadValue:n})},updateTransferring:function(r,n){return e.__assign(e.__assign({},r),{transferring:n})},updateTransferSwitching:function(r,n){return e.__assign(e.__assign({},r),{transferSwitching:n})},addTransferCalls:function(r,n){return r.transferCalls.find((function(e){return e.number===n.number}))?r:e.__assign(e.__assign({},r),{transferCalls:e.__spreadArray(e.__spreadArray([],r.transferCalls,!0),[n],!1)})},deleteTransferCalls:function(r){return e.__assign(e.__assign({},r),{transferCalls:r.transferCalls.filter((function(e){return"transferred"!==e.type}))})},setParked:function(e,r){return e.parked=r,e},updateRecordingStatus:function(e,r){return e.isRecording=r,e},updateStartTime:function(e,r){return e.startTime=r,e},updateIncoming:function(e,r){return e.incoming=r,e},reset:function(){return a}},effects:function(r){return{checkIncomingUpdatePlay:function(t,i){var a,s,u,c;("webrtc"===(null===(a=i.currentUser.default_device)||void 0===a?void 0:a.type)&&t.incomingWebRTC||"physical"===(null===(s=i.currentUser.default_device)||void 0===s?void 0:s.type)&&t.incomingSocket||"nethlink"===(null===(c=null===(u=null==i?void 0:i.currentUser)||void 0===u?void 0:u.default_device)||void 0===c?void 0:c.type)&&(null==t?void 0:t.incomingWebRTC))&&(t.incoming=!0,r.player.updateStartAudioPlayer({src:n.default,loop:!0})),r.currentCall.updateCurrentCall(e.__assign({},t))},checkOutgoingUpdate:function(n,i){var a,s,u;("webrtc"===(null===(a=i.currentUser.default_device)||void 0===a?void 0:a.type)&&n.outgoingWebRTC||"physical"===(null===(s=i.currentUser.default_device)||void 0===s?void 0:s.type)&&n.outgoingSocket||"nethlink"===(null===(u=i.currentUser.default_device)||void 0===u?void 0:u.type)&&n.outgoingWebRTC)&&(n.outgoing=!0,t.dispatchOutgoingCallStarted(n.displayName,n.number)),r.currentCall.updateCurrentCall(e.__assign({},n))},checkAcceptedUpdate:function(n,t){var a,s,u;("webrtc"===(null===(a=t.currentUser.default_device)||void 0===a?void 0:a.type)&&n.acceptedWebRTC||"physical"===(null===(s=t.currentUser.default_device)||void 0===s?void 0:s.type)&&n.acceptedSocket||"nethlink"===(null===(u=t.currentUser.default_device)||void 0===u?void 0:u.type)&&n.acceptedWebRTC)&&(n.accepted=!0,i.eventDispatch("phone-island-call-answered",{})),r.currentCall.updateCurrentCall(e.__assign({},n))}}}});exports.currentCall=s;
|
|
2
2
|
//# sourceMappingURL=currentCall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentCall.js","sources":["../../src/models/currentCall.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport incomingRingtone from '../static/incoming_ringtone'\nimport { dispatchOutgoingCallStarted } from '../events/index'\nimport { eventDispatch } from '../utils'\n\nconst defaultState = {\n displayName: '',\n username: '',\n number: '',\n incomingSocket: false,\n incomingWebRTC: false,\n incoming: false,\n acceptedSocket: false,\n acceptedWebRTC: false,\n accepted: false,\n outgoingSocket: false,\n outgoingWebRTC: false,\n parked: false,\n outgoing: false,\n startTime: '',\n muted: false,\n paused: false,\n keypadValue: '',\n conversationId: '',\n transferring: false,\n transferringName: '',\n transferringNumber: '',\n transferringStartTime: '',\n transferSwitching: false,\n transferCalls: new Array(),\n ownerExtension: '',\n isRecording: false,\n}\n\nexport const currentCall = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updateCurrentCall: (state, payload: CurrentCallTypes) => {\n return {\n ...state,\n ...payload,\n transferCalls: state.transferCalls,\n }\n },\n updateKeypadValue: (state, payload: string) => {\n return {\n ...state,\n keypadValue: payload,\n }\n },\n updateTransferring: (state, payload: boolean) => {\n return {\n ...state,\n transferring: payload,\n }\n },\n updateTransferSwitching: (state, payload: boolean) => {\n return {\n ...state,\n transferSwitching: payload,\n }\n },\n addTransferCalls: (state, payload: TransferCallsTypes) => {\n if (state.transferCalls.find((item) => item.number === payload.number)) {\n return state\n } else {\n return {\n ...state,\n transferCalls: [...state.transferCalls, payload],\n }\n }\n },\n deleteTransferCalls: (state) => {\n return {\n ...state,\n transferCalls: state.transferCalls.filter((item) => item.type !== 'transferred'),\n }\n },\n setParked: (state, payload: boolean) => {\n state.parked = payload\n return state\n },\n updateRecordingStatus: (state, payload: boolean) => {\n state.isRecording = payload\n return state\n },\n updateStartTime: (state, payload: string) => {\n state.startTime = payload\n return state\n },\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n checkIncomingUpdatePlay: (payload: CurrentCallTypes, rootState) => {\n // Check call type and incoming confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.incomingWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.incomingSocket) ||\n (rootState?.currentUser?.default_device?.type === 'nethlink' && payload?.incomingWebRTC)\n ) {\n payload.incoming = true\n\n // Update local player and play the audio\n dispatch.player.updateStartAudioPlayer({ src: incomingRingtone, loop: true })\n }\n // Update the current call values and set incoming\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n checkOutgoingUpdate: (payload: CurrentCallTypes, rootState) => {\n // Check call type and outgoing confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.outgoingWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.outgoingSocket) ||\n (rootState.currentUser.default_device?.type === 'nethlink' && payload.outgoingWebRTC)\n ) {\n payload.outgoing = true\n // Dispatch an event for outgoing call\n dispatchOutgoingCallStarted(payload.displayName, payload.number)\n }\n // Update the current call values and set outgoing\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n checkAcceptedUpdate: (payload: CurrentCallTypes, rootState) => {\n // Check call type and accepted confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.acceptedWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.acceptedSocket) ||\n (rootState.currentUser.default_device?.type === 'nethlink' && payload.acceptedWebRTC)\n ) {\n payload.accepted = true\n eventDispatch('phone-island-call-answered', {})\n }\n // Update the current call values\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n }),\n})\n\nexport type TransferCallsTypes = {\n type: 'transferred' | 'destination'\n displayName: string\n number: string\n startTime: string\n}\n\nexport interface CurrentCallTypes {\n displayName?: string\n username?: string\n number?: string\n incomingSocket?: boolean\n incomingWebRTC?: boolean\n parked?: boolean\n incoming?: boolean\n acceptedSocket?: boolean\n acceptedWebRTC?: boolean\n accepted?: boolean\n outgoingSocket?: boolean\n outgoingWebRTC?: boolean\n outgoing?: boolean\n startTime?: string\n muted?: boolean\n paused?: boolean\n conversationId?: string\n transferring?: boolean\n transferringName?: string\n transferringNumber?: string\n transferringStartTime?: string\n transferSwitching?: boolean\n transferCalls?: TransferCallsTypes[]\n ownerExtension?: string\n isRecording?: boolean\n}\n"],"names":["defaultState","displayName","username","number","incomingSocket","incomingWebRTC","incoming","acceptedSocket","acceptedWebRTC","accepted","outgoingSocket","outgoingWebRTC","parked","outgoing","startTime","muted","paused","keypadValue","conversationId","transferring","transferringName","transferringNumber","transferringStartTime","transferSwitching","transferCalls","Array","ownerExtension","isRecording","currentCall","createModel","state","reducers","updateCurrentCall","payload","__assign","updateKeypadValue","updateTransferring","updateTransferSwitching","addTransferCalls","find","item","__spreadArray","deleteTransferCalls","filter","type","setParked","updateRecordingStatus","updateStartTime","reset","effects","dispatch","checkIncomingUpdatePlay","rootState","_a","currentUser","default_device","_b","_d","_c","player","updateStartAudioPlayer","src","incomingRingtone","loop","checkOutgoingUpdate","dispatchOutgoingCallStarted","checkAcceptedUpdate","eventDispatch"],"mappings":"kaASA,IAAMA,EAAe,CACnBC,YAAa,GACbC,SAAU,GACVC,OAAQ,GACRC,gBAAgB,EAChBC,gBAAgB,EAChBC,UAAU,EACVC,gBAAgB,EAChBC,gBAAgB,EAChBC,UAAU,EACVC,gBAAgB,EAChBC,gBAAgB,EAChBC,QAAQ,EACRC,UAAU,EACVC,UAAW,GACXC,OAAO,EACPC,QAAQ,EACRC,YAAa,GACbC,eAAgB,GAChBC,cAAc,EACdC,iBAAkB,GAClBC,mBAAoB,GACpBC,sBAAuB,GACvBC,mBAAmB,EACnBC,cAAe,IAAIC,MACnBC,eAAgB,GAChBC,aAAa,GAGFC,EAAcC,EAAWA,aAAXA,CAAyB,CAClDC,MAAO9B,EACP+B,SAAU,CACRC,kBAAmB,SAACF,EAAOG,GACzB,OACKC,WAAAA,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAAJ,GACAG,GAAO,CACVT,cAAeM,EAAMN,eAExB,EACDW,kBAAmB,SAACL,EAAOG,GACzB,OAAAC,EAAAA,SAAAA,EAAAA,SAAA,GACKJ,GAAK,CACRb,YAAagB,GAEhB,EACDG,mBAAoB,SAACN,EAAOG,GAC1B,OAAAC,EAAAA,SAAAA,EAAAA,SAAA,GACKJ,GAAK,CACRX,aAAcc,GAEjB,EACDI,wBAAyB,SAACP,EAAOG,GAC/B,OAAAC,EAAAA,SAAAA,EAAAA,SAAA,GACKJ,GAAK,CACRP,kBAAmBU,GAEtB,EACDK,iBAAkB,SAACR,EAAOG,GACxB,OAAIH,EAAMN,cAAce,MAAK,SAACC,GAAS,OAAAA,EAAKrC,SAAW8B,EAAQ9B,MAAM,IAC5D2B,EAGFI,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAAJ,IACHN,cAAaiB,EAAAA,cAAAA,EAAAA,cAAA,GAAMX,EAAMN,eAAe,GAAA,CAAAS,IACzC,IAEJ,EACDS,oBAAqB,SAACZ,GACpB,OACKI,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAAJ,IACHN,cAAeM,EAAMN,cAAcmB,QAAO,SAACH,GAAS,MAAc,gBAAdA,EAAKI,IAAsB,KAElF,EACDC,UAAW,SAACf,EAAOG,GAEjB,OADAH,EAAMlB,OAASqB,EACRH,CACR,EACDgB,sBAAuB,SAAChB,EAAOG,GAE7B,OADAH,EAAMH,YAAcM,EACbH,CACR,EACDiB,gBAAiB,SAACjB,EAAOG,GAEvB,OADAH,EAAMhB,UAAYmB,EACXH,CACR,EACDkB,MAAO,WACL,
|
|
1
|
+
{"version":3,"file":"currentCall.js","sources":["../../src/models/currentCall.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport incomingRingtone from '../static/incoming_ringtone'\nimport { dispatchOutgoingCallStarted } from '../events/index'\nimport { eventDispatch } from '../utils'\n\nconst defaultState = {\n displayName: '',\n username: '',\n number: '',\n incomingSocket: false,\n incomingWebRTC: false,\n incoming: false,\n acceptedSocket: false,\n acceptedWebRTC: false,\n accepted: false,\n outgoingSocket: false,\n outgoingWebRTC: false,\n parked: false,\n outgoing: false,\n startTime: '',\n muted: false,\n paused: false,\n keypadValue: '',\n conversationId: '',\n transferring: false,\n transferringName: '',\n transferringNumber: '',\n transferringStartTime: '',\n transferSwitching: false,\n transferCalls: new Array(),\n ownerExtension: '',\n isRecording: false,\n}\n\nexport const currentCall = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updateCurrentCall: (state, payload: CurrentCallTypes) => {\n return {\n ...state,\n ...payload,\n transferCalls: state.transferCalls,\n }\n },\n updateKeypadValue: (state, payload: string) => {\n return {\n ...state,\n keypadValue: payload,\n }\n },\n updateTransferring: (state, payload: boolean) => {\n return {\n ...state,\n transferring: payload,\n }\n },\n updateTransferSwitching: (state, payload: boolean) => {\n return {\n ...state,\n transferSwitching: payload,\n }\n },\n addTransferCalls: (state, payload: TransferCallsTypes) => {\n if (state.transferCalls.find((item) => item.number === payload.number)) {\n return state\n } else {\n return {\n ...state,\n transferCalls: [...state.transferCalls, payload],\n }\n }\n },\n deleteTransferCalls: (state) => {\n return {\n ...state,\n transferCalls: state.transferCalls.filter((item) => item.type !== 'transferred'),\n }\n },\n setParked: (state, payload: boolean) => {\n state.parked = payload\n return state\n },\n updateRecordingStatus: (state, payload: boolean) => {\n state.isRecording = payload\n return state\n },\n updateStartTime: (state, payload: string) => {\n state.startTime = payload\n return state\n },\n updateIncoming: (state, payload: boolean) => {\n state.incoming = payload\n return state\n },\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n checkIncomingUpdatePlay: (payload: CurrentCallTypes, rootState) => {\n // Check call type and incoming confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.incomingWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.incomingSocket) ||\n (rootState?.currentUser?.default_device?.type === 'nethlink' && payload?.incomingWebRTC)\n ) {\n payload.incoming = true\n\n // Update local player and play the audio\n dispatch.player.updateStartAudioPlayer({ src: incomingRingtone, loop: true })\n }\n // Update the current call values and set incoming\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n checkOutgoingUpdate: (payload: CurrentCallTypes, rootState) => {\n // Check call type and outgoing confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.outgoingWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.outgoingSocket) ||\n (rootState.currentUser.default_device?.type === 'nethlink' && payload.outgoingWebRTC)\n ) {\n payload.outgoing = true\n // Dispatch an event for outgoing call\n dispatchOutgoingCallStarted(payload.displayName, payload.number)\n }\n // Update the current call values and set outgoing\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n checkAcceptedUpdate: (payload: CurrentCallTypes, rootState) => {\n // Check call type and accepted confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.acceptedWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.acceptedSocket) ||\n (rootState.currentUser.default_device?.type === 'nethlink' && payload.acceptedWebRTC)\n ) {\n payload.accepted = true\n eventDispatch('phone-island-call-answered', {})\n }\n // Update the current call values\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n }),\n})\n\nexport type TransferCallsTypes = {\n type: 'transferred' | 'destination'\n displayName: string\n number: string\n startTime: string\n}\n\nexport interface CurrentCallTypes {\n displayName?: string\n username?: string\n number?: string\n incomingSocket?: boolean\n incomingWebRTC?: boolean\n parked?: boolean\n incoming?: boolean\n acceptedSocket?: boolean\n acceptedWebRTC?: boolean\n accepted?: boolean\n outgoingSocket?: boolean\n outgoingWebRTC?: boolean\n outgoing?: boolean\n startTime?: string\n muted?: boolean\n paused?: boolean\n conversationId?: string\n transferring?: boolean\n transferringName?: string\n transferringNumber?: string\n transferringStartTime?: string\n transferSwitching?: boolean\n transferCalls?: TransferCallsTypes[]\n ownerExtension?: string\n isRecording?: boolean\n}\n"],"names":["defaultState","displayName","username","number","incomingSocket","incomingWebRTC","incoming","acceptedSocket","acceptedWebRTC","accepted","outgoingSocket","outgoingWebRTC","parked","outgoing","startTime","muted","paused","keypadValue","conversationId","transferring","transferringName","transferringNumber","transferringStartTime","transferSwitching","transferCalls","Array","ownerExtension","isRecording","currentCall","createModel","state","reducers","updateCurrentCall","payload","__assign","updateKeypadValue","updateTransferring","updateTransferSwitching","addTransferCalls","find","item","__spreadArray","deleteTransferCalls","filter","type","setParked","updateRecordingStatus","updateStartTime","updateIncoming","reset","effects","dispatch","checkIncomingUpdatePlay","rootState","_a","currentUser","default_device","_b","_d","_c","player","updateStartAudioPlayer","src","incomingRingtone","loop","checkOutgoingUpdate","dispatchOutgoingCallStarted","checkAcceptedUpdate","eventDispatch"],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ export declare function parkConversation(body: {
|
|
|
23
23
|
convid: string;
|
|
24
24
|
endpointId: string;
|
|
25
25
|
}): Promise<boolean>;
|
|
26
|
-
export declare function answerPhysical(): Promise<
|
|
26
|
+
export declare function answerPhysical(): Promise<true | undefined>;
|
|
27
27
|
export declare function hangupPhysical(): Promise<boolean>;
|
|
28
28
|
export declare function hangupPhysicalRecordingCall(): Promise<boolean>;
|
|
29
29
|
export declare function mutePhysical(toggleMute: boolean): Promise<boolean>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../store/index.js");exports.answerPhysical=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../store/index.js");exports.answerPhysical=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,n,s,a,o,i,c;return e.__generator(this,(function(u){switch(u.label){case 0:if(r=t.store.getState().currentUser.default_device,void 0===((null==r?void 0:r.id)||(null==r?void 0:r.exten)))return[3,4];n={endpointId:(null==r?void 0:r.exten)||(null==r?void 0:r.id),endpointType:"extension"},u.label=1;case 1:return u.trys.push([1,3,,4]),s=t.store.getState().fetchDefaults,a=s.baseURL,o=s.headers,[4,fetch("".concat(a,"/astproxy/answer"),{method:"POST",headers:e.__assign({},o),body:JSON.stringify(n)})];case 2:if(!(i=u.sent()).ok)throw new Error(i.statusText);return[2,!0];case 3:throw c=u.sent(),new Error(c);case 4:return[2]}}))}))},exports.attendedTransfer=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),n=t.store.getState().fetchDefaults,s=n.baseURL,a=n.headers,[4,fetch("".concat(s,"/astproxy/atxfer"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw i=c.sent(),new Error(i);case 3:return[2]}}))}))},exports.callPhysical=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i,c,u;return e.__generator(this,(function(h){switch(h.label){case 0:n=t.store.getState().currentCall.ownerExtension,s={endpointId:n,endpointTpe:"extension",number:r},h.label=1;case 1:return h.trys.push([1,3,,4]),a=t.store.getState().fetchDefaults,o=a.baseURL,i=a.headers,[4,fetch("".concat(o,"/astproxy/call"),{method:"POST",headers:e.__assign({},i),body:JSON.stringify(s)})];case 2:if(!(c=h.sent()).ok)throw new Error(c.statusText);return[2,!0];case 3:throw u=h.sent(),new Error(u);case 4:return[2]}}))}))},exports.getAllExtensions=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,n,s,a,o;return e.__generator(this,(function(i){switch(i.label){case 0:return i.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,n=r.baseURL,s=r.headers,[4,fetch("".concat(n,"/astproxy/extensions"),{headers:e.__assign({},s)})];case 1:if(!(a=i.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,i.sent()];case 3:throw o=i.sent(),new Error(o);case 4:return[2]}}))}))},exports.hangupConversation=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),n=t.store.getState().fetchDefaults,s=n.baseURL,a=n.headers,[4,fetch("".concat(s,"/astproxy/hangup"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw i=c.sent(),new Error(i);case 3:return[2]}}))}))},exports.hangupPhysical=function(){var r;return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i,c,u,h,d,l,f,w;return e.__generator(this,(function(_){switch(_.label){case 0:n=t.store.getState().currentCall,s=n.ownerExtension,a=n.conversationId,o=t.store.getState().currentUser,c="/astproxy/",u="",""!==(null==(i={convid:a,endpointId:s,endpointType:"extension"})?void 0:i.convid)&&void 0!==(null==i?void 0:i.convid)?u="hangup":(u="cancel",i.endpointId=null===(r=null==o?void 0:o.default_device)||void 0===r?void 0:r.id),_.label=1;case 1:return _.trys.push([1,3,,4]),h=t.store.getState().fetchDefaults,d=h.baseURL,l=h.headers,[4,fetch("".concat(d)+"".concat(c)+"".concat(u),{method:"POST",headers:e.__assign({},l),body:JSON.stringify(i)})];case 2:if(!(f=_.sent()).ok)throw new Error(f.statusText);return[2,!0];case 3:throw w=_.sent(),new Error(w);case 4:return[2]}}))}))},exports.hangupPhysicalRecordingCall=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,n,s,a,o,i,c,u,h;return e.__generator(this,(function(d){switch(d.label){case 0:r=t.store.getState().physicalRecorder,n=r.ownerExtension,s=r.conversationId,a={convid:s,endpointId:n,endpointType:"extension"},d.label=1;case 1:return d.trys.push([1,3,,4]),o=t.store.getState().fetchDefaults,i=o.baseURL,c=o.headers,[4,fetch("".concat(i,"/astproxy/hangup"),{method:"POST",headers:e.__assign({},c),body:JSON.stringify(a)})];case 2:if(!(u=d.sent()).ok)throw new Error(u.statusText);return[2,!0];case 3:throw h=d.sent(),new Error(h);case 4:return[2]}}))}))},exports.mutePhysical=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i,c,u,h,d;return e.__generator(this,(function(l){switch(l.label){case 0:n=t.store.getState().currentCall,s=n.ownerExtension,a=n.conversationId,o={convid:a,endpointId:s},l.label=1;case 1:return l.trys.push([1,3,,4]),i=t.store.getState().fetchDefaults,c=i.baseURL,u=i.headers,[4,fetch("".concat(c,"/astproxy/toggle_mute"),{method:"POST",headers:e.__assign({},u),body:JSON.stringify(o)})];case 2:if(!(h=l.sent()).ok)throw new Error(h.statusText);return t.store.dispatch.currentCall.updateCurrentCall({muted:r}),[2,!0];case 3:throw d=l.sent(),new Error(d);case 4:return[2]}}))}))},exports.parkConversation=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),n=t.store.getState().fetchDefaults,s=n.baseURL,a=n.headers,[4,fetch("".concat(s,"/astproxy/park"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw i=c.sent(),new Error(i);case 3:return[2]}}))}))},exports.pausePhysical=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i,c,u,h;return e.__generator(this,(function(d){switch(d.label){case 0:n=t.store.getState().currentCall,s=n.ownerExtension,n.conversationId,a={endpointId:s},d.label=1;case 1:return d.trys.push([1,3,,4]),o=t.store.getState().fetchDefaults,i=o.baseURL,c=o.headers,[4,fetch("".concat(i,"/astproxy/toggle_hold"),{method:"POST",headers:e.__assign({},c),body:JSON.stringify(a)})];case 2:if(!(u=d.sent()).ok)throw new Error(u.statusText);return t.store.dispatch.currentCall.updateCurrentCall({paused:r}),[2,!0];case 3:throw h=d.sent(),new Error(h);case 4:return[2]}}))}))},exports.sendPhysicalDTMF=function(r){return e.__awaiter(this,void 0,void 0,(function(){var n,s,a,o,i,c,u,h,d;return e.__generator(this,(function(l){switch(l.label){case 0:n=t.store.getState().currentCall,s=n.ownerExtension,a=n.conversationId,o={convid:a,endpointId:s,tone:r.toString()},l.label=1;case 1:return l.trys.push([1,3,,4]),i=t.store.getState().fetchDefaults,c=i.baseURL,u=i.headers,[4,fetch("".concat(c,"/astproxy/dtmf"),{method:"POST",headers:e.__assign({},u),body:JSON.stringify(o)})];case 2:if(!(h=l.sent()).ok)throw new Error(h.statusText);return[2,!0];case 3:throw d=l.sent(),new Error(d);case 4:return[2]}}))}))},exports.toggleRecord=function(r,n){return e.__awaiter(this,void 0,void 0,(function(){var s,a,o,i;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,a=s.baseURL,o=s.headers,[4,fetch("".concat(a,"/astproxy/").concat(r),{method:"POST",headers:e.__assign({},o),body:JSON.stringify(n)})];case 1:if(!(i=c.sent()).ok)throw new Error(i.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))};
|
|
2
2
|
//# sourceMappingURL=astproxy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"astproxy.js","sources":["../../src/services/astproxy.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { store } from '../store'\nimport { ExtensionsTypes, TransferTypes } from '../types'\nimport { useSelector } from 'react-redux'\n\n/**\n * Get all extensions\n */\nexport async function getAllExtensions(): Promise<ExtensionsTypes> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/extensions`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Start blind transfer\n */\nexport async function blindTransfer(body: TransferTypes) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/blindtransfer`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Start attended transfer\n */\nexport async function attendedTransfer(body: TransferTypes) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/atxfer`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Hangup a conversation\n */\nexport async function hangupConversation(body: { convid: string; endpointId: string }) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/hangup`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function parkConversation(body: {\n applicantId: string // Current user main extension\n convid: string\n endpointId: string // Current user main extension\n}) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/park`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function answerPhysical() {\n // get data\n const { default_device } = store.getState().currentUser\n\n // compose body\n let body: any = {\n endpointId: default_device?.id,\n endpointType: 'extension',\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/answer`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function hangupPhysical() {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n const currentUserInformation = store.getState().currentUser\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n endpointType: 'extension',\n }\n let astproxyUrl = '/astproxy/'\n let actionUrl = ''\n if (body?.convid !== '' && body?.convid !== undefined) {\n actionUrl = 'hangup'\n } else {\n actionUrl = 'cancel'\n // set user default device as endpointId on cancel action\n body.endpointId = currentUserInformation?.default_device?.id\n }\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n // if default device is physical check if conversation is empty or not\n // if conversation is empty then cancel the call else hangup the call\n const response = await fetch(`${baseURL}` + `${astproxyUrl}` + `${actionUrl}`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function hangupPhysicalRecordingCall() {\n // get data\n const { ownerExtension, conversationId } = store.getState().physicalRecorder\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n endpointType: 'extension',\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/hangup`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function mutePhysical(toggleMute: boolean) {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/toggle_mute`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n store.dispatch.currentCall.updateCurrentCall({\n muted: toggleMute,\n })\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function pausePhysical(togglePause: boolean) {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n\n // compose body\n let body: any = {\n endpointId: ownerExtension,\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/toggle_hold`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n store.dispatch.currentCall.updateCurrentCall({\n paused: togglePause,\n })\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function sendPhysicalDTMF(key: string) {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n tone: key.toString(),\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/dtmf`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function callPhysical(to: string) {\n // get data\n const { ownerExtension } = store.getState().currentCall\n\n // compose body\n let body: any = {\n endpointId: ownerExtension,\n endpointTpe: 'extension',\n number: to,\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/call`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function toggleRecord(recordingType: any, obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/${recordingType}`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n"],"names":["default_device","store","getState","currentUser","body","endpointId","id","endpointType","_a","fetchDefaults","baseURL","headers","fetch","concat","method","__assign","JSON","stringify","response","_b","sent","ok","Error","statusText","error_6","error_3","to","ownerExtension","currentCall","endpointTpe","number","error_12","json","error_1","error_4","conversationId","currentUserInformation","astproxyUrl","actionUrl","convid","undefined","_c","_d","error_7","physicalRecorder","error_8","toggleMute","dispatch","updateCurrentCall","muted","error_9","error_5","togglePause","paused","error_10","key","tone","toString","error_11","recordingType","obj"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"astproxy.js","sources":["../../src/services/astproxy.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { store } from '../store'\nimport { ExtensionsTypes, TransferTypes } from '../types'\nimport { useSelector } from 'react-redux'\n\n/**\n * Get all extensions\n */\nexport async function getAllExtensions(): Promise<ExtensionsTypes> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/extensions`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Start blind transfer\n */\nexport async function blindTransfer(body: TransferTypes) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/blindtransfer`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Start attended transfer\n */\nexport async function attendedTransfer(body: TransferTypes) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/atxfer`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Hangup a conversation\n */\nexport async function hangupConversation(body: { convid: string; endpointId: string }) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/hangup`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function parkConversation(body: {\n applicantId: string // Current user main extension\n convid: string\n endpointId: string // Current user main extension\n}) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/park`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function answerPhysical() {\n // get data\n const { default_device } = store.getState().currentUser\n\n let default_device_details = default_device?.id || default_device?.exten\n // compose body\n if (default_device_details !== undefined) {\n let body: any = {\n endpointId: default_device?.exten || default_device?.id,\n endpointType: 'extension',\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/answer`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n }\n}\n\nexport async function hangupPhysical() {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n const currentUserInformation = store.getState().currentUser\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n endpointType: 'extension',\n }\n let astproxyUrl = '/astproxy/'\n let actionUrl = ''\n if (body?.convid !== '' && body?.convid !== undefined) {\n actionUrl = 'hangup'\n } else {\n actionUrl = 'cancel'\n // set user default device as endpointId on cancel action\n body.endpointId = currentUserInformation?.default_device?.id\n }\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n // if default device is physical check if conversation is empty or not\n // if conversation is empty then cancel the call else hangup the call\n const response = await fetch(`${baseURL}` + `${astproxyUrl}` + `${actionUrl}`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function hangupPhysicalRecordingCall() {\n // get data\n const { ownerExtension, conversationId } = store.getState().physicalRecorder\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n endpointType: 'extension',\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/hangup`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function mutePhysical(toggleMute: boolean) {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/toggle_mute`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n store.dispatch.currentCall.updateCurrentCall({\n muted: toggleMute,\n })\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function pausePhysical(togglePause: boolean) {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n\n // compose body\n let body: any = {\n endpointId: ownerExtension,\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/toggle_hold`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n store.dispatch.currentCall.updateCurrentCall({\n paused: togglePause,\n })\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function sendPhysicalDTMF(key: string) {\n // get data\n const { ownerExtension, conversationId } = store.getState().currentCall\n\n // compose body\n let body: any = {\n convid: conversationId,\n endpointId: ownerExtension,\n tone: key.toString(),\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/dtmf`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function callPhysical(to: string) {\n // get data\n const { ownerExtension } = store.getState().currentCall\n\n // compose body\n let body: any = {\n endpointId: ownerExtension,\n endpointTpe: 'extension',\n number: to,\n }\n\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/call`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function toggleRecord(recordingType: any, obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/${recordingType}`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n"],"names":["default_device","store","getState","currentUser","undefined","id","exten","body","endpointId","endpointType","_a","fetchDefaults","baseURL","headers","fetch","concat","method","__assign","JSON","stringify","response","_b","sent","ok","Error","statusText","error_6","error_3","to","ownerExtension","currentCall","endpointTpe","number","error_12","json","error_1","error_4","conversationId","currentUserInformation","astproxyUrl","actionUrl","convid","_c","_d","error_7","physicalRecorder","error_8","toggleMute","dispatch","updateCurrentCall","muted","error_9","error_5","togglePause","paused","error_10","key","tone","toString","error_11","recordingType","obj"],"mappings":"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"}
|
package/dist/types/user.d.ts
CHANGED