@nethesis/phone-island 1.0.8-dev.6 → 1.0.8-dev.8
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/README.md +0 -79
- package/dist/App.js +1 -1
- package/dist/App.js.map +1 -1
- package/dist/components/CallView/index.js +1 -1
- package/dist/components/CallView/index.js.map +1 -1
- package/dist/components/Island.js +1 -1
- package/dist/components/Island.js.map +1 -1
- package/dist/components/SettingsView/index.js +1 -1
- package/dist/components/SettingsView/index.js.map +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/TranscriptionView/TranscriptionView.js.map +1 -1
- package/dist/components/VideoView/index.js +1 -1
- package/dist/components/VideoView/index.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/events/CallEvents.js +1 -1
- package/dist/events/CallEvents.js.map +1 -1
- package/dist/events/SocketEvents.js +1 -1
- package/dist/events/SocketEvents.js.map +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/webrtc/messages.js +1 -1
- package/dist/lib/webrtc/messages.js.map +1 -1
- package/dist/models/currentCall.js +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/node_modules/@fortawesome/react-fontawesome/index.es.js +1 -1
- package/dist/node_modules/@fortawesome/react-fontawesome/index.es.js.map +1 -1
- package/dist/node_modules/@headlessui/react/dist/components/portal/portal.js +1 -1
- package/dist/node_modules/@headlessui/react/dist/components/portal/portal.js.map +1 -1
- package/dist/node_modules/@headlessui/react/dist/utils/render.js +1 -1
- package/dist/node_modules/@headlessui/react/dist/utils/render.js.map +1 -1
- package/dist/node_modules/immer/dist/immer.esm.mjs.js +1 -1
- package/dist/node_modules/immer/dist/immer.esm.mjs.js.map +1 -1
- package/dist/node_modules/socket.io-parser/build/esm/index.js +1 -1
- package/dist/node_modules/socket.io-parser/build/esm/index.js.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/services/user.js +1 -1
- package/dist/services/user.js.map +1 -1
- package/dist/utils/genericFunctions/summaryEvents.js +2 -0
- package/dist/utils/genericFunctions/summaryEvents.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SocketEvents.js","sources":["../../src/events/SocketEvents.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { eventDispatch } from '../utils'\nimport type {\n MainPresenceTypes,\n MainPresenceEventTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueuesEventType,\n QueueUpdateMemberTypes,\n QueuesMemberEventType,\n CurrentUserQueueCallEventTypes,\n ParkingUpdateTypes,\n ParkingUpdateEventTypes,\n} from '../types'\n\
|
|
1
|
+
{"version":3,"file":"SocketEvents.js","sources":["../../src/events/SocketEvents.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { eventDispatch } from '../utils'\nimport type {\n MainPresenceTypes,\n MainPresenceEventTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueuesEventType,\n QueueUpdateMemberTypes,\n QueuesMemberEventType,\n CurrentUserQueueCallEventTypes,\n ParkingUpdateTypes,\n ParkingUpdateEventTypes,\n} from '../types'\n\nconst PARKING_UPDATE_DISPATCH_DELAY_MS = 200\nlet parkingUpdateBuffer: ParkingUpdateEventTypes = {}\nlet parkingUpdateDispatchTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction flushParkingUpdates() {\n if (Object.keys(parkingUpdateBuffer).length === 0) {\n parkingUpdateDispatchTimer = null\n return\n }\n\n eventDispatch('phone-island-parking-update', parkingUpdateBuffer)\n parkingUpdateBuffer = {}\n parkingUpdateDispatchTimer = null\n}\n\n/**\n * The dispatch function for the userMainPresenceUpdate event\n *\n * @param event The userMainPresenceUpdate event from socket\n */\nexport function dispatchMainPresence(event: MainPresenceTypes) {\n const data: MainPresenceEventTypes = {\n [event.mainPresence.username]: {\n mainPresence: event.mainPresence.status,\n },\n }\n eventDispatch('phone-island-main-presence', data)\n}\n\n/**\n * The dispatch function for the extenUpdate event\n *\n * @param event The extenUpdate event from socket\n */\nexport function dispatchExtensions(event: ExtensionTypes) {\n const data: any = {\n [event.username]: {\n conversations: event?.conversations,\n status: event?.status,\n sipuseragent: event?.sipuseragent,\n username: event?.username,\n port: event?.port,\n dnd: event?.dnd,\n number: event?.exten,\n ip: event?.ip,\n exten: event?.exten,\n name: event?.name,\n },\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-extensions-update', data)\n}\n\n/**\n * The dispatch function for the extenUpdate event\n *\n * @param event The extenUpdate event from socket\n * @param extensionType The type of the extension (webrtc, mobile, nethlink, physical)\n */\nexport function dispatchConversations(event: ExtensionTypes, extensionType?: string) {\n const data: any = {\n [event.username]: {\n conversations: event?.conversations,\n status: event?.status,\n sipuseragent: event?.sipuseragent,\n username: event?.username,\n port: event?.port,\n dnd: event?.dnd,\n number: event?.exten,\n ip: event?.ip,\n exten: event?.exten,\n name: event?.name,\n extensionType: extensionType,\n },\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-conversations', data)\n}\n\n/**\n * The dispatch function for the queueUpdate event\n *\n * @param event The queueUpdate event from socket\n */\nexport function dispatchQueueUpdate(event: QueuesUpdateTypes) {\n const data: QueuesEventType = {\n [event.queue]: event,\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-queue-update', data)\n}\n\n/**\n * The dispatch function for the queueMemberUpdate event\n *\n * @param event The queueMemberUpdate event from socket\n */\nexport function dispatchQueueMemberUpdate(event: QueueUpdateMemberTypes) {\n const data: QueuesMemberEventType = {\n [event.member]: event,\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-queue-member-update', data)\n}\n\n/**\n * The dispatch function for the current user queue call waiting event\n *\n * @param event The current user queue call data\n */\nexport function dispatchCurrentUserQueueCallWaiting(event: CurrentUserQueueCallEventTypes) {\n eventDispatch('phone-island-current-user-queue-call-waiting', event)\n}\n\n/**\n * The dispatch function for the current user queue call connected event\n *\n * @param event The current user queue call data\n */\nexport function dispatchCurrentUserQueueCallConnected(event: CurrentUserQueueCallEventTypes) {\n eventDispatch('phone-island-current-user-queue-call-connected', event)\n}\n\n/**\n * The dispatch function for the takeOver event\n *\n * @param event The takeOver event from socket\n */\nexport function dispatchAlreadyLogin() {\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-user-already-login', {})\n}\n\n/**\n * The dispatch function for server reload\n *\n * @param event The serverReload event from socket\n */\nexport function dispatchServerReload() {\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-server-reloaded', {})\n}\n\n/**\n * The dispatch function for parking update\n *\n * @param event The parking update event from socket\n */\nexport function dispatchParkingUpdate(event: ParkingUpdateTypes) {\n // Batch rapid socket bursts into one browser event to avoid redundant refreshes\n if (!event?.parking) {\n eventDispatch('phone-island-parking-update', {})\n return\n }\n\n parkingUpdateBuffer[event.parking] = event\n\n if (!parkingUpdateDispatchTimer) {\n parkingUpdateDispatchTimer = setTimeout(\n flushParkingUpdates,\n PARKING_UPDATE_DISPATCH_DELAY_MS,\n )\n }\n}\n\n/**\n * The dispatch function for url physical call\n *\n * @param event The parking update event from socket\n */\nexport function dispatchUrlCall(url: string, urlType: string) {\n // Dispatch the event on window for external handlers\n let urlCallObject = {\n url: url,\n urlType: urlType,\n }\n eventDispatch('phone-island-action-physical', { urlCallObject })\n}\n\n/**\n * The dispatch function to update the default device\n *\n * @param extension The default_device_update event from socket\n */\nexport function dispatchDefaultDeviceUpdate(extension: string) {\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-default-device-updated', { id: extension })\n}\n"],"names":["parkingUpdateBuffer","parkingUpdateDispatchTimer","flushParkingUpdates","Object","keys","length","eventDispatch","event","extensionType","data","_a","username","conversations","status","sipuseragent","port","dnd","number","exten","ip","name","extension","id","mainPresence","parking","setTimeout","member","queue","url","urlType","urlCallObject"],"mappings":"4NAiBA,IACIA,EAA+C,CAAA,EAC/CC,EAAmE,KAEvE,SAASC,IACyC,IAA5CC,OAAOC,KAAKJ,GAAqBK,QAKrCC,gBAAc,8BAA+BN,GAC7CA,EAAsB,CAAA,EACtBC,EAA6B,MAN3BA,EAA6B,IAOjC,yCAqHEK,gBAAc,kCAAmC,CAAA,EACnD,gCAxEgB,SAAsBC,EAAuBC,SACrDC,IAAIC,EAAA,CAAA,GACPH,EAAMI,UAAW,CAChBC,cAAeL,aAAA,EAAAA,EAAOK,cACtBC,OAAQN,aAAA,EAAAA,EAAOM,OACfC,aAAcP,aAAA,EAAAA,EAAOO,aACrBH,SAAUJ,aAAA,EAAAA,EAAOI,SACjBI,KAAMR,aAAA,EAAAA,EAAOQ,KACbC,IAAKT,aAAA,EAAAA,EAAOS,IACZC,OAAQV,aAAA,EAAAA,EAAOW,MACfC,GAAIZ,aAAA,EAAAA,EAAOY,GACXD,MAAOX,aAAA,EAAAA,EAAOW,MACdE,KAAMb,aAAA,EAAAA,EAAOa,KACbZ,cAAeA,MAInBF,gBAAc,6BAA8BG,EAC9C,gDA0CM,SAAgDF,GACpDD,gBAAc,iDAAkDC,EAClE,8CAXM,SAA8CA,GAClDD,gBAAc,+CAAgDC,EAChE,sCAwEM,SAAsCc,GAE1Cf,EAAAA,cAAc,sCAAuC,CAAEgB,GAAID,GAC7D,6BAzJM,SAA6Bd,SAC3BE,IAAIC,EAAA,CAAA,GACPH,EAAMI,UAAW,CAChBC,cAAeL,aAAA,EAAAA,EAAOK,cACtBC,OAAQN,aAAA,EAAAA,EAAOM,OACfC,aAAcP,aAAA,EAAAA,EAAOO,aACrBH,SAAUJ,aAAA,EAAAA,EAAOI,SACjBI,KAAMR,aAAA,EAAAA,EAAOQ,KACbC,IAAKT,aAAA,EAAAA,EAAOS,IACZC,OAAQV,aAAA,EAAAA,EAAOW,MACfC,GAAIZ,aAAA,EAAAA,EAAOY,GACXD,MAAOX,aAAA,EAAAA,EAAOW,MACdE,KAAMb,aAAA,EAAAA,EAAOa,SAIjBd,gBAAc,iCAAkCG,EAClD,+BA/BM,SAA+BF,SAC7BE,IAAIC,EAAA,CAAA,GACPH,EAAMgB,aAAaZ,UAAW,CAC7BY,aAAchB,EAAMgB,aAAaV,WAGrCP,gBAAc,6BAA8BG,EAC9C,gCAyHM,SAAgCF,IAE/BA,eAAAA,EAAOiB,UAKZxB,EAAoBO,EAAMiB,SAAWjB,EAEhCN,IACHA,EAA6BwB,WAC3BvB,EA/JmC,OAuJrCI,gBAAc,8BAA+B,CAAA,EAYjD,oCAlEM,SAAoCC,SAClCE,IAAIC,EAAA,CAAA,GACPH,EAAMmB,QAASnB,KAGlBD,gBAAc,mCAAoCG,EACpD,8BAnBM,SAA8BF,SAC5BE,IAAIC,EAAA,CAAA,GACPH,EAAMoB,OAAQpB,KAGjBD,gBAAc,4BAA6BG,EAC7C,0CAkDEH,gBAAc,+BAAgC,CAAA,EAChD,0BA6BgB,SAAgBsB,EAAaC,GAE3C,IAAIC,EAAgB,CAClBF,IAAKA,EACLC,QAASA,GAEXvB,EAAAA,cAAc,+BAAgC,CAAEwB,cAAaA,GAC/D"}
|
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"),s=require("../../services/astproxy.js"),i=require("../../static/dtmf/index.js");require("react");var o=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../services/user.js"),c=require("../../utils/genericFunctions/isEmpty.js"),u=require("../../utils/streaming/getStreamingSourceId.js");function l(){var e=r.store.getState().currentCall,i=e.outgoing,c=e.accepted,l=e.streamingSourceNumber,d=e.isDebugStreamingSimulation,p=r.store.getState().island.isFromStreaming;if(d)return r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.currentCall.reset(),r.store.dispatch.listen.reset(),r.store.dispatch.island.setIsFromStreaming(!1),r.store.dispatch.island.resetOperatorBusy(),void o.eventDispatch("phone-island-call-ended",{});if(i||c){if(n.isWebRTC()?t.hangup():s.hangupPhysical(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.currentCall.reset(),r.store.dispatch.listen.reset(),p&&l){var v=u.getStreamingSourceId(l);v&&(a.unsubscribe({id:v}).then((function(){return console.debug("Unsubscribed from streaming source: ".concat(v))})).catch((function(e){return console.error("Error unsubscribing from streaming source:",e)})),r.store.dispatch.streaming.clearSourceImages())}r.store.dispatch.island.setIsFromStreaming(!1)}r.store.dispatch.island.resetOperatorBusy(),o.eventDispatch("phone-island-call-ended",{})}function d(){n.isWebRTC()?t.unpauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!1}),r.store.dispatch.player.playRemoteAudio()):s.pausePhysical(!1);o.eventDispatch("phone-island-call-unheld",{})}function p(t){return e.__awaiter(this,void 0,void 0,(function(){var n,i,o;return e.__generator(this,(function(e){switch(e.label){case 0:return n=r.store.getState().currentCall.conversationId,i=r.store.getState().currentUser.default_device,o=(null==i?void 0:i.id)||(null==i?void 0:i.exten),n&&o&&t?[4,s.attendedTransfer({convid:n,to:t,endpointId:o})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))}function v(){var t;return e.__awaiter(this,void 0,void 0,(function(){var n,i,a,u,l,d,p,v,f,h,g,C,m,b;return e.__generator(this,(function(e){switch(e.label){case 0:if(n=null===(t=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===t?void 0:t.currentCall,i=n.accepted,a=n.chSource,u=n.chDest,l=n.incoming,d=n.outgoing,p=n.incomingSocket,v=n.outgoingSocket,f=n.conversationId,h=r.store.getState().currentUser.default_device,g=(null==h?void 0:h.id)||(null==h?void 0:h.exten),C="",i&&(l||p)&&!c.isEmpty(a)?C=null==a?void 0:a.callerNum:i&&(d||v)&&!c.isEmpty(u)&&(C=null==u?void 0:u.callerNum),""===g||""===f||""===C)return[3,4];if(!(m={convid:null==f?void 0:f.toString(),addEndpointId:null==C?void 0:C.toString(),ownerEndpointId:null==g?void 0:g.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.startConf(m)];case 2:return e.sent()?(r.store.dispatch.currentCall.updateCurrentCall({conferencing:!0,paused:!1}),o.eventDispatch("phone-island-call-conferenced",{}),[2,!0]):[2,!1];case 3:return b=e.sent(),console.error(b),[2,!1];case 4:return[2,!1]}}))}))}function f(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,i;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===(t=r.store.getState().conference.conferenceId))return[3,4];if(!(n={confId:null==t?void 0:t.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.endConf(n)];case 2:return e.sent()?(o.eventDispatch("phone-island-owner-conference-finished",{}),[2,!0]):[2,!1];case 3:return i=e.sent(),console.error(i),[2,!1];case 4:return[2,!1]}}))}))}var h=function(){return!!r.store.getState().island.isConferenceList},g=function(e,t){var n=r.store.getState(),s=n.currentUser.username,i=n.conference,a=i.isActive,c=i.isOwnerInside,u=i.conferenceId,d=n.users.extensions;!a&&s&&(t.conference.setConferenceActive(!0),t.conference.setConferenceStartedFrom(s));var p=d?Object.values(d).find((function(t){return t.exten===e})):null,v=(null==p?void 0:p.name)||e;t.conference.addPendingUser({id:"".concat(u,"-").concat(e),name:v,owner:!1,muted:!1,extenId:e,joinTime:Date.now()}),c&&(l(),t.conference.toggleIsOwnerInside(!1)),requestAnimationFrame((function(){setTimeout((function(){o.eventDispatch("phone-island-call-start",{number:e})}),1e3)}))};function C(t,r){return e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return d(),[4,p(t)];case 1:return e.sent()&&(r.currentCall.updateCurrentCall({transferring:!0,paused:!1}),requestAnimationFrame((function(){r.player.playRemoteAudio(),o.eventDispatch("phone-island-call-transfered",{})}))),[2]}}))}))}exports.answerIncomingCall=function(){if(r.store.getState().currentCall.isDebugStreamingSimulation)return r.store.dispatch.currentCall.updateCurrentCall({incoming:!1,accepted:!0,startTime:"".concat(Math.floor(Date.now()/1e3))}),r.store.dispatch.island.setIslandView("streamingAnswer"),r.store.dispatch.island.toggleIsOpen(!0),r.store.dispatch.island.resetOperatorBusyCompletely(),void o.eventDispatch("phone-island-call-answered",{extensionType:"debug"});n.isWebRTC()?t.answerWebRTC():s.answerPhysical(),r.store.dispatch.island.resetOperatorBusyCompletely()},exports.attendedTransfer=p,exports.blindTransferFunction=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var i;return e.__generator(this,(function(e){switch(e.label){case 0:return(i=r.store.getState().currentCall.conversationId)&&n&&t?[4,s.blindTransfer({convid:i,to:t,endpointId:n})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,i){var a="sip:".concat(e,"@").concat(i);r.store.dispatch.island.resetOperatorBusy(),r.store.dispatch.island.setOperatorBusyCalledNumber(e),n.isWebRTC()?t.callSipURI(a):s.callPhysical(e),o.eventDispatch("phone-island-call-started",{})},exports.clickTransferOrConference=function(t,n){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return h()?r.store.getState().conference.isActive?[3,2]:[4,v()]:[3,3];case 1:if(!e.sent())return[2];e.label=2;case 2:return g(t,n),[3,4];case 3:C(t,n),e.label=4;case 4:return[2]}}))}))},exports.endConference=f,exports.forceHangupConversation=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.forceHangup({convid:e,endpointId:t,endpointType:"extension"})}))};for(var n in e)t(n)},exports.handleAttendedTransfer=C,exports.hangupAllExtensions=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.hangupConversation({convid:e,endpointId:t})}))};for(var n in e)t(n)},exports.hangupCurrentCall=l,exports.hangupCurrentPhysicalRecording=function(){s.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(),o.eventDispatch("phone-island-call-ended",{})},exports.isInsideConferenceList=h,exports.joinConference=function(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,i,a;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=r.store.getState().currentUser.default_device,""===(n=(null==t?void 0:t.id)||(null==t?void 0:t.exten)))return[3,4];if(!(i={endpointId:null==n?void 0:n.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.joinMyConf(i)];case 2:return e.sent()?(o.eventDispatch("phone-island-owner-conference-enter",{}),[2,!0]):[2,!1];case 3:return a=e.sent(),console.error(a),[2,!1];case 4:return[2,!1]}}))}))},exports.muteAllUsersConference=function(t,n){var i;return e.__awaiter(this,void 0,void 0,(function(){var o,a,c,u,l,d,p,v;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t)return[2,!1];if(!(o=r.store.getState().conference.usersList)||0===Object.keys(o).length)return[2,!1];e.label=1;case 1:e.trys.push([1,6,,7]),a=Object.values(o),c=n?s.unmuteUserConf:s.muteUserConf,u=0,l=a,e.label=2;case 2:return u<l.length?(d=l[u],p={confId:null==t?void 0:t.toString(),userId:null===(i=d.id)||void 0===i?void 0:i.toString()},[4,c(p)]):[3,5];case 3:e.sent()&&r.store.dispatch.conference.toggleUserMuted({extenId:d.extenId,muted:!n}),e.label=4;case 4:return u++,[3,2];case 5:return[2,!0];case 6:return v=e.sent(),console.error(v),[2,!1];case 7:return[2]}}))}))},exports.muteCurrentCall=function(){n.isWebRTC()?t.muteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!0}):s.mutePhysical(!0),o.eventDispatch("phone-island-call-muted",{})},exports.muteUserConference=function(t,r,n){return e.__awaiter(this,void 0,void 0,(function(){var i,o;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t||""===r)return[2,!1];i={confId:null==t?void 0:t.toString(),userId:null==r?void 0:r.toString()},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n?s.unmuteUserConf:s.muteUserConf)(i)];case 2:return[2,!!e.sent()];case 3:return o=e.sent(),console.error(o),[2,!1];case 4:return[2]}}))}))},exports.parkCurrentCall=function(){var e,t,n,i,a=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,c=null===(i=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===i?void 0:i.conversations,u={};if(a){if(c)for(var l in c)if(c.hasOwnProperty(l)){var d=c[l];Object.keys(d).length>0&&(u={numberParkId:l,idConversation:a})}Object.keys(u).length>0&&(null==u?void 0:u.numberParkId)&&(s.parkConversation({applicantId:null==u?void 0:u.numberParkId,convid:a,endpointId:null==u?void 0:u.numberParkId}),r.store.dispatch.currentCall.setParked(!0),o.eventDispatch("phone-island-call-parked",{}))}},exports.pauseCurrentCall=function(){n.isWebRTC()?t.pauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!0}),r.store.dispatch.player.pauseRemoteAudio()):s.pausePhysical(!0),o.eventDispatch("phone-island-call-held",{})},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),r.store.dispatch.player.updateStartAudioPlayer({src:i.default["dtmf_".concat(e)]})},exports.recordCurrentCall=function(t){var n,i,o,a;return e.__awaiter(this,void 0,void 0,(function(){var c,u,l,d,p,v,f;return e.__generator(this,(function(e){switch(e.label){case 0:return r.store.dispatch.currentCall.updateRecordingStatus(!t),c=null===(i=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===i?void 0:i.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}(c))?[3,1]:[2];case 1:switch(l=null===(o=null==u?void 0:u.id)||void 0===o?void 0:o.match(/\/(\d+)-/),d=l[1],p={convid:null===(a=null==u?void 0:u.id)||void 0===a?void 0:a.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,s.toggleRecord(v,p)];case 3:return e.sent(),[3,5];case 4:return f=e.sent(),console.error(f),[2,[]];case 5:return[2]}}))}))},exports.removeUserConference=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var i,o,a=this;return e.__generator(this,(function(c){switch(c.label){case 0:if(""===t||""===n)return[3,4];if(!(i={confId:null==t?void 0:t.toString(),extenId:null==n?void 0:n.toString()}))return[3,4];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,s.hangupUserConf(i)];case 2:return c.sent()?(setTimeout((function(){return e.__awaiter(a,void 0,void 0,(function(){var t,s;return e.__generator(this,(function(e){switch(e.label){case 0:return t=r.store.getState().conference.usersList,s=Object.values(t||{}).filter((function(e){return!e.owner&&e.extenId!==n})).length,0!==s?[3,2]:[4,f()];case 1:e.sent(),e.label=2;case 2:return[2]}}))}))}),500),[2,!0]):[2,!1];case 3:return o=c.sent(),console.error(o),[2,!1];case 4:return[2,!1]}}))}))},exports.startConference=v,exports.unmuteCurrentCall=function(){n.isWebRTC()?t.unmuteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!1}):s.mutePhysical(!1),o.eventDispatch("phone-island-call-unmuted",{})},exports.unpauseCurrentCall=d,exports.waitingConferenceView=g;
|
|
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"),s=require("../../services/astproxy.js"),o=require("../../static/dtmf/index.js");require("react");var i=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../services/user.js"),c=require("../../utils/genericFunctions/isEmpty.js"),u=require("../../utils/streaming/getStreamingSourceId.js");function l(){var e=r.store.getState().currentCall,o=e.outgoing,c=e.accepted,l=e.streamingSourceNumber,d=r.store.getState().island.isFromStreaming;if(o||c){if(n.isWebRTC()?t.hangup():s.hangupPhysical(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.currentCall.reset(),r.store.dispatch.listen.reset(),d&&l){var p=u.getStreamingSourceId(l);p&&(a.unsubscribe({id:p}).then((function(){return console.debug("Unsubscribed from streaming source: ".concat(p))})).catch((function(e){return console.error("Error unsubscribing from streaming source:",e)})),r.store.dispatch.streaming.clearSourceImages())}r.store.dispatch.island.setIsFromStreaming(!1)}r.store.dispatch.island.resetOperatorBusy(),i.eventDispatch("phone-island-call-ended",{})}function d(){n.isWebRTC()?t.unpauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!1}),r.store.dispatch.player.playRemoteAudio()):s.pausePhysical(!1);i.eventDispatch("phone-island-call-unheld",{})}function p(t){return e.__awaiter(this,void 0,void 0,(function(){var n,o,i;return e.__generator(this,(function(e){switch(e.label){case 0:return n=r.store.getState().currentCall.conversationId,o=r.store.getState().currentUser.default_device,i=(null==o?void 0:o.id)||(null==o?void 0:o.exten),n&&i&&t?[4,s.attendedTransfer({convid:n,to:t,endpointId:i})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))}function v(){var t;return e.__awaiter(this,void 0,void 0,(function(){var n,o,a,u,l,d,p,v,f,h,g,C,m,b;return e.__generator(this,(function(e){switch(e.label){case 0:if(n=null===(t=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===t?void 0:t.currentCall,o=n.accepted,a=n.chSource,u=n.chDest,l=n.incoming,d=n.outgoing,p=n.incomingSocket,v=n.outgoingSocket,f=n.conversationId,h=r.store.getState().currentUser.default_device,g=(null==h?void 0:h.id)||(null==h?void 0:h.exten),C="",o&&(l||p)&&!c.isEmpty(a)?C=null==a?void 0:a.callerNum:o&&(d||v)&&!c.isEmpty(u)&&(C=null==u?void 0:u.callerNum),""===g||""===f||""===C)return[3,4];if(!(m={convid:null==f?void 0:f.toString(),addEndpointId:null==C?void 0:C.toString(),ownerEndpointId:null==g?void 0:g.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.startConf(m)];case 2:return e.sent()?(r.store.dispatch.currentCall.updateCurrentCall({conferencing:!0,paused:!1}),i.eventDispatch("phone-island-call-conferenced",{}),[2,!0]):[2,!1];case 3:return b=e.sent(),console.error(b),[2,!1];case 4:return[2,!1]}}))}))}function f(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,o;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===(t=r.store.getState().conference.conferenceId))return[3,4];if(!(n={confId:null==t?void 0:t.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.endConf(n)];case 2:return e.sent()?(i.eventDispatch("phone-island-owner-conference-finished",{}),[2,!0]):[2,!1];case 3:return o=e.sent(),console.error(o),[2,!1];case 4:return[2,!1]}}))}))}var h=function(){return!!r.store.getState().island.isConferenceList},g=function(e,t){var n=r.store.getState(),s=n.currentUser.username,o=n.conference,a=o.isActive,c=o.isOwnerInside,u=o.conferenceId,d=n.users.extensions;!a&&s&&(t.conference.setConferenceActive(!0),t.conference.setConferenceStartedFrom(s));var p=d?Object.values(d).find((function(t){return t.exten===e})):null,v=(null==p?void 0:p.name)||e;t.conference.addPendingUser({id:"".concat(u,"-").concat(e),name:v,owner:!1,muted:!1,extenId:e,joinTime:Date.now()}),c&&(l(),t.conference.toggleIsOwnerInside(!1)),requestAnimationFrame((function(){setTimeout((function(){i.eventDispatch("phone-island-call-start",{number:e})}),1e3)}))};function C(t,r){return e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return d(),[4,p(t)];case 1:return e.sent()&&(r.currentCall.updateCurrentCall({transferring:!0,paused:!1}),requestAnimationFrame((function(){r.player.playRemoteAudio(),i.eventDispatch("phone-island-call-transfered",{})}))),[2]}}))}))}exports.answerIncomingCall=function(){n.isWebRTC()?t.answerWebRTC():s.answerPhysical(),r.store.dispatch.island.resetOperatorBusyCompletely()},exports.attendedTransfer=p,exports.blindTransferFunction=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var o;return e.__generator(this,(function(e){switch(e.label){case 0:return(o=r.store.getState().currentCall.conversationId)&&n&&t?[4,s.blindTransfer({convid:o,to:t,endpointId:n})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,o){var a="sip:".concat(e,"@").concat(o);r.store.dispatch.island.resetOperatorBusy(),r.store.dispatch.island.setOperatorBusyCalledNumber(e),n.isWebRTC()?t.callSipURI(a):s.callPhysical(e),i.eventDispatch("phone-island-call-started",{})},exports.clickTransferOrConference=function(t,n){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return h()?r.store.getState().conference.isActive?[3,2]:[4,v()]:[3,3];case 1:if(!e.sent())return[2];e.label=2;case 2:return g(t,n),[3,4];case 3:C(t,n),e.label=4;case 4:return[2]}}))}))},exports.endConference=f,exports.forceHangupConversation=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.forceHangup({convid:e,endpointId:t,endpointType:"extension"})}))};for(var n in e)t(n)},exports.handleAttendedTransfer=C,exports.hangupAllExtensions=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.hangupConversation({convid:e,endpointId:t})}))};for(var n in e)t(n)},exports.hangupCurrentCall=l,exports.hangupCurrentPhysicalRecording=function(){s.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.isInsideConferenceList=h,exports.joinConference=function(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,o,a;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=r.store.getState().currentUser.default_device,""===(n=(null==t?void 0:t.id)||(null==t?void 0:t.exten)))return[3,4];if(!(o={endpointId:null==n?void 0:n.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.joinMyConf(o)];case 2:return e.sent()?(i.eventDispatch("phone-island-owner-conference-enter",{}),[2,!0]):[2,!1];case 3:return a=e.sent(),console.error(a),[2,!1];case 4:return[2,!1]}}))}))},exports.muteAllUsersConference=function(t,n){var o;return e.__awaiter(this,void 0,void 0,(function(){var i,a,c,u,l,d,p,v;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t)return[2,!1];if(!(i=r.store.getState().conference.usersList)||0===Object.keys(i).length)return[2,!1];e.label=1;case 1:e.trys.push([1,6,,7]),a=Object.values(i),c=n?s.unmuteUserConf:s.muteUserConf,u=0,l=a,e.label=2;case 2:return u<l.length?(d=l[u],p={confId:null==t?void 0:t.toString(),userId:null===(o=d.id)||void 0===o?void 0:o.toString()},[4,c(p)]):[3,5];case 3:e.sent()&&r.store.dispatch.conference.toggleUserMuted({extenId:d.extenId,muted:!n}),e.label=4;case 4:return u++,[3,2];case 5:return[2,!0];case 6:return v=e.sent(),console.error(v),[2,!1];case 7:return[2]}}))}))},exports.muteCurrentCall=function(){n.isWebRTC()?t.muteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!0}):s.mutePhysical(!0),i.eventDispatch("phone-island-call-muted",{})},exports.muteUserConference=function(t,r,n){return e.__awaiter(this,void 0,void 0,(function(){var o,i;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t||""===r)return[2,!1];o={confId:null==t?void 0:t.toString(),userId:null==r?void 0:r.toString()},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n?s.unmuteUserConf:s.muteUserConf)(o)];case 2:return[2,!!e.sent()];case 3:return i=e.sent(),console.error(i),[2,!1];case 4:return[2]}}))}))},exports.parkCurrentCall=function(){var e,t,n,o,a=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,c=null===(o=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===o?void 0:o.conversations,u={};if(a){if(c)for(var l in c)if(c.hasOwnProperty(l)){var d=c[l];Object.keys(d).length>0&&(u={numberParkId:l,idConversation:a})}Object.keys(u).length>0&&(null==u?void 0:u.numberParkId)&&(s.parkConversation({applicantId:null==u?void 0:u.numberParkId,convid:a,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()):s.pausePhysical(!0),i.eventDispatch("phone-island-call-held",{})},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),r.store.dispatch.player.updateStartAudioPlayer({src:o.default["dtmf_".concat(e)]})},exports.recordCurrentCall=function(t){var n,o,i,a;return e.__awaiter(this,void 0,void 0,(function(){var c,u,l,d,p,v,f;return e.__generator(this,(function(e){switch(e.label){case 0:return r.store.dispatch.currentCall.updateRecordingStatus(!t),c=null===(o=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===o?void 0:o.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}(c))?[3,1]:[2];case 1:switch(l=null===(i=null==u?void 0:u.id)||void 0===i?void 0:i.match(/\/(\d+)-/),d=l[1],p={convid:null===(a=null==u?void 0:u.id)||void 0===a?void 0:a.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,s.toggleRecord(v,p)];case 3:return e.sent(),[3,5];case 4:return f=e.sent(),console.error(f),[2,[]];case 5:return[2]}}))}))},exports.removeUserConference=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var o,i,a=this;return e.__generator(this,(function(c){switch(c.label){case 0:if(""===t||""===n)return[3,4];if(!(o={confId:null==t?void 0:t.toString(),extenId:null==n?void 0:n.toString()}))return[3,4];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,s.hangupUserConf(o)];case 2:return c.sent()?(setTimeout((function(){return e.__awaiter(a,void 0,void 0,(function(){var t,s;return e.__generator(this,(function(e){switch(e.label){case 0:return t=r.store.getState().conference.usersList,s=Object.values(t||{}).filter((function(e){return!e.owner&&e.extenId!==n})).length,0!==s?[3,2]:[4,f()];case 1:e.sent(),e.label=2;case 2:return[2]}}))}))}),500),[2,!0]):[2,!1];case 3:return i=c.sent(),console.error(i),[2,!1];case 4:return[2,!1]}}))}))},exports.startConference=v,exports.unmuteCurrentCall=function(){n.isWebRTC()?t.unmuteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!1}):s.mutePhysical(!1),i.eventDispatch("phone-island-call-unmuted",{})},exports.unpauseCurrentCall=d,exports.waitingConferenceView=g;
|
|
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 { Dispatch, 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 startConf,\n joinMyConf,\n endConf,\n muteUserConf,\n unmuteUserConf,\n hangupUserConf,\n forceHangup,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\nimport { eventDispatch } from '../../utils'\nimport { isEmpty } from '../../utils/genericFunctions/isEmpty'\nimport { getStreamingSourceId } from '../../utils/streaming/getStreamingSourceId'\nimport { unsubscribe } from '../../services/user'\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\n // Reset any previous operator busy state when starting a new call\n store.dispatch.island.resetOperatorBusy()\n // Save the called number for potential operator busy scenarios\n store.dispatch.island.setOperatorBusyCalledNumber(number)\n\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 const { isDebugStreamingSimulation } = store.getState().currentCall\n\n if (isDebugStreamingSimulation) {\n store.dispatch.currentCall.updateCurrentCall({\n incoming: false,\n accepted: true,\n startTime: `${Math.floor(Date.now() / 1000)}`,\n })\n store.dispatch.island.setIslandView('streamingAnswer')\n store.dispatch.island.toggleIsOpen(true)\n store.dispatch.island.resetOperatorBusyCompletely()\n eventDispatch('phone-island-call-answered', { extensionType: 'debug' })\n return\n }\n\n if (isWebRTC()) {\n answerWebRTC()\n } else {\n answerPhysical()\n }\n // Reset operator busy completely when call is answered successfully\n store.dispatch.island.resetOperatorBusyCompletely()\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\nexport function forceHangupConversation() {\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 forceHangup({\n convid: id,\n endpointId: extension,\n endpointType: 'extension',\n })\n })\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted, streamingSourceNumber, isDebugStreamingSimulation } =\n store.getState().currentCall\n const { isFromStreaming } = store.getState().island\n\n if (isDebugStreamingSimulation) {\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n store.dispatch.listen.reset()\n store.dispatch.island.setIsFromStreaming(false)\n store.dispatch.island.resetOperatorBusy()\n eventDispatch('phone-island-call-ended', {})\n return\n }\n\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 // If call was from a streaming source, unsubscribe and clear images\n if (isFromStreaming && streamingSourceNumber) {\n const sourceId = getStreamingSourceId(streamingSourceNumber)\n if (sourceId) {\n // Unsubscribe from streaming updates\n unsubscribe({ id: sourceId })\n .then(() => console.debug(`Unsubscribed from streaming source: ${sourceId}`))\n .catch((error) => console.error('Error unsubscribing from streaming source:', error))\n\n // Clear source images to free up memory\n store.dispatch.streaming.clearSourceImages()\n }\n }\n\n // Reset isFromStreaming flag\n store.dispatch.island.setIsFromStreaming(false)\n }\n // Reset operator busy state when call ends\n store.dispatch.island.resetOperatorBusy()\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 blindTransferFunction(number: string, endpointIdInConversation: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n // Transfer the call through blind transfer\n if (conversationId && endpointIdInConversation && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: endpointIdInConversation,\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\nexport async function startConference() {\n const {\n accepted,\n chSource,\n chDest,\n incoming,\n outgoing,\n incomingSocket,\n outgoingSocket,\n conversationId,\n }: any = store?.getState()?.currentCall\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n let addedUserExtension = ''\n if (accepted && (incoming || incomingSocket) && !isEmpty(chSource)) {\n addedUserExtension = chSource?.callerNum\n } else if (accepted && (outgoing || outgoingSocket) && !isEmpty(chDest)) {\n addedUserExtension = chDest?.callerNum\n }\n\n if (defaultDeviceId !== '' && conversationId !== '' && addedUserExtension !== '') {\n const startConferenceInformations = {\n convid: conversationId?.toString(),\n addEndpointId: addedUserExtension?.toString(),\n ownerEndpointId: defaultDeviceId?.toString(),\n }\n\n if (startConferenceInformations) {\n try {\n const result = await startConf(startConferenceInformations)\n if (result) {\n // Set conferencing and disable pause\n store.dispatch.currentCall.updateCurrentCall({\n conferencing: true,\n paused: false,\n })\n\n eventDispatch('phone-island-call-conferenced', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function joinConference() {\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n\n if (defaultDeviceId !== '') {\n const joinConferenceInformation = {\n endpointId: defaultDeviceId?.toString(),\n }\n\n if (joinConferenceInformation) {\n try {\n const result = await joinMyConf(joinConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-enter', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function endConference() {\n const { conferenceId } = store.getState().conference\n\n if (conferenceId !== '') {\n const endConferenceInformation = {\n confId: conferenceId?.toString(),\n }\n\n if (endConferenceInformation) {\n try {\n const result = await endConf(endConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-finished', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function muteUserConference(confId, userId, isAlreadyMuted) {\n if (confId === '' || userId === '') {\n return false\n }\n\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: userId?.toString(),\n }\n\n try {\n // Check if the user is already muted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n const result = await actionFunction(muteUnmuteUserInformation)\n return !!result\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function muteAllUsersConference(confId, isAlreadyMuted) {\n if (confId === '') {\n return false\n }\n\n // Get the conference users from the store\n const { usersList } = store.getState().conference\n\n if (!usersList || Object.keys(usersList).length === 0) {\n return false\n }\n\n try {\n // Iterate through all users (except the owner) and mute/unmute them\n const nonOwnerUsers = Object.values(usersList)\n\n // Determine which function to use based on isAlreadyMuted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n\n // For each user, call the appropriate function directly\n for (const user of nonOwnerUsers) {\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: user.id?.toString(),\n }\n\n const result = await actionFunction(muteUnmuteUserInformation)\n\n if (result) {\n store.dispatch.conference.toggleUserMuted({\n extenId: user.extenId,\n muted: !isAlreadyMuted,\n })\n }\n }\n\n return true\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function removeUserConference(conferenceId, extensionId) {\n if (conferenceId !== '' && extensionId !== '') {\n const removeUserInformation = {\n confId: conferenceId?.toString(),\n extenId: extensionId?.toString(),\n }\n\n if (removeUserInformation) {\n try {\n const result = await hangupUserConf(removeUserInformation)\n if (result) {\n // Check if this was the last participant (excluding owner)\n setTimeout(async () => {\n const { usersList } = store.getState().conference\n const remainingParticipants = Object.values(usersList || {}).filter(\n (user) => !user.owner && user.extenId !== extensionId,\n ).length\n\n // If no more participants left, end the conference\n if (remainingParticipants === 0) {\n await endConference()\n }\n }, 500)\n\n return true\n }\n\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport const clickTransferOrConference = async (number: string, dispatch: Dispatch) => {\n if (isInsideConferenceList()) {\n const { isActive } = store.getState().conference\n\n // Put current call user inside conference mode (only for first user to add not for the second one)\n // If conference is not active, start it first, otherwise proceed directly\n if (!isActive) {\n const conferenceStarted = await startConference()\n if (!conferenceStarted) {\n return // Early return if conference failed to start\n }\n }\n\n // Proceed to waiting conference view (common path for both cases)\n waitingConferenceView(number, dispatch)\n } else {\n handleAttendedTransfer(number, dispatch)\n }\n}\n\nexport const isInsideConferenceList = () => {\n const { isConferenceList } = store.getState().island\n if (isConferenceList) {\n return true\n }\n return false\n}\n\nexport const waitingConferenceView = (numberToCall, dispatch: Dispatch) => {\n // Get all required state in one call to minimize store access\n const state = store.getState()\n const { username } = state.currentUser\n const { isActive, isOwnerInside, conferenceId } = state.conference\n const { extensions } = state.users\n\n // Show current waiting user in back view (only on first)\n if (!isActive && username) {\n dispatch.conference.setConferenceActive(true)\n dispatch.conference.setConferenceStartedFrom(username)\n }\n\n // Add pending user to track the participant being added (before socket confirms)\n const extension = extensions\n ? Object.values(extensions).find((ext: any) => ext.exten === numberToCall)\n : null\n const extensionName = extension?.name || numberToCall\n\n dispatch.conference.addPendingUser({\n id: `${conferenceId}-${numberToCall}`,\n name: extensionName,\n owner: false,\n muted: false,\n extenId: numberToCall,\n joinTime: Date.now(),\n })\n\n // If owner has already started the conference, hangup before making a new call\n if (isOwnerInside) {\n hangupCurrentCall()\n dispatch.conference.toggleIsOwnerInside(false)\n }\n\n // Start new call with selected user from conference list\n // Use requestAnimationFrame to ensure state updates are complete before dispatching event\n requestAnimationFrame(() => {\n setTimeout(() => {\n eventDispatch('phone-island-call-start', { number: numberToCall })\n }, 1000)\n })\n}\n\nexport async function handleAttendedTransfer(number: string, dispatch: Dispatch) {\n // Send attended transfer message\n unpauseCurrentCall()\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\n // Use requestAnimationFrame to ensure state update is complete before audio operations\n requestAnimationFrame(() => {\n dispatch.player.playRemoteAudio()\n eventDispatch('phone-island-call-transfered', {})\n })\n }\n}\n"],"names":["hangupCurrentCall","_a","store","getState","currentCall","outgoing","accepted","streamingSourceNumber","isDebugStreamingSimulation","isFromStreaming","island","dispatch","player","stopAudioPlayer","reset","listen","setIsFromStreaming","resetOperatorBusy","eventDispatch","isWebRTC","hangup","hangupPhysical","sourceId_1","getStreamingSourceId","unsubscribe","id","then","console","debug","concat","catch","error","streaming","clearSourceImages","unpauseCurrentCall","unpauseWebRTC","updateCurrentCall","paused","playRemoteAudio","pausePhysical","attendedTransfer","number","conversationId","default_device","currentUser","default_device_details","exten","attendedTransferRequest","convid","to","endpointId","startConference","_b","chSource","chDest","incoming","incomingSocket","outgoingSocket","defaultDeviceId","addedUserExtension","isEmpty","callerNum","startConferenceInformations","toString","addEndpointId","ownerEndpointId","startConf","_c","sent","conferencing","e_2","endConference","conferenceId","conference","endConferenceInformation","confId","endConf","e_4","isInsideConferenceList","isConferenceList","waitingConferenceView","numberToCall","state","username","isActive","isOwnerInside","extensions","users","setConferenceActive","setConferenceStartedFrom","extension","Object","values","find","ext","extensionName","name","addPendingUser","owner","muted","extenId","joinTime","Date","now","toggleIsOwnerInside","requestAnimationFrame","setTimeout","handleAttendedTransfer","transferring","startTime","Math","floor","setIslandView","toggleIsOpen","resetOperatorBusyCompletely","extensionType","answerWebRTC","answerPhysical","endpointIdInConversation","blindTransferRequest","sipHost","sipURI","setOperatorBusyCalledNumber","callSipURI","callPhysical","__awaiter","conversations","keys","forEach","forceHangup","endpointType","hangupConversation","hangupPhysicalRecordingCall","physicalRecorder","setRecording","joinConferenceInformation","joinMyConf","e_3","isAlreadyMuted","usersList","length","nonOwnerUsers","actionFunction","unmuteUserConf","muteUserConf","_i","nonOwnerUsers_1","user","muteUnmuteUserInformation","userId","toggleUserMuted","e_6","muteWebRTC","mutePhysical","e_5","userConversationInformations","_d","parkingInformation","key","hasOwnProperty","conversation","numberParkId","idConversation","parkConversation","applicantId","setParked","pauseWebRTC","pauseRemoteAudio","updateStartAudioPlayer","src","dtmfAudios","recordingValue","updateRecordingStatus","firstExtensionNotEmpty","data","firstEntry","recording","findFirstExtesnionNotEmpty","numberToSendCall","match","listenInformations","recordingValues","toggleRecord","_e","e_1","extensionId","removeUserInformation","hangupUserConf","_this","remainingParticipants","filter","e_7","unmuteWebRTC"],"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 { Dispatch, 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 startConf,\n joinMyConf,\n endConf,\n muteUserConf,\n unmuteUserConf,\n hangupUserConf,\n forceHangup,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\nimport { eventDispatch } from '../../utils'\nimport { isEmpty } from '../../utils/genericFunctions/isEmpty'\nimport { getStreamingSourceId } from '../../utils/streaming/getStreamingSourceId'\nimport { unsubscribe } from '../../services/user'\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\n // Reset any previous operator busy state when starting a new call\n store.dispatch.island.resetOperatorBusy()\n // Save the called number for potential operator busy scenarios\n store.dispatch.island.setOperatorBusyCalledNumber(number)\n\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 // Reset operator busy completely when call is answered successfully\n store.dispatch.island.resetOperatorBusyCompletely()\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\nexport function forceHangupConversation() {\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 forceHangup({\n convid: id,\n endpointId: extension,\n endpointType: 'extension',\n })\n })\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted, streamingSourceNumber } = store.getState().currentCall\n const { isFromStreaming } = store.getState().island\n\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 // If call was from a streaming source, unsubscribe and clear images\n if (isFromStreaming && streamingSourceNumber) {\n const sourceId = getStreamingSourceId(streamingSourceNumber)\n if (sourceId) {\n // Unsubscribe from streaming updates\n unsubscribe({ id: sourceId })\n .then(() => console.debug(`Unsubscribed from streaming source: ${sourceId}`))\n .catch((error) => console.error('Error unsubscribing from streaming source:', error))\n\n // Clear source images to free up memory\n store.dispatch.streaming.clearSourceImages()\n }\n }\n\n // Reset isFromStreaming flag\n store.dispatch.island.setIsFromStreaming(false)\n }\n // Reset operator busy state when call ends\n store.dispatch.island.resetOperatorBusy()\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 blindTransferFunction(number: string, endpointIdInConversation: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n // Transfer the call through blind transfer\n if (conversationId && endpointIdInConversation && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: endpointIdInConversation,\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\nexport async function startConference() {\n const {\n accepted,\n chSource,\n chDest,\n incoming,\n outgoing,\n incomingSocket,\n outgoingSocket,\n conversationId,\n }: any = store?.getState()?.currentCall\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n let addedUserExtension = ''\n if (accepted && (incoming || incomingSocket) && !isEmpty(chSource)) {\n addedUserExtension = chSource?.callerNum\n } else if (accepted && (outgoing || outgoingSocket) && !isEmpty(chDest)) {\n addedUserExtension = chDest?.callerNum\n }\n\n if (defaultDeviceId !== '' && conversationId !== '' && addedUserExtension !== '') {\n const startConferenceInformations = {\n convid: conversationId?.toString(),\n addEndpointId: addedUserExtension?.toString(),\n ownerEndpointId: defaultDeviceId?.toString(),\n }\n\n if (startConferenceInformations) {\n try {\n const result = await startConf(startConferenceInformations)\n if (result) {\n // Set conferencing and disable pause\n store.dispatch.currentCall.updateCurrentCall({\n conferencing: true,\n paused: false,\n })\n\n eventDispatch('phone-island-call-conferenced', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function joinConference() {\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n\n if (defaultDeviceId !== '') {\n const joinConferenceInformation = {\n endpointId: defaultDeviceId?.toString(),\n }\n\n if (joinConferenceInformation) {\n try {\n const result = await joinMyConf(joinConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-enter', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function endConference() {\n const { conferenceId } = store.getState().conference\n\n if (conferenceId !== '') {\n const endConferenceInformation = {\n confId: conferenceId?.toString(),\n }\n\n if (endConferenceInformation) {\n try {\n const result = await endConf(endConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-finished', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function muteUserConference(confId, userId, isAlreadyMuted) {\n if (confId === '' || userId === '') {\n return false\n }\n\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: userId?.toString(),\n }\n\n try {\n // Check if the user is already muted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n const result = await actionFunction(muteUnmuteUserInformation)\n return !!result\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function muteAllUsersConference(confId, isAlreadyMuted) {\n if (confId === '') {\n return false\n }\n\n // Get the conference users from the store\n const { usersList } = store.getState().conference\n\n if (!usersList || Object.keys(usersList).length === 0) {\n return false\n }\n\n try {\n // Iterate through all users (except the owner) and mute/unmute them\n const nonOwnerUsers = Object.values(usersList)\n\n // Determine which function to use based on isAlreadyMuted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n\n // For each user, call the appropriate function directly\n for (const user of nonOwnerUsers) {\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: user.id?.toString(),\n }\n\n const result = await actionFunction(muteUnmuteUserInformation)\n\n if (result) {\n store.dispatch.conference.toggleUserMuted({\n extenId: user.extenId,\n muted: !isAlreadyMuted,\n })\n }\n }\n\n return true\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function removeUserConference(conferenceId, extensionId) {\n if (conferenceId !== '' && extensionId !== '') {\n const removeUserInformation = {\n confId: conferenceId?.toString(),\n extenId: extensionId?.toString(),\n }\n\n if (removeUserInformation) {\n try {\n const result = await hangupUserConf(removeUserInformation)\n if (result) {\n // Check if this was the last participant (excluding owner)\n setTimeout(async () => {\n const { usersList } = store.getState().conference\n const remainingParticipants = Object.values(usersList || {}).filter(\n (user) => !user.owner && user.extenId !== extensionId,\n ).length\n\n // If no more participants left, end the conference\n if (remainingParticipants === 0) {\n await endConference()\n }\n }, 500)\n\n return true\n }\n\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport const clickTransferOrConference = async (number: string, dispatch: Dispatch) => {\n if (isInsideConferenceList()) {\n const { isActive } = store.getState().conference\n\n // Put current call user inside conference mode (only for first user to add not for the second one)\n // If conference is not active, start it first, otherwise proceed directly\n if (!isActive) {\n const conferenceStarted = await startConference()\n if (!conferenceStarted) {\n return // Early return if conference failed to start\n }\n }\n\n // Proceed to waiting conference view (common path for both cases)\n waitingConferenceView(number, dispatch)\n } else {\n handleAttendedTransfer(number, dispatch)\n }\n}\n\nexport const isInsideConferenceList = () => {\n const { isConferenceList } = store.getState().island\n if (isConferenceList) {\n return true\n }\n return false\n}\n\nexport const waitingConferenceView = (numberToCall, dispatch: Dispatch) => {\n // Get all required state in one call to minimize store access\n const state = store.getState()\n const { username } = state.currentUser\n const { isActive, isOwnerInside, conferenceId } = state.conference\n const { extensions } = state.users\n\n // Show current waiting user in back view (only on first)\n if (!isActive && username) {\n dispatch.conference.setConferenceActive(true)\n dispatch.conference.setConferenceStartedFrom(username)\n }\n\n // Add pending user to track the participant being added (before socket confirms)\n const extension = extensions\n ? Object.values(extensions).find((ext: any) => ext.exten === numberToCall)\n : null\n const extensionName = extension?.name || numberToCall\n\n dispatch.conference.addPendingUser({\n id: `${conferenceId}-${numberToCall}`,\n name: extensionName,\n owner: false,\n muted: false,\n extenId: numberToCall,\n joinTime: Date.now(),\n })\n\n // If owner has already started the conference, hangup before making a new call\n if (isOwnerInside) {\n hangupCurrentCall()\n dispatch.conference.toggleIsOwnerInside(false)\n }\n\n // Start new call with selected user from conference list\n // Use requestAnimationFrame to ensure state updates are complete before dispatching event\n requestAnimationFrame(() => {\n setTimeout(() => {\n eventDispatch('phone-island-call-start', { number: numberToCall })\n }, 1000)\n })\n}\n\nexport async function handleAttendedTransfer(number: string, dispatch: Dispatch) {\n // Send attended transfer message\n unpauseCurrentCall()\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\n // Use requestAnimationFrame to ensure state update is complete before audio operations\n requestAnimationFrame(() => {\n dispatch.player.playRemoteAudio()\n eventDispatch('phone-island-call-transfered', {})\n })\n }\n}\n"],"names":["hangupCurrentCall","_a","store","getState","currentCall","outgoing","accepted","streamingSourceNumber","isFromStreaming","island","isWebRTC","hangup","hangupPhysical","dispatch","player","stopAudioPlayer","reset","listen","sourceId_1","getStreamingSourceId","unsubscribe","id","then","console","debug","concat","catch","error","streaming","clearSourceImages","setIsFromStreaming","resetOperatorBusy","eventDispatch","unpauseCurrentCall","unpauseWebRTC","updateCurrentCall","paused","playRemoteAudio","pausePhysical","attendedTransfer","number","conversationId","default_device","currentUser","default_device_details","exten","attendedTransferRequest","convid","to","endpointId","startConference","_b","chSource","chDest","incoming","incomingSocket","outgoingSocket","defaultDeviceId","addedUserExtension","isEmpty","callerNum","startConferenceInformations","toString","addEndpointId","ownerEndpointId","startConf","_c","sent","conferencing","e_2","endConference","conferenceId","conference","endConferenceInformation","confId","endConf","e_4","isInsideConferenceList","isConferenceList","waitingConferenceView","numberToCall","state","username","isActive","isOwnerInside","extensions","users","setConferenceActive","setConferenceStartedFrom","extension","Object","values","find","ext","extensionName","name","addPendingUser","owner","muted","extenId","joinTime","Date","now","toggleIsOwnerInside","requestAnimationFrame","setTimeout","handleAttendedTransfer","transferring","answerWebRTC","answerPhysical","resetOperatorBusyCompletely","endpointIdInConversation","blindTransferRequest","sipHost","sipURI","setOperatorBusyCalledNumber","callSipURI","callPhysical","__awaiter","conversations","keys","forEach","forceHangup","endpointType","hangupConversation","hangupPhysicalRecordingCall","physicalRecorder","setRecording","setIslandView","joinConferenceInformation","joinMyConf","e_3","isAlreadyMuted","usersList","length","nonOwnerUsers","actionFunction","unmuteUserConf","muteUserConf","_i","nonOwnerUsers_1","user","muteUnmuteUserInformation","userId","toggleUserMuted","e_6","muteWebRTC","mutePhysical","e_5","userConversationInformations","_d","parkingInformation","key","hasOwnProperty","conversation","numberParkId","idConversation","parkConversation","applicantId","setParked","pauseWebRTC","pauseRemoteAudio","updateStartAudioPlayer","src","dtmfAudios","recordingValue","updateRecordingStatus","firstExtensionNotEmpty","data","firstEntry","recording","findFirstExtesnionNotEmpty","numberToSendCall","match","listenInformations","recordingValues","toggleRecord","_e","e_1","extensionId","removeUserInformation","hangupUserConf","_this","remainingParticipants","filter","e_7","unmuteWebRTC"],"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("./janus.js"),r=require("../../store/index.js"),s=require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("./janus.js"),r=require("../../store/index.js"),s=require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),o=require("../devices/devices.js");function n(e,s){return new Promise((function(o,n){var a=r.store.getState().webrtc.sipcall;a.createOffer({tracks:s,success:function(r){t.default.debug("Got SDP!"),t.default.debug(r),a.send({message:{request:"call",uri:e},jsep:r}),o(!0)},error:function(e){t.default.error("WebRTC error...",e),t.default.error("WebRTC error call on createOffer: ",e),n(!1)}})}))}exports.answerWebRTC=function(){var e,s=r.store.getState().webrtc,n=s.sipcall,a=s.jsepGlobal;if(console.log("[JSEP] answerWebRTC called",{hasSipcall:!!n,hasJsepGlobal:!!a,sipcallId:null===(e=null==n?void 0:n.getId)||void 0===e?void 0:e.call(n),timestamp:(new Date).toISOString()}),n&&a){var c=o.getCurrentAudioInputDeviceId(),i=[];c?i.push({type:"audio",capture:{deviceId:{exact:c}},recv:!0}):i.push({type:"audio",capture:!0,recv:!0});try{n.createAnswer({jsep:a,tracks:i,success:function(e){n.send({message:{request:"accept"},jsep:e})},error:function(e){t.default.error("WebRTC error:",e),e&&("object"==typeof e&&469===e.code||"string"==typeof e&&e.includes("Unexpected ANSWER"))?(console.warn('Got "Unexpected ANSWER" error, forcing the answer anyway'),n.send({message:{request:"accept"}})):n.send({message:{request:"decline",code:480}})}})}catch(e){console.error("Exception in createAnswer:",e),n.send({message:{request:"accept"}})}}},exports.call=n,exports.callSipURI=function(r){var s=this;o.getSupportedDevices((function(){return e.__awaiter(s,void 0,void 0,(function(){var s,a;return e.__generator(this,(function(e){switch(e.label){case 0:return t.default.log("This is a SIP call"),s=o.getCurrentAudioInputDeviceId(),a=[],s?a.push({type:"audio",capture:{deviceId:{exact:s}},recv:!0}):a.push({type:"audio",capture:!0,recv:!0}),[4,n(r,a)];case 1:return e.sent(),[2]}}))}))}))},exports.detach=function(){var e=r.store.getState().webrtc.sipcall;if(e)return e.detach()},exports.handleRemote=function(e){var t=r.store.getState().webrtc.sipcall;t&&t.handleRemoteJsep({jsep:e,error:function(e){console.error("WebRTC error... "+JSON.stringify(e));t.send({message:{request:"hangup"}}),t.hangup()}})},exports.hangup=function(){var e=r.store.getState().webrtc.sipcall;e&&e.send({message:{request:"hangup"}})},exports.muteWebRTC=function(){var e=r.store.getState().webrtc.sipcall;return e.muteAudio(),e.isAudioMuted()},exports.pauseWebRTC=function(){var e=r.store.getState().webrtc.sipcall;try{return e.send({message:{request:"hold"}}),!0}catch(e){return console.error(e),!1}},exports.register=function(e){var t=e.sipExten,s=e.sipSecret,o=e.sipHost,n=e.sipPort,a=r.store.getState().webrtc,c=a.sipcall,i=a.registered,u=r.store.getState().currentUser.name;i?console.log("[REGISTER] Already registered, skipping registration request",{sipExten:t,timestamp:(new Date).toISOString()}):c&&(console.log("[REGISTER] Sending registration request",{sipExten:t,timestamp:(new Date).toISOString()}),c.send({message:{request:"register",username:"sip:".concat(t,"@").concat(o),display_name:u||"",secret:s,proxy:"sip:".concat(o,":").concat(n),outbound_proxy:"sip:".concat(o,":").concat(n),sips:!1,refresh:!1}}))},exports.sendDTMF=function(e){var t=r.store.getState().webrtc.sipcall;"chrome"===s.default.browserDetails.browser?t.dtmf({dtmf:{tones:e}}):t.send({message:{request:"dtmf_info",digit:"".concat(e)}})},exports.unmuteWebRTC=function(){var e=r.store.getState().webrtc.sipcall;return e.unmuteAudio(),!e.isAudioMuted()},exports.unpauseWebRTC=function(){var e=r.store.getState().webrtc.sipcall;try{return e.send({message:{request:"unhold"}}),!0}catch(e){return console.error(e),!1}},exports.unregister=function(){var e=r.store.getState().webrtc.sipcall;e&&e.send({message:{request:"unregister"}})};
|
|
2
2
|
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sources":["../../../src/lib/webrtc/messages.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport Janus from './janus'\nimport { store } from '../../store'\nimport adapter from 'webrtc-adapter'\nimport { getCurrentAudioInputDeviceId, getSupportedDevices } from '../devices/devices'\nimport { getJSONItem } from '../../utils'\nimport { JanusTrack } from '../../types'\n\nexport function register({\n sipExten,\n sipSecret,\n sipHost,\n sipPort,\n}: {\n sipExten: string\n sipSecret: string\n sipHost: string\n sipPort: string\n}) {\n const { sipcall, registered }: { sipcall: any; registered: boolean } = store.getState().webrtc\n const { name } = store.getState().currentUser\n\n // Prevent multiple registrations if already registered\n if (registered) {\n console.log('[REGISTER] Already registered, skipping registration request', {\n sipExten,\n timestamp: new Date().toISOString()\n })\n return\n }\n\n if (sipcall) {\n console.log('[REGISTER] Sending registration request', {\n sipExten,\n timestamp: new Date().toISOString()\n })\n sipcall.send({\n message: {\n request: 'register',\n username: `sip:${sipExten}@${sipHost}`,\n display_name: name || '',\n secret: sipSecret,\n proxy: `sip:${sipHost}:${sipPort}`,\n outbound_proxy: `sip:${sipHost}:${sipPort}`,\n sips: false,\n refresh: false,\n },\n })\n }\n}\n\nexport function answerWebRTC() {\n const { sipcall, jsepGlobal }: { sipcall: any; jsepGlobal: any } = store.getState().webrtc\n\n console.log('[JSEP] answerWebRTC called', {\n hasSipcall: !!sipcall,\n hasJsepGlobal: !!jsepGlobal,\n sipcallId: sipcall?.getId?.(),\n timestamp: new Date().toISOString()\n })\n\n if (sipcall && jsepGlobal) {\n let currentAudioInputDeviceId = getCurrentAudioInputDeviceId()\n const tracks: any[] = []\n\n if (currentAudioInputDeviceId) {\n tracks.push({\n type: 'audio',\n capture: { deviceId: { exact: currentAudioInputDeviceId } },\n recv: true,\n })\n } else {\n tracks.push({ type: 'audio', capture: true, recv: true })\n }\n\n // For incoming calls, directly create an answer without first calling handleRemoteJsep\n // because Janus has already provided us with an offer\n try {\n sipcall.createAnswer({\n jsep: jsepGlobal,\n tracks: tracks,\n success: (jsep) => {\n sipcall.send({\n message: {\n request: 'accept',\n autoaccept_reinvites: false,\n },\n jsep: jsep,\n })\n },\n error: (error) => {\n // If there's an error during createAnswer, check if it's error 469 (Unexpected ANSWER)\n // @ts-ignore\n Janus.error('WebRTC error:', error)\n\n // Check if the error contains code 469 or the message \"Unexpected ANSWER\"\n if (\n error &&\n ((typeof error === 'object' && error.code === 469) ||\n (typeof error === 'string' && error.includes('Unexpected ANSWER')))\n ) {\n console.warn('Got \"Unexpected ANSWER\" error, forcing the answer anyway')\n // Force sending the accept message even without JSEP\n sipcall.send({\n message: {\n request: 'accept',\n autoaccept_reinvites: false,\n },\n })\n } else {\n // For other types of errors, decline the call\n sipcall.send({\n message: {\n request: 'decline',\n code: 480,\n },\n })\n }\n },\n })\n } catch (error) {\n console.error('Exception in createAnswer:', error)\n\n // Even in case of an exception, try to accept the call\n sipcall.send({\n message: {\n request: 'accept',\n autoaccept_reinvites: false,\n },\n })\n }\n }\n}\n\nexport function decline() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'decline',\n },\n })\n }\n}\n\nexport function hangup() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'hangup',\n },\n })\n }\n}\n\nexport function unregister() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'unregister',\n },\n })\n }\n}\n\nexport function detach() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n return sipcall.detach()\n }\n}\n\nexport function handleRemote(jsep: any) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.handleRemoteJsep({\n jsep: jsep,\n error: function (error) {\n console.error('WebRTC error... ' + JSON.stringify(error))\n\n var hangup = {\n request: 'hangup',\n }\n sipcall.send({\n message: hangup,\n })\n sipcall.hangup()\n },\n })\n }\n}\n\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n\n let currentAudioInputDeviceId = getCurrentAudioInputDeviceId()\n\n const tracks: JanusTrack[] = []\n\n if (currentAudioInputDeviceId) {\n tracks.push({\n type: 'audio',\n capture: { deviceId: { exact: currentAudioInputDeviceId } },\n recv: true,\n })\n } else {\n tracks.push({ type: 'audio', capture: true, recv: true })\n }\n\n await call(sipURI, tracks)\n })\n}\n\nexport function call(sipURI: string, tracks: JanusTrack[]) {\n return new Promise((resolve, reject) => {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n sipcall.createOffer({\n tracks: tracks,\n success: function (jsep: any) {\n // @ts-ignore\n Janus.debug('Got SDP!')\n // @ts-ignore\n Janus.debug(jsep)\n sipcall.send({\n message: {\n request: 'call',\n uri: sipURI,\n autoaccept_reinvites: false,\n },\n jsep: jsep,\n })\n resolve(true)\n },\n error: function (error) {\n // @ts-ignore\n Janus.error('WebRTC error...', error)\n // @ts-ignore\n Janus.error('WebRTC error call on createOffer: ', error)\n reject(false)\n },\n })\n })\n}\n\n/**\n * Mute current call so the counterpart can't listen the current user\n * @returns The muted status\n */\nexport function muteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Uset the janus library functions to mute call\n sipcall.muteAudio()\n return sipcall.isAudioMuted()\n}\n\n/**\n * Unmute current call so the counterpart can listen the current user\n * @returns The muted status\n */\nexport function unmuteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Use the janus library functions to unmute call\n sipcall.unmuteAudio()\n return !sipcall.isAudioMuted()\n}\n\n/**\n * Pause current call so the counterpart listens the pause ringtone\n * @returns The true if no errors occurs\n */\nexport function pauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'hold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Unpause the current call so the counterpart listens the current user\n * @returns The true if no errors occurs\n */\nexport function unpauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'unhold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Send DTMF messages to Janus\n */\nexport function sendDTMF(key: string) {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (adapter.browserDetails.browser === 'chrome') {\n sipcall.dtmf({\n dtmf: {\n tones: key,\n },\n })\n } else {\n sipcall.send({\n message: {\n request: 'dtmf_info',\n digit: `${key}`,\n },\n })\n }\n}\n"],"names":["call","sipURI","tracks","Promise","resolve","reject","sipcall","store","getState","webrtc","createOffer","success","jsep","Janus","debug","send","message","request","uri","autoaccept_reinvites","error","_b","jsepGlobal","console","log","hasSipcall","hasJsepGlobal","sipcallId","getId","_a","timestamp","Date","toISOString","currentAudioInputDeviceId","getCurrentAudioInputDeviceId","push","type","capture","deviceId","exact","recv","createAnswer","code","includes","warn","_this","this","getSupportedDevices","__awaiter","sent","detach","handleRemoteJsep","JSON","stringify","hangup","muteAudio","isAudioMuted","err","sipExten","sipSecret","sipHost","sipPort","registered","name","currentUser","username","concat","display_name","secret","proxy","outbound_proxy","sips","refresh","key","adapter","browserDetails","browser","dtmf","tones","digit","unmuteAudio"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"messages.js","sources":["../../../src/lib/webrtc/messages.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport Janus from './janus'\nimport { store } from '../../store'\nimport adapter from 'webrtc-adapter'\nimport { getCurrentAudioInputDeviceId, getSupportedDevices } from '../devices/devices'\nimport { getJSONItem } from '../../utils'\nimport { JanusTrack } from '../../types'\n\nexport function register({\n sipExten,\n sipSecret,\n sipHost,\n sipPort,\n}: {\n sipExten: string\n sipSecret: string\n sipHost: string\n sipPort: string\n}) {\n const { sipcall, registered }: { sipcall: any; registered: boolean } = store.getState().webrtc\n const { name } = store.getState().currentUser\n\n // Prevent multiple registrations if already registered\n if (registered) {\n console.log('[REGISTER] Already registered, skipping registration request', {\n sipExten,\n timestamp: new Date().toISOString()\n })\n return\n }\n\n if (sipcall) {\n console.log('[REGISTER] Sending registration request', {\n sipExten,\n timestamp: new Date().toISOString()\n })\n sipcall.send({\n message: {\n request: 'register',\n username: `sip:${sipExten}@${sipHost}`,\n display_name: name || '',\n secret: sipSecret,\n proxy: `sip:${sipHost}:${sipPort}`,\n outbound_proxy: `sip:${sipHost}:${sipPort}`,\n sips: false,\n refresh: false,\n },\n })\n }\n}\n\nexport function answerWebRTC() {\n const { sipcall, jsepGlobal }: { sipcall: any; jsepGlobal: any } = store.getState().webrtc\n\n console.log('[JSEP] answerWebRTC called', {\n hasSipcall: !!sipcall,\n hasJsepGlobal: !!jsepGlobal,\n sipcallId: sipcall?.getId?.(),\n timestamp: new Date().toISOString()\n })\n\n if (sipcall && jsepGlobal) {\n let currentAudioInputDeviceId = getCurrentAudioInputDeviceId()\n const tracks: any[] = []\n\n if (currentAudioInputDeviceId) {\n tracks.push({\n type: 'audio',\n capture: { deviceId: { exact: currentAudioInputDeviceId } },\n recv: true,\n })\n } else {\n tracks.push({ type: 'audio', capture: true, recv: true })\n }\n\n // For incoming calls, directly create an answer without first calling handleRemoteJsep\n // because Janus has already provided us with an offer\n try {\n sipcall.createAnswer({\n jsep: jsepGlobal,\n tracks: tracks,\n success: (jsep) => {\n sipcall.send({\n message: {\n request: 'accept',\n },\n jsep: jsep,\n })\n },\n error: (error) => {\n // If there's an error during createAnswer, check if it's error 469 (Unexpected ANSWER)\n // @ts-ignore\n Janus.error('WebRTC error:', error)\n\n // Check if the error contains code 469 or the message \"Unexpected ANSWER\"\n if (\n error &&\n ((typeof error === 'object' && error.code === 469) ||\n (typeof error === 'string' && error.includes('Unexpected ANSWER')))\n ) {\n console.warn('Got \"Unexpected ANSWER\" error, forcing the answer anyway')\n // Force sending the accept message even without JSEP\n sipcall.send({\n message: {\n request: 'accept',\n },\n })\n } else {\n // For other types of errors, decline the call\n sipcall.send({\n message: {\n request: 'decline',\n code: 480,\n },\n })\n }\n },\n })\n } catch (error) {\n console.error('Exception in createAnswer:', error)\n\n // Even in case of an exception, try to accept the call\n sipcall.send({\n message: {\n request: 'accept',\n },\n })\n }\n }\n}\n\nexport function decline() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'decline',\n },\n })\n }\n}\n\nexport function hangup() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'hangup',\n },\n })\n }\n}\n\nexport function unregister() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'unregister',\n },\n })\n }\n}\n\nexport function detach() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n return sipcall.detach()\n }\n}\n\nexport function handleRemote(jsep: any) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.handleRemoteJsep({\n jsep: jsep,\n error: function (error) {\n console.error('WebRTC error... ' + JSON.stringify(error))\n\n var hangup = {\n request: 'hangup',\n }\n sipcall.send({\n message: hangup,\n })\n sipcall.hangup()\n },\n })\n }\n}\n\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n\n let currentAudioInputDeviceId = getCurrentAudioInputDeviceId()\n\n const tracks: JanusTrack[] = []\n\n if (currentAudioInputDeviceId) {\n tracks.push({\n type: 'audio',\n capture: { deviceId: { exact: currentAudioInputDeviceId } },\n recv: true,\n })\n } else {\n tracks.push({ type: 'audio', capture: true, recv: true })\n }\n\n await call(sipURI, tracks)\n })\n}\n\nexport function call(sipURI: string, tracks: JanusTrack[]) {\n return new Promise((resolve, reject) => {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n sipcall.createOffer({\n tracks: tracks,\n success: function (jsep: any) {\n // @ts-ignore\n Janus.debug('Got SDP!')\n // @ts-ignore\n Janus.debug(jsep)\n sipcall.send({\n message: {\n request: 'call',\n uri: sipURI,\n },\n jsep: jsep,\n })\n resolve(true)\n },\n error: function (error) {\n // @ts-ignore\n Janus.error('WebRTC error...', error)\n // @ts-ignore\n Janus.error('WebRTC error call on createOffer: ', error)\n reject(false)\n },\n })\n })\n}\n\n/**\n * Mute current call so the counterpart can't listen the current user\n * @returns The muted status\n */\nexport function muteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Uset the janus library functions to mute call\n sipcall.muteAudio()\n return sipcall.isAudioMuted()\n}\n\n/**\n * Unmute current call so the counterpart can listen the current user\n * @returns The muted status\n */\nexport function unmuteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Use the janus library functions to unmute call\n sipcall.unmuteAudio()\n return !sipcall.isAudioMuted()\n}\n\n/**\n * Pause current call so the counterpart listens the pause ringtone\n * @returns The true if no errors occurs\n */\nexport function pauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'hold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Unpause the current call so the counterpart listens the current user\n * @returns The true if no errors occurs\n */\nexport function unpauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'unhold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Send DTMF messages to Janus\n */\nexport function sendDTMF(key: string) {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (adapter.browserDetails.browser === 'chrome') {\n sipcall.dtmf({\n dtmf: {\n tones: key,\n },\n })\n } else {\n sipcall.send({\n message: {\n request: 'dtmf_info',\n digit: `${key}`,\n },\n })\n }\n}\n"],"names":["call","sipURI","tracks","Promise","resolve","reject","sipcall","store","getState","webrtc","createOffer","success","jsep","Janus","debug","send","message","request","uri","error","_b","jsepGlobal","console","log","hasSipcall","hasJsepGlobal","sipcallId","getId","_a","timestamp","Date","toISOString","currentAudioInputDeviceId","getCurrentAudioInputDeviceId","push","type","capture","deviceId","exact","recv","createAnswer","code","includes","warn","_this","this","getSupportedDevices","__awaiter","sent","detach","handleRemoteJsep","JSON","stringify","hangup","muteAudio","isAudioMuted","err","sipExten","sipSecret","sipHost","sipPort","registered","name","currentUser","username","concat","display_name","secret","proxy","outbound_proxy","sips","refresh","key","adapter","browserDetails","browser","dtmf","tones","digit","unmuteAudio"],"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"),n=require("../node_modules/@rematch/core/dist/core.esm.js"),r=require("../events/CallEvents.js");require("react");var t=require("../utils/genericFunctions/eventDispatch.js");require("../store/index.js"),require("../node_modules/react-redux/es/index.js");var i={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,conferencing:!1,transferringName:"",transferringNumber:"",transferringStartTime:"",transferSwitching:!1,transferCalls:new Array,ownerExtension:"",isRecording:!1,isLocalVideoEnabled:!1,showRemoteVideoPlaceHolder:!0,hasVideoTrackAdded:!1,isStartingVideoCall:!1,streamingSourceNumber:"",
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("../node_modules/@rematch/core/dist/core.esm.js"),r=require("../events/CallEvents.js");require("react");var t=require("../utils/genericFunctions/eventDispatch.js");require("../store/index.js"),require("../node_modules/react-redux/es/index.js");var i={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,conferencing:!1,transferringName:"",transferringNumber:"",transferringStartTime:"",transferSwitching:!1,transferCalls:new Array,ownerExtension:"",isRecording:!1,isLocalVideoEnabled:!1,showRemoteVideoPlaceHolder:!0,hasVideoTrackAdded:!1,isStartingVideoCall:!1,streamingSourceNumber:"",chDest:new Array,chSource:new Array,throughQueue:!1,queueId:"",queueName:"",queueNumber:"",queuePosition:"",queueWaitingTime:0},a=n.createModel()({state:i,reducers:{updateCurrentCall:function(n,r){return Number(r.startTime)&&n.startTime&&delete r.startTime,!1===r.throughQueue&&(r.queueId="",r.queueName="",r.queueNumber="",r.queuePosition="",r.queueWaitingTime=0),e.__assign(e.__assign(e.__assign({},n),r),{transferCalls:n.transferCalls})},updateKeypadValue:function(n,r){return e.__assign(e.__assign({},n),{keypadValue:r})},updateTransferring:function(n,r){return e.__assign(e.__assign({},n),{transferring:r})},updateTransferSwitching:function(n,r){return e.__assign(e.__assign({},n),{transferSwitching:r})},addTransferCalls:function(n,r){return n.transferCalls.find((function(e){return e.number===r.number}))?n:e.__assign(e.__assign({},n),{transferCalls:e.__spreadArray(e.__spreadArray([],n.transferCalls,!0),[r],!1)})},deleteTransferCalls:function(n){return e.__assign(e.__assign({},n),{transferCalls:n.transferCalls.filter((function(e){return"transferred"!==e.type}))})},setParked:function(e,n){return e.parked=n,e},updateRecordingStatus:function(e,n){return e.isRecording=n,e},updateStartTime:function(e,n){return e.startTime=n,e},updateIncoming:function(e,n){return e.incoming=n,e},reset:function(){return i},setLocalVideoEnabled:function(e,n){return e.isLocalVideoEnabled=n,e},setVideoTrackAdded:function(e,n){return e.hasVideoTrackAdded=n,e},updateConferencing:function(n,r){return e.__assign(e.__assign({},n),{conferencing:r})}},effects:function(n){return{checkIncomingUpdatePlay:function(r,t){var i,a,u,s,o,d,l,c;if("webrtc"===(null===(a=null===(i=null==t?void 0:t.currentUser)||void 0===i?void 0:i.default_device)||void 0===a?void 0:a.type)&&(null==r?void 0:r.incomingWebRTC)||"physical"===(null===(s=null===(u=null==t?void 0:t.currentUser)||void 0===u?void 0:u.default_device)||void 0===s?void 0:s.type)&&(null==r?void 0:r.incomingSocket)||"nethlink"===(null===(d=null===(o=null==t?void 0:t.currentUser)||void 0===o?void 0:o.default_device)||void 0===d?void 0:d.type)&&(null==r?void 0:r.incomingWebRTC)){r.incoming=!0;var g=t.ringtones?(null===(l=t.ringtones.availableRingtones.find((function(e){return e.name===t.ringtones.selectedRingtone})))||void 0===l?void 0:l.base64Audio)||(null===(c=t.ringtones.availableRingtones[0])||void 0===c?void 0:c.base64Audio):void 0;g&&n.player.updateStartAudioPlayer({src:g,loop:!0,useRingtoneOutput:!0})}n.currentCall.updateCurrentCall(e.__assign({},r))},checkOutgoingUpdate:function(t,i){var a,u,s;("webrtc"===(null===(a=i.currentUser.default_device)||void 0===a?void 0:a.type)&&t.outgoingWebRTC||"physical"===(null===(u=i.currentUser.default_device)||void 0===u?void 0:u.type)&&t.outgoingSocket||"nethlink"===(null===(s=i.currentUser.default_device)||void 0===s?void 0:s.type)&&t.outgoingWebRTC)&&(t.outgoing=!0,r.dispatchOutgoingCallStarted(t.displayName,t.number)),n.currentCall.updateCurrentCall(e.__assign({},t))},checkAcceptedUpdate:function(r,i){var a,u,s;("webrtc"===(null===(a=i.currentUser.default_device)||void 0===a?void 0:a.type)&&r.acceptedWebRTC||"physical"===(null===(u=i.currentUser.default_device)||void 0===u?void 0:u.type)&&r.acceptedSocket||"nethlink"===(null===(s=i.currentUser.default_device)||void 0===s?void 0:s.type)&&r.acceptedWebRTC)&&(r.accepted=!0,t.eventDispatch("phone-island-call-answered",{})),n.currentCall.updateCurrentCall(e.__assign({},r))}}}});exports.currentCall=a;
|
|
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 { dispatchOutgoingCallStarted } from '../events/index'\nimport { eventDispatch } from '../utils'\nimport { PhonebookContact } from '../types/phonebook'\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 conferencing: false,\n transferringName: '',\n transferringNumber: '',\n transferringStartTime: '',\n transferSwitching: false,\n transferCalls: new Array(),\n ownerExtension: '',\n isRecording: false,\n isLocalVideoEnabled: false,\n showRemoteVideoPlaceHolder: true,\n hasVideoTrackAdded: false,\n isStartingVideoCall: false,\n streamingSourceNumber: '',\n isDebugStreamingSimulation: false,\n chDest: new Array(),\n chSource: new Array(),\n throughQueue: false,\n queueId: '',\n queueName: '',\n queueNumber: '',\n queuePosition: '',\n queueWaitingTime: 0,\n}\n\nexport const currentCall = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updateCurrentCall: (state, payload: CurrentCallTypes) => {\n if (Number(payload.startTime) && state.startTime) {\n // avoid updating startTime if it's already set (e.g. while switching to a video call)\n delete payload.startTime\n }\n\n if (payload.throughQueue === false) {\n payload.queueId = ''\n payload.queueName = ''\n payload.queueNumber = ''\n payload.queuePosition = ''\n payload.queueWaitingTime = 0\n }\n\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 setLocalVideoEnabled: (state, payload: boolean) => {\n state.isLocalVideoEnabled = payload\n return state\n },\n setVideoTrackAdded: (state, payload: boolean) => {\n state.hasVideoTrackAdded = payload\n return state\n },\n updateConferencing: (state, payload: boolean) => {\n return {\n ...state,\n conferencing: payload,\n }\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 // Get selected ringtone from store and play the audio\n const selectedRingtoneAudio = rootState.ringtones\n ? (rootState.ringtones.availableRingtones as any[]).find(\n (r: any) => r.name === rootState.ringtones.selectedRingtone,\n )?.base64Audio || rootState.ringtones.availableRingtones[0]?.base64Audio\n : undefined\n \n if (selectedRingtoneAudio) {\n dispatch.player.updateStartAudioPlayer({ src: selectedRingtoneAudio, loop: true, useRingtoneOutput: true })\n }\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 type chDestTypes = {\n type: 'dest'\n channel: string\n callerNum: string\n startTime: number\n callerName: string\n bridgedNum: string\n bridgedName: string\n inConference: boolean\n channelStatus: string\n bridgedChannel: string\n}\n\nexport type chSourceTypes = {\n type: 'source'\n channel: string\n callerNum: string\n startTime: number\n callerName: string\n bridgedNum: string\n bridgedName: string\n inConference: boolean\n channelStatus: string\n bridgedChannel: 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 conferencing?: boolean\n transferringName?: string\n transferringNumber?: string\n transferringStartTime?: string\n transferSwitching?: boolean\n transferCalls?: TransferCallsTypes[]\n ownerExtension?: string\n isRecording?: boolean\n isLocalVideoEnabled?: boolean\n hasVideoTrackAdded?: boolean\n showRemoteVideoPlaceHolder?: boolean\n isStartingVideoCall?: boolean\n streamingSourceNumber?: string\n isDebugStreamingSimulation?: boolean\n chDest?: any\n chSource?: any\n throughQueue?: boolean\n queueId?: string\n queueName?: string\n queueNumber?: string\n queuePosition?: string\n queueWaitingTime?: number\n}\n"],"names":["defaultState","displayName","username","number","incomingSocket","incomingWebRTC","incoming","acceptedSocket","acceptedWebRTC","accepted","outgoingSocket","outgoingWebRTC","parked","outgoing","startTime","muted","paused","keypadValue","conversationId","transferring","conferencing","transferringName","transferringNumber","transferringStartTime","transferSwitching","transferCalls","Array","ownerExtension","isRecording","isLocalVideoEnabled","showRemoteVideoPlaceHolder","hasVideoTrackAdded","isStartingVideoCall","streamingSourceNumber","isDebugStreamingSimulation","chDest","chSource","throughQueue","queueId","queueName","queueNumber","queuePosition","queueWaitingTime","currentCall","createModel","state","reducers","updateCurrentCall","payload","Number","__assign","updateKeypadValue","updateTransferring","updateTransferSwitching","addTransferCalls","find","item","__spreadArray","deleteTransferCalls","filter","type","setParked","updateRecordingStatus","updateStartTime","updateIncoming","reset","setLocalVideoEnabled","setVideoTrackAdded","updateConferencing","effects","dispatch","checkIncomingUpdatePlay","rootState","_b","_a","currentUser","default_device","_d","_c","_f","_e","selectedRingtoneAudio","ringtones","_g","availableRingtones","r","name","selectedRingtone","base64Audio","_h","undefined","player","updateStartAudioPlayer","src","loop","useRingtoneOutput","checkOutgoingUpdate","dispatchOutgoingCallStarted","checkAcceptedUpdate","eventDispatch"],"mappings":"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"}
|
|
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 { dispatchOutgoingCallStarted } from '../events/index'\nimport { eventDispatch } from '../utils'\nimport { PhonebookContact } from '../types/phonebook'\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 conferencing: false,\n transferringName: '',\n transferringNumber: '',\n transferringStartTime: '',\n transferSwitching: false,\n transferCalls: new Array(),\n ownerExtension: '',\n isRecording: false,\n isLocalVideoEnabled: false,\n showRemoteVideoPlaceHolder: true,\n hasVideoTrackAdded: false,\n isStartingVideoCall: false,\n streamingSourceNumber: '',\n chDest: new Array(),\n chSource: new Array(),\n throughQueue: false,\n queueId: '',\n queueName: '',\n queueNumber: '',\n queuePosition: '',\n queueWaitingTime: 0,\n}\n\nexport const currentCall = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updateCurrentCall: (state, payload: CurrentCallTypes) => {\n if (Number(payload.startTime) && state.startTime) {\n // avoid updating startTime if it's already set (e.g. while switching to a video call)\n delete payload.startTime\n }\n\n if (payload.throughQueue === false) {\n payload.queueId = ''\n payload.queueName = ''\n payload.queueNumber = ''\n payload.queuePosition = ''\n payload.queueWaitingTime = 0\n }\n\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 setLocalVideoEnabled: (state, payload: boolean) => {\n state.isLocalVideoEnabled = payload\n return state\n },\n setVideoTrackAdded: (state, payload: boolean) => {\n state.hasVideoTrackAdded = payload\n return state\n },\n updateConferencing: (state, payload: boolean) => {\n return {\n ...state,\n conferencing: payload,\n }\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 // Get selected ringtone from store and play the audio\n const selectedRingtoneAudio = rootState.ringtones\n ? (rootState.ringtones.availableRingtones as any[]).find(\n (r: any) => r.name === rootState.ringtones.selectedRingtone,\n )?.base64Audio || rootState.ringtones.availableRingtones[0]?.base64Audio\n : undefined\n \n if (selectedRingtoneAudio) {\n dispatch.player.updateStartAudioPlayer({ src: selectedRingtoneAudio, loop: true, useRingtoneOutput: true })\n }\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 type chDestTypes = {\n type: 'dest'\n channel: string\n callerNum: string\n startTime: number\n callerName: string\n bridgedNum: string\n bridgedName: string\n inConference: boolean\n channelStatus: string\n bridgedChannel: string\n}\n\nexport type chSourceTypes = {\n type: 'source'\n channel: string\n callerNum: string\n startTime: number\n callerName: string\n bridgedNum: string\n bridgedName: string\n inConference: boolean\n channelStatus: string\n bridgedChannel: 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 conferencing?: boolean\n transferringName?: string\n transferringNumber?: string\n transferringStartTime?: string\n transferSwitching?: boolean\n transferCalls?: TransferCallsTypes[]\n ownerExtension?: string\n isRecording?: boolean\n isLocalVideoEnabled?: boolean\n hasVideoTrackAdded?: boolean\n showRemoteVideoPlaceHolder?: boolean\n isStartingVideoCall?: boolean\n streamingSourceNumber?: string\n chDest?: any\n chSource?: any\n throughQueue?: boolean\n queueId?: string\n queueName?: string\n queueNumber?: string\n queuePosition?: string\n queueWaitingTime?: number\n}\n"],"names":["defaultState","displayName","username","number","incomingSocket","incomingWebRTC","incoming","acceptedSocket","acceptedWebRTC","accepted","outgoingSocket","outgoingWebRTC","parked","outgoing","startTime","muted","paused","keypadValue","conversationId","transferring","conferencing","transferringName","transferringNumber","transferringStartTime","transferSwitching","transferCalls","Array","ownerExtension","isRecording","isLocalVideoEnabled","showRemoteVideoPlaceHolder","hasVideoTrackAdded","isStartingVideoCall","streamingSourceNumber","chDest","chSource","throughQueue","queueId","queueName","queueNumber","queuePosition","queueWaitingTime","currentCall","createModel","state","reducers","updateCurrentCall","payload","Number","__assign","updateKeypadValue","updateTransferring","updateTransferSwitching","addTransferCalls","find","item","__spreadArray","deleteTransferCalls","filter","type","setParked","updateRecordingStatus","updateStartTime","updateIncoming","reset","setLocalVideoEnabled","setVideoTrackAdded","updateConferencing","effects","dispatch","checkIncomingUpdatePlay","rootState","_b","_a","currentUser","default_device","_d","_c","_f","_e","selectedRingtoneAudio","ringtones","_g","availableRingtones","r","name","selectedRingtone","base64Audio","_h","undefined","player","updateStartAudioPlayer","src","loop","useRingtoneOutput","checkOutgoingUpdate","dispatchOutgoingCallStarted","checkAcceptedUpdate","eventDispatch"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("../fontawesome-svg-core/index.mjs.js");require("../../prop-types/index.js");var e=require("react"),r=require("../../../_virtual/index6.js");function o(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=o(e);function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,o=Array(e);r<e;r++)o[r]=t[r];return o}function i(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,e||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function s(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,o)}return r}function l(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?s(Object(r),!0).forEach((function(e){i(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function f(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var o,n,a,i,s=[],l=!0,f=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(o=a.call(r)).done)&&(s.push(o.value),s.length!==e);l=!0);}catch(t){f=!0,n=t}finally{try{if(!l&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(f)throw n}}return s}}(t,e)||p(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||p(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function p(t,e){if(t){if("string"==typeof t)return a(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(t,e):void 0}}var b;try{var y=require("@fortawesome/fontawesome-svg-core/package.json");b=y.version}catch(t){b="undefined"!=typeof process&&process.env.FA_VERSION||"7.0.0"}function m(t){var e=t.beat,r=t.fade,o=t.beatFade,n=t.bounce,a=t.shake,s=t.flash,l=t.spin,u=t.spinPulse,c=t.spinReverse,p=t.pulse,y=t.fixedWidth,m=t.inverse,d=t.border,x=t.listItem,v=t.flip,h=t.size,g=t.rotation,O=t.pull,w=t.swapOpacity,j=t.rotateBy,A=t.widthAuto,I=function(t,e){for(var r=f(t.split("-"),2),o=r[0],n=r[1],a=f(e.split("-"),2),i=a[0],s=a[1],l=o.split("."),u=i.split("."),c=0;c<Math.max(l.length,u.length);c++){var p=l[c]||"0",b=u[c]||"0",y=parseInt(p,10),m=parseInt(b,10);if(y!==m)return y>m}for(var d=0;d<Math.max(l.length,u.length);d++){var x=l[d]||"0",v=u[d]||"0";if(x!==v&&x.length!==v.length)return x.length<v.length}return!(n&&!s)}(b,"7.0.0"),k=i(i(i(i(i(i({"fa-beat":e,"fa-fade":r,"fa-beat-fade":o,"fa-bounce":n,"fa-shake":a,"fa-flash":s,"fa-spin":l,"fa-spin-reverse":c,"fa-spin-pulse":u,"fa-pulse":p,"fa-fw":y,"fa-inverse":m,"fa-border":d,"fa-li":x,"fa-flip":!0===v,"fa-flip-horizontal":"horizontal"===v||"both"===v,"fa-flip-vertical":"vertical"===v||"both"===v},"fa-".concat(h),null!=h),"fa-rotate-".concat(g),null!=g&&0!==g),"fa-pull-".concat(O),null!=O),"fa-swap-opacity",w),"fa-rotate-by",I&&j),"fa-width-auto",I&&A);return Object.keys(k).map((function(t){return k[t]?t:null})).filter((function(t){return t}))}function d(t){return e=t,(e-=0)==e?t:(t=t.replace(/[\-_\s]+(.)?/g,(function(t,e){return e?e.toUpperCase():""}))).substr(0,1).toLowerCase()+t.substr(1);var e}var x=["style"];var v=!1;try{v="production"===process.env.NODE_ENV}catch(t){}function h(e){return e&&"object"===c(e)&&e.prefix&&e.iconName&&e.icon?e:t.parse.icon?t.parse.icon(e):null===e?null:e&&"object"===c(e)&&e.prefix&&e.iconName?e:Array.isArray(e)&&2===e.length?{prefix:e[0],iconName:e[1]}:"string"==typeof e?{prefix:"fas",iconName:e}:void 0}function g(t,e){return Array.isArray(e)&&e.length>0||!Array.isArray(e)&&e?i({},t,e):{}}var O={border:!1,className:"",mask:null,maskId:null,fixedWidth:!1,inverse:!1,flip:!1,icon:null,listItem:!1,pull:null,pulse:!1,rotation:null,rotateBy:!1,size:null,spin:!1,spinPulse:!1,spinReverse:!1,beat:!1,fade:!1,beatFade:!1,bounce:!1,shake:!1,symbol:!1,title:"",titleId:null,transform:null,swapOpacity:!1,widthAuto:!1},w=n.default.forwardRef((function(e,r){var o=l(l({},O),e),n=o.icon,a=o.mask,i=o.symbol,s=o.className,f=o.title,c=o.titleId,p=o.maskId,b=h(n),y=g("classes",[].concat(u(m(o)),u((s||"").split(" ")))),d=g("transform","string"==typeof o.transform?t.parse.transform(o.transform):o.transform),x=g("mask",h(a)),w=t.icon(b,l(l(l(l({},y),d),x),{},{symbol:i,title:f,titleId:c,maskId:p}));if(!w)return function(){var t;!v&&console&&"function"==typeof console.error&&(t=console).error.apply(t,arguments)}("Could not find icon",b),null;var A=w.abstract,I={ref:r};return Object.keys(o).forEach((function(t){O.hasOwnProperty(t)||(I[t]=o[t])})),j(A[0],I)}));w.displayName="FontAwesomeIcon",w.propTypes={beat:r.exports.bool,border:r.exports.bool,beatFade:r.exports.bool,bounce:r.exports.bool,className:r.exports.string,fade:r.exports.bool,flash:r.exports.bool,mask:r.exports.oneOfType([r.exports.object,r.exports.array,r.exports.string]),maskId:r.exports.string,fixedWidth:r.exports.bool,inverse:r.exports.bool,flip:r.exports.oneOf([!0,!1,"horizontal","vertical","both"]),icon:r.exports.oneOfType([r.exports.object,r.exports.array,r.exports.string]),listItem:r.exports.bool,pull:r.exports.oneOf(["right","left"]),pulse:r.exports.bool,rotation:r.exports.oneOf([0,90,180,270]),rotateBy:r.exports.bool,shake:r.exports.bool,size:r.exports.oneOf(["2xs","xs","sm","lg","xl","2xl","1x","2x","3x","4x","5x","6x","7x","8x","9x","10x"]),spin:r.exports.bool,spinPulse:r.exports.bool,spinReverse:r.exports.bool,symbol:r.exports.oneOfType([r.exports.bool,r.exports.string]),title:r.exports.string,titleId:r.exports.string,transform:r.exports.oneOfType([r.exports.string,r.exports.object]),swapOpacity:r.exports.bool,widthAuto:r.exports.bool};var j=function t(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"==typeof r)return r;var n=(r.children||[]).map((function(r){return t(e,r)})),a=Object.keys(r.attributes||{}).reduce((function(t,e){var o=r.attributes[e];switch(e){case"class":t.attrs.className=o,delete r.attributes.class;break;case"style":t.attrs.style=o.split(";").map((function(t){return t.trim()})).filter((function(t){return t})).reduce((function(t,e){var r,o=e.indexOf(":"),n=d(e.slice(0,o)),a=e.slice(o+1).trim();return n.startsWith("webkit")?t[(r=n,r.charAt(0).toUpperCase()+r.slice(1))]=a:t[n]=a,t}),{});break;default:0===e.indexOf("aria-")||0===e.indexOf("data-")?t.attrs[e.toLowerCase()]=o:t.attrs[d(e)]=o}return t}),{attrs:{}}),i=o.style,s=void 0===i?{}:i,f=function(t,e){if(null==t)return{};var r,o,n=function(t,e){if(null==t)return{};var r={};for(var o in t)if({}.hasOwnProperty.call(t,o)){if(-1!==e.indexOf(o))continue;r[o]=t[o]}return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(o=0;o<a.length;o++)r=a[o],-1===e.indexOf(r)&&{}.propertyIsEnumerable.call(t,r)&&(n[r]=t[r])}return n}(o,x);return a.attrs.style=l(l({},a.attrs.style),s),e.apply(void 0,[r.tag,l(l({},a.attrs),f)].concat(u(n)))}.bind(null,n.default.createElement);exports.FontAwesomeIcon=w;
|
|
2
2
|
//# sourceMappingURL=index.es.js.map
|