@nethesis/phone-island 0.7.79 → 0.7.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.js +1 -1
- package/dist/App.js.map +1 -1
- package/dist/components/Events.d.ts +1 -0
- package/dist/components/Events.js +1 -1
- package/dist/components/Events.js.map +1 -1
- package/dist/components/WebRTC.d.ts +2 -0
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/events/CallEvents.d.ts +3 -1
- package/dist/events/CallEvents.js +1 -1
- package/dist/events/CallEvents.js.map +1 -1
- package/dist/lib/phone/call.d.ts +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/webrtc/messages.d.ts +6 -1
- package/dist/lib/webrtc/messages.js +1 -1
- package/dist/lib/webrtc/messages.js.map +1 -1
- package/package.json +1 -1
package/dist/App.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),s=require("./components/Socket.js"),r=require("./components/WebRTC.js"),o=require("./components/Island.js"),n=require("./components/RestAPI.js");require("./node_modules/react-redux/es/index.js");var a=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var u=require("./node_modules/js-base64/base64.mjs.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var d=require("./node_modules/react-redux/es/components/Provider.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("./node_modules/react-redux/node_modules/react-is/index.js"),require("./node_modules/react-redux/es/components/Context.js");var l=i(e),m=function(e){var i=e.dataConfig,m=e.showAlways,c=void 0!==m&&m,f=u.Base64.atob(i||"").split(":"),j=f[0],p=f[1],q=f[2],x=f[3],_=f[4];return l.default.createElement(l.default.Fragment,null,l.default.createElement(d.default,{store:a.store},l.default.createElement(r.WebRTC,{hostName:j,sipExten:x,sipSecret:_},l.default.createElement(n.RestAPI,{hostName:j,username:p,authToken:q},l.default.createElement(s.Socket,{hostName:j,username:p,authToken:q},l.default.createElement(t.Events,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),s=require("./components/Socket.js"),r=require("./components/WebRTC.js"),o=require("./components/Island.js"),n=require("./components/RestAPI.js");require("./node_modules/react-redux/es/index.js");var a=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var u=require("./node_modules/js-base64/base64.mjs.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var d=require("./node_modules/react-redux/es/components/Provider.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("./node_modules/react-redux/node_modules/react-is/index.js"),require("./node_modules/react-redux/es/components/Context.js");var l=i(e),m=function(e){var i=e.dataConfig,m=e.showAlways,c=void 0!==m&&m,f=u.Base64.atob(i||"").split(":"),j=f[0],p=f[1],q=f[2],x=f[3],_=f[4],h=f[5],v=f[6];return l.default.createElement(l.default.Fragment,null,l.default.createElement(d.default,{store:a.store},l.default.createElement(r.WebRTC,{hostName:j,sipExten:x,sipSecret:_,sipHost:h,sipPort:v},l.default.createElement(n.RestAPI,{hostName:j,username:p,authToken:q},l.default.createElement(s.Socket,{hostName:j,username:p,authToken:q},l.default.createElement(t.Events,{sipHost:h},l.default.createElement(o.Island,{showAlways:c})))))))};m.displayName="PhoneIsland",exports.PhoneIsland=m;
|
|
2
2
|
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\n\nimport 'react-tooltip/dist/react-tooltip.css'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n\n return (\n <>\n <Provider store={store}>\n <WebRTC
|
|
1
|
+
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\n\nimport 'react-tooltip/dist/react-tooltip.css'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n return (\n <>\n <Provider store={store}>\n <WebRTC\n hostName={HOST_NAME}\n sipExten={SIP_EXTEN}\n sipSecret={SIP_SECRET}\n sipHost={SIP_HOST}\n sipPort={SIP_PORT}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} />\n </Events>\n </Socket>\n </RestAPI>\n </WebRTC>\n </Provider>\n </>\n )\n}\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIsland","_a","dataConfig","_b","showAlways","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","SIP_HOST","SIP_PORT","React","createElement","Fragment","Provider","store","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"w9BAaaA,EAAoC,SAACC,GAAE,IAAAC,eAAYC,EAAAF,EAAAG,WAAAA,OAAU,IAAAD,GAAQA,EAC1EE,EAAmBC,EAAMA,OAACC,KAAKL,GAAc,IAAIM,MAAM,KACvDC,EAAoBJ,EAAO,GAC3BK,EAAmBL,EAAO,GAC1BM,EAAqBN,EAAO,GAC5BO,EAAoBP,EAAO,GAC3BQ,EAAqBR,EAAO,GAC5BS,EAAmBT,EAAO,GAC1BU,EAAmBV,EAAO,GAEhC,OACEW,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAACE,EAAAA,QAAQ,CAACC,MAAOA,EAAAA,OACfJ,EAAAA,QAACC,cAAAI,EAAAA,QACCC,SAAUb,EACVc,SAAUX,EACVY,UAAWX,EACXY,QAASX,EACTY,QAASX,GAETC,UAAAC,cAACU,EAAOA,QAAA,CAACL,SAAUb,EAAWmB,SAAUlB,EAAUmB,UAAWlB,GAC3DK,UAAAC,cAACa,EAAMA,OAAA,CAACR,SAAUb,EAAWmB,SAAUlB,EAAUmB,UAAWlB,GAC1DK,EAAAA,QAAAC,cAACc,EAAAA,OAAM,CAACN,QAASX,GACfE,UAAAC,cAACe,EAAMA,OAAA,CAAC5B,WAAYA,SAQpC,EAEAJ,EAAYiC,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../events/CallEvents.js"),r=require("../events/PlayerEvents.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=l(e);exports.Events=function(e){var l=e.children;return n.default.createElement(n.default.Fragment,null,n.default.createElement(r.PlayerEvents,null),n.default.createElement(t.CallEvents,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../events/CallEvents.js"),r=require("../events/PlayerEvents.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=l(e);exports.Events=function(e){var l=e.sipHost,a=e.children;return n.default.createElement(n.default.Fragment,null,n.default.createElement(r.PlayerEvents,null),n.default.createElement(t.CallEvents,{sipHost:l}),a)};
|
|
2
2
|
//# sourceMappingURL=Events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Events.js","sources":["../../src/components/Events.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC } from 'react'\nimport { CallEvents, PlayerEvents } from '../events'\n\ninterface EventsProps {\n children: ReactNode\n}\n\nexport const Events: FC<EventsProps> = ({ children }) => {\n return (\n <>\n {<PlayerEvents />}\n {<CallEvents />}\n {children}\n </>\n )\n}\n"],"names":["_a","children","React","createElement","Fragment","PlayerEvents","CallEvents"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Events.js","sources":["../../src/components/Events.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC } from 'react'\nimport { CallEvents, PlayerEvents } from '../events'\n\ninterface EventsProps {\n children: ReactNode\n sipHost: string\n}\n\nexport const Events: FC<EventsProps> = ({ sipHost, children }) => {\n return (\n <>\n {<PlayerEvents />}\n {<CallEvents sipHost={sipHost} />}\n {children}\n </>\n )\n}\n"],"names":["_a","sipHost","children","React","createElement","Fragment","PlayerEvents","CallEvents"],"mappings":"yQAWuC,SAACA,OAAEC,EAAOD,EAAAC,QAAEC,EAAQF,EAAAE,SACzD,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACGF,UAAAC,cAACE,EAAYA,aAAG,MAChBH,EAAAA,QAAAC,cAACG,EAAAA,WAAU,CAACN,QAASA,IACrBC,EAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),r=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),n=require("../store/index.js"),o=require("../lib/devices/devices.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),r=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),n=require("../store/index.js"),o=require("../lib/devices/devices.js"),s=require("../lib/phone/call.js"),i=require("../lib/webrtc/connection.js"),c=require("../static/outgoing_ringtone.js"),l=require("../node_modules/react-redux/es/hooks/useDispatch.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=u(e),d=r.default;exports.WebRTC=function(r){var u=r.hostName,p=r.sipExten,b=r.sipSecret,f=r.children,m=r.sipHost,w=r.sipPort,h=l.useDispatch(),v=e.useRef(null);return e.useEffect((function(){o.checkMediaPermissions()}),[]),e.useEffect((function(){var e;return d.init({debug:"all",dependencies:d.useDefaultDependencies({adapter:t.default}),callback:function(){var e=new d({server:"https://".concat(u,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(h.webrtc.updateWebRTC({sipcall:e}),a.register({sipExten:p,sipSecret:b,sipHost:m,sipPort:w}),e&&d.log&&d.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){d.error&&(d.error(" -- Error attaching plugin..."),d.error(e))},consentDialog:function(e){d.log&&d.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){d.log&&d.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){n.store.getState().webrtc.sipcall&&d.log&&d.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,t){d.log&&d.log("Janus "+(t?"started":"stopped")+" receiving our "+e)},slowLink:function(e,t){e?d.warn&&d.warn("SLOW link: several missing packets from janus (".concat(t,")")):d.warn&&d.warn("SLOW link: janus is not receiving all your packets (".concat(t,")"))},onmessage:function(e,t){var r=n.store.getState().webrtc.sipcall;d.debug&&(d.debug(" ::: Got a message :::"),d.debug(JSON.stringify(e)));var o=e.error;if(null==o||null==o){var i=e.result;if(null!=i&&void 0!==i.event&&null!==i.event)switch(i.event){case"registration_failed":d.error&&d.error("Registration failed: "+i.code+" "+i.reason);break;case"unregistered":d.log&&d.log("Successfully un-registered as "+i.username+"!");break;case"registered":d.log&&d.log("Successfully registered as "+i.username+"!"),n.store.getState().webrtc.registered||n.store.dispatch.webrtc.updateWebRTC({registered:!0}),h.webrtc.updateLastActivity((new Date).getTime());break;case"registering":d.log&&d.log("janus registering");break;case"calling":h.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),h.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":n.store.getState().player.audioPlayerPlaying||h.player.updateStartAudioPlayer({src:c.default,loop:!0}),h.webrtc.updateLastActivity((new Date).getTime());break;case"progress":d.log&&d.log("There's early media from "+i.username+", wairing for the call!"),null!=t&&a.handleRemote(t),h.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":h.webrtc.updateWebRTC({jsepGlobal:t}),h.currentCall.checkIncomingUpdatePlay({incomingWebRTC:!0}),d.log&&d.log("Incoming call from "+i.username+"!"),h.webrtc.updateLastActivity((new Date).getTime());break;case"accepted":d.log&&d.log(i.username+" accepted the call!"),t&&a.handleRemote(t),h.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),h.currentCall.updateCurrentCall({incoming:!1,incomingWebRTC:!1}),n.store.dispatch.player.stopAudioPlayer(),h.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":s.hangupCurrentCall(),r.hangup(),d.log&&d.log("Call hung up ("+i.code+" "+i.reason+")!"),h.webrtc.updateLastActivity((new Date).getTime())}}else n.store.getState().webrtc.registered?(r&&r.hangup(),n.store.dispatch.player.stopAudioPlayer()):d.log&&d.log("User is not registered")},onlocalstream:function(e){d.debug&&(d.debug(" ::: Got a local stream :::"),d.debug(e))},onremotestream:function(e){d.debug&&d.debug(" ::: Got a remote stream :::"),n.store.dispatch.player.stopAudioPlayer();var t=n.store.getState().player.remoteAudio,r=n.store.getState().player.remoteVideo,a=e.getAudioTracks(),o=e.getVideoTracks();if(d.attachMediaStream){if(a&&a.length>0){var s=new MediaStream(a);t&&t.current&&d.attachMediaStream(t.current,s),n.store.dispatch.webrtc.updateRemoteAudioStream(s)}else console.warn("No audio tracks on remote stream");if(o&&o.length>0){var i=new MediaStream(o);r&&r.current&&d.attachMediaStream(r.current,i)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){d.log&&d.log(" ::: janus Got a cleanup notification :::")},detached:function(){d.warn&&d.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){d.log&&d.log("error",e),h.alerts.setAlert("webrtc_down")},destroyed:function(){h.webrtc.updateWebRTC({destroyed:!0}),h.alerts.setAlert("webrtc_down")}})}}),e=n.store.getState().webrtc.CHECK_INTERVAL_TIME,v.current||(v.current=setInterval((function(){return i.webrtcCheck((function(){a.register({sipExten:p,sipSecret:b,sipHost:m,sipPort:w})}))}),e)),function(){a.unregister(),clearInterval(v.current)}}),[]),g.default.createElement(g.default.Fragment,null,f)};
|
|
2
2
|
//# sourceMappingURL=WebRTC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useState, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store, type RootState } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n}\n\nconst Janus: JanusTypes = JanusLib\n\nexport const WebRTC: FC<WebRTCProps> = ({ hostName, sipExten, sipSecret, children }) => {\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n useEffect(() => {\n const setupDeps = () =>\n Janus.useDefaultDependencies({\n adapter,\n })\n\n function initWebRTC() {\n Janus.init({\n debug: 'all',\n dependencies: setupDeps(),\n callback: function () {\n const janusInstance = new Janus({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register(sipExten, sipSecret)\n if (pluginHandle) {\n if (Janus.log)\n Janus.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (Janus.error) {\n Janus.error(' -- Error attaching plugin...')\n Janus.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (Janus.log) Janus.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (Janus.log)\n Janus.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (Janus.log)\n Janus.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (Janus.log)\n Janus.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (Janus.warn)\n Janus.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (Janus.warn)\n Janus.warn(`SLOW link: janus is not receiving all your packets (${count})`)\n }\n },\n onmessage: function (msg, jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (Janus.debug) {\n Janus.debug(' ::: Got a message :::')\n Janus.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (Janus.log) Janus.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // get event\n var event = result['event']\n\n //switch event\n switch (event) {\n case 'registration_failed':\n if (Janus.error)\n Janus.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (Janus.log)\n Janus.log('Successfully un-registered as ' + result['username'] + '!')\n // registered = false\n break\n\n case 'registered':\n if (Janus.log)\n Janus.log('Successfully registered as ' + result['username'] + '!')\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (Janus.log) Janus.log('janus registering')\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (Janus.log)\n Janus.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n if (jsep !== null && jsep !== undefined) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n\n // Number and display name are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (Janus.log) Janus.log('Incoming call from ' + result['username'] + '!')\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (Janus.log) Janus.log(result['username'] + ' accepted the call!')\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // Set incoming value to false\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n hangupCurrentCall()\n sipcall.hangup()\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (Janus.log)\n Janus.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (Janus.debug) {\n Janus.debug(' ::: Got a local stream :::')\n Janus.debug(stream)\n }\n // if (Janus.attachMediaStream) Janus.attachMediaStream(localVideoElement, stream)\n /* IS VIDEO ENABLED ? */\n // var videoTracks = stream.getVideoTracks()\n /* */\n },\n onremotestream: function (stream: MediaStream) {\n if (Janus.debug) {\n Janus.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (Janus.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n remoteAudioElement &&\n remoteAudioElement.current &&\n Janus.attachMediaStream(remoteAudioElement.current, audioStream)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n remoteVideoElement &&\n remoteVideoElement.current &&\n Janus.attachMediaStream(remoteVideoElement.current, videoStream)\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (Janus.log) Janus.log(' ::: janus Got a cleanup notification :::')\n },\n detached: function () {\n if (Janus.warn) Janus.warn('SIP plugin handle detached from the plugin itself')\n },\n })\n }\n },\n error: (err: any) => {\n if (Janus.log) Janus.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }\n\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register(sipExten, sipSecret)\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n return <>{children}</>\n}\n"],"names":["Janus","JanusLib","_a","hostName","sipExten","sipSecret","children","dispatch","useDispatch","janusCheckInterval","useRef","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","registered","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","checkIncomingUpdatePlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","stopAudioPlayer","hangupCurrentCall","hangup","onlocalstream","stream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","current","updateRemoteAudioStream","console","videoStream","oncleanup","detached","err","alerts","setAlert","destroyed","setInterval","webrtcCheck","unregister","clearInterval","React","createElement","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useState, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store, type RootState } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n}\n\nconst Janus: JanusTypes = JanusLib\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n useEffect(() => {\n const setupDeps = () =>\n Janus.useDefaultDependencies({\n adapter,\n })\n\n function initWebRTC() {\n Janus.init({\n debug: 'all',\n dependencies: setupDeps(),\n callback: function () {\n const janusInstance = new Janus({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (Janus.log)\n Janus.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (Janus.error) {\n Janus.error(' -- Error attaching plugin...')\n Janus.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (Janus.log) Janus.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (Janus.log)\n Janus.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (Janus.log)\n Janus.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (Janus.log)\n Janus.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (Janus.warn)\n Janus.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (Janus.warn)\n Janus.warn(`SLOW link: janus is not receiving all your packets (${count})`)\n }\n },\n onmessage: function (msg, jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (Janus.debug) {\n Janus.debug(' ::: Got a message :::')\n Janus.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (Janus.log) Janus.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // get event\n var event = result['event']\n\n //switch event\n switch (event) {\n case 'registration_failed':\n if (Janus.error)\n Janus.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (Janus.log)\n Janus.log('Successfully un-registered as ' + result['username'] + '!')\n // registered = false\n break\n\n case 'registered':\n if (Janus.log)\n Janus.log('Successfully registered as ' + result['username'] + '!')\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (Janus.log) Janus.log('janus registering')\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (Janus.log)\n Janus.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n if (jsep !== null && jsep !== undefined) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n\n // Number and display name are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (Janus.log) Janus.log('Incoming call from ' + result['username'] + '!')\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (Janus.log) Janus.log(result['username'] + ' accepted the call!')\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // Set incoming value to false\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n hangupCurrentCall()\n sipcall.hangup()\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (Janus.log)\n Janus.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (Janus.debug) {\n Janus.debug(' ::: Got a local stream :::')\n Janus.debug(stream)\n }\n // if (Janus.attachMediaStream) Janus.attachMediaStream(localVideoElement, stream)\n /* IS VIDEO ENABLED ? */\n // var videoTracks = stream.getVideoTracks()\n /* */\n },\n onremotestream: function (stream: MediaStream) {\n if (Janus.debug) {\n Janus.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (Janus.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n remoteAudioElement &&\n remoteAudioElement.current &&\n Janus.attachMediaStream(remoteAudioElement.current, audioStream)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n remoteVideoElement &&\n remoteVideoElement.current &&\n Janus.attachMediaStream(remoteVideoElement.current, videoStream)\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (Janus.log) Janus.log(' ::: janus Got a cleanup notification :::')\n },\n detached: function () {\n if (Janus.warn) Janus.warn('SIP plugin handle detached from the plugin itself')\n },\n })\n }\n },\n error: (err: any) => {\n if (Janus.log) Janus.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }\n\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n return <>{children}</>\n}\n"],"names":["Janus","JanusLib","_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","dispatch","useDispatch","janusCheckInterval","useRef","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","registered","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","checkIncomingUpdatePlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","stopAudioPlayer","hangupCurrentCall","hangup","onlocalstream","stream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","current","updateRemoteAudioStream","console","videoStream","oncleanup","detached","err","alerts","setAlert","destroyed","setInterval","webrtcCheck","unregister","clearInterval","React","createElement","Fragment"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../utils/customHooks/useEventListener.js"),r=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/react-redux/es/index.js");var s=require("../lib/phone/call.js"),n=require("../node_modules/react-redux/es/hooks/useSelector.js");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../utils/customHooks/useEventListener.js"),r=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/react-redux/es/index.js");var s=require("../lib/phone/call.js"),n=require("../node_modules/react-redux/es/hooks/useSelector.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("../node_modules/react-redux/es/components/Context.js"),require("../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("../node_modules/react-redux/node_modules/react-is/index.js");var u=o(e);exports.CallEvents=function(e){var r=e.sipHost;return n.useSelector((function(e){return e.webrtc})).sipcall,t.useEventListener("phone-island-call-start",(function(e){var t=e.number.replace(/\s/g,"");s.callNumber(t,r)})),u.default.createElement(u.default.Fragment,null)},exports.dispatchOutgoingCallStarted=function(e,t){void 0===e&&(e=""),void 0===t&&(t="");var s={name:e,number:t};r.eventDispatch("phone-island-outgoing-call-started",s)};
|
|
2
2
|
//# sourceMappingURL=CallEvents.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallEvents.js","sources":["../../src/events/CallEvents.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC } from 'react'\nimport { useEventListener, eventDispatch } from '../utils'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { callNumber } from '../lib/phone/call'\n\nexport const CallEvents: FC = () => {\n const { sipcall }: any = useSelector((state: RootState) => state.webrtc)\n /**\n * Event listner for phone-island-call-start event\n */\n useEventListener('phone-island-call-start', (data: CallStartTypes) => {\n const number = data.number.replace(/\\s/g, '')\n callNumber(number)\n })\n return <></>\n}\n\n// !TODO add phone-island-outgoing-call-started phone-island-outgoing-call-ended\n\n/**\n * Dispatch the phone-island-outgoing-call-started event\n */\nexport function dispatchOutgoingCallStarted(name: string = '', number: string = '') {\n const data: OutgoingCallStartedTypes = {\n name,\n number,\n }\n eventDispatch('phone-island-outgoing-call-started', data)\n}\n\nexport interface OutgoingCallStartedTypes {\n name: string\n number: string\n}\n\ninterface CallStartTypes {\n number: string\n}\n"],"names":["useSelector","state","webrtc","useEventListener","data","number","replace","callNumber","React","name","eventDispatch"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CallEvents.js","sources":["../../src/events/CallEvents.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC } from 'react'\nimport { useEventListener, eventDispatch } from '../utils'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { callNumber } from '../lib/phone/call'\n\nexport const CallEvents: FC<{ sipHost: string }> = ({ sipHost }) => {\n const { sipcall }: any = useSelector((state: RootState) => state.webrtc)\n /**\n * Event listner for phone-island-call-start event\n */\n useEventListener('phone-island-call-start', (data: CallStartTypes) => {\n const number = data.number.replace(/\\s/g, '')\n callNumber(number, sipHost)\n })\n return <></>\n}\n\n// !TODO add phone-island-outgoing-call-started phone-island-outgoing-call-ended\n\n/**\n * Dispatch the phone-island-outgoing-call-started event\n */\nexport function dispatchOutgoingCallStarted(name: string = '', number: string = '') {\n const data: OutgoingCallStartedTypes = {\n name,\n number,\n }\n eventDispatch('phone-island-outgoing-call-started', data)\n}\n\nexport interface OutgoingCallStartedTypes {\n name: string\n number: string\n}\n\ninterface CallStartTypes {\n number: string\n}\n"],"names":["_a","sipHost","useSelector","state","webrtc","useEventListener","data","number","replace","callNumber","React","name","eventDispatch"],"mappings":"sqBASmD,SAACA,GAAE,IAAAC,EAAOD,EAAAC,QAS3D,OARyBC,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMC,MAAM,YAIvEC,mBAAiB,2BAA2B,SAACC,GAC3C,IAAMC,EAASD,EAAKC,OAAOC,QAAQ,MAAO,IAC1CC,aAAWF,EAAQN,EACrB,IACOS,gDACT,sCAOgB,SAA4BC,EAAmBJ,QAAnB,IAAAI,IAAAA,EAAiB,SAAE,IAAAJ,IAAAA,EAAmB,IAChF,IAAMD,EAAiC,CACrCK,KAAIA,EACJJ,OAAMA,GAERK,gBAAc,qCAAsCN,EACtD"}
|
package/dist/lib/phone/call.d.ts
CHANGED
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("../devices/devices.js"),r=require("../webrtc/janus.js"),a=require("../webrtc/messages.js"),n=require("../../store/index.js"),o=require("../user/default_device.js"),s=require("../../services/astproxy.js"),u=require("../../static/dtmf/index.js");function i(n){var o=this;t.getSupportedDevices((function(){return e.__awaiter(o,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return r.default.log("This is a SIP call"),[4,a.call(n,{audio:{mandatory:{echoCancellation:!1,googEchoCancellation:!1,googAutoGainControl:!1,googAutoGainControl2:!1,googNoiseSuppression:!1,googHighpassFilter:!1,googTypingNoiseDetection:!1}},audioSend:!0,audioRecv:!0,videoSend:!1,videoRecv:!1})];case 1:return e.sent(),[2]}}))}))}))}exports.answerIncomingCall=function(){o.isWebRTC()&&a.answerWebRTC()},exports.attendedTransfer=function(t){return e.__awaiter(this,void 0,void 0,(function(){var r,a;return e.__generator(this,(function(e){switch(e.label){case 0:return r=n.store.getState().currentCall.conversationId,a=n.store.getState().currentUser.default_device,r&&(null==a?void 0:a.id)&&t?[4,s.attendedTransfer({convid:r,to:t,endpointId:a.id})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e){i("sip:".concat(e,"@").concat(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../devices/devices.js"),r=require("../webrtc/janus.js"),a=require("../webrtc/messages.js"),n=require("../../store/index.js"),o=require("../user/default_device.js"),s=require("../../services/astproxy.js"),u=require("../../static/dtmf/index.js");function i(n){var o=this;t.getSupportedDevices((function(){return e.__awaiter(o,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return r.default.log("This is a SIP call"),[4,a.call(n,{audio:{mandatory:{echoCancellation:!1,googEchoCancellation:!1,googAutoGainControl:!1,googAutoGainControl2:!1,googNoiseSuppression:!1,googHighpassFilter:!1,googTypingNoiseDetection:!1}},audioSend:!0,audioRecv:!0,videoSend:!1,videoRecv:!1})];case 1:return e.sent(),[2]}}))}))}))}exports.answerIncomingCall=function(){o.isWebRTC()&&a.answerWebRTC()},exports.attendedTransfer=function(t){return e.__awaiter(this,void 0,void 0,(function(){var r,a;return e.__generator(this,(function(e){switch(e.label){case 0:return r=n.store.getState().currentCall.conversationId,a=n.store.getState().currentUser.default_device,r&&(null==a?void 0:a.id)&&t?[4,s.attendedTransfer({convid:r,to:t,endpointId:a.id})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,t){i("sip:".concat(e,"@").concat(t))},exports.callSipURI=i,exports.hangupCurrentCall=function(){var e=n.store.getState().currentCall,t=e.outgoing,r=e.accepted;t||r?a.hangup():a.decline(),n.store.dispatch.player.stopAudioPlayer(),n.store.dispatch.currentCall.reset()},exports.muteCurrentCall=function(){o.isWebRTC()&&a.muteWebRTC()&&n.store.dispatch.currentCall.updateCurrentCall({muted:!0})},exports.pauseCurrentCall=function(){o.isWebRTC()&&a.pauseWebRTC()&&(n.store.dispatch.currentCall.updateCurrentCall({paused:!0}),n.store.dispatch.player.pauseRemoteAudio())},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),n.store.dispatch.player.updateStartAudioPlayer({src:u.default["dtmf_".concat(e)]})},exports.unmuteCurrentCall=function(){o.isWebRTC()&&a.unmuteWebRTC()&&n.store.dispatch.currentCall.updateCurrentCall({muted:!1})},exports.unpauseCurrentCall=function(){o.isWebRTC()&&a.unpauseWebRTC()&&(n.store.dispatch.currentCall.updateCurrentCall({paused:!1}),n.store.dispatch.player.playRemoteAudio())};
|
|
2
2
|
//# sourceMappingURL=call.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { getSupportedDevices } from '../devices/devices'\nimport Janus from '../webrtc/janus'\nimport {\n call,\n hangup,\n decline,\n answerWebRTC,\n muteWebRTC,\n unmuteWebRTC,\n pauseWebRTC,\n unpauseWebRTC,\n} from '../webrtc/messages'\nimport { store } from '../../store'\nimport { isWebRTC } from '../user/default_device'\nimport {\n blindTransfer as blindTransferRequest,\n attendedTransfer as attendedTransferRequest,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\n\n/**\n * Starts a call to a number\n * @param number The number string\n */\nexport function callNumber(number: string
|
|
1
|
+
{"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { getSupportedDevices } from '../devices/devices'\nimport Janus from '../webrtc/janus'\nimport {\n call,\n hangup,\n decline,\n answerWebRTC,\n muteWebRTC,\n unmuteWebRTC,\n pauseWebRTC,\n unpauseWebRTC,\n} from '../webrtc/messages'\nimport { store } from '../../store'\nimport { isWebRTC } from '../user/default_device'\nimport {\n blindTransfer as blindTransferRequest,\n attendedTransfer as attendedTransferRequest,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\n\n/**\n * Starts a call to a number\n * @param number The number string\n */\nexport function callNumber(number: string, sipHost: string) {\n const sipURI = `sip:${number}@${sipHost}`\n callSipURI(sipURI)\n}\n\n/**\n * Starts a call to a SIP URI\n *\n * @param sipURI The SIP URI string\n */\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n await call(sipURI, {\n audio: {\n mandatory: {\n echoCancellation: false,\n googEchoCancellation: false,\n googAutoGainControl: false,\n googAutoGainControl2: false,\n googNoiseSuppression: false,\n googHighpassFilter: false,\n googTypingNoiseDetection: false,\n },\n },\n audioSend: true,\n audioRecv: true,\n videoSend: false,\n videoRecv: false,\n })\n })\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted } = store.getState().currentCall\n if (outgoing || accepted) {\n hangup()\n } else {\n decline()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n}\n\n/**\n * Mute the current call\n */\nexport function muteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const muted = muteWebRTC()\n if (muted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: true,\n })\n }\n }\n}\n\n/**\n * Unmute the current call\n */\nexport function unmuteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unmuted = unmuteWebRTC()\n if (unmuted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: false,\n })\n }\n }\n}\n\n/**\n * Pause the current call\n */\nexport function pauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const paused = pauseWebRTC()\n if (paused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: true,\n })\n // Pause remote audio\n store.dispatch.player.pauseRemoteAudio()\n }\n }\n}\n\n/**\n * Unpause the current call\n */\nexport function unpauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unpaused = unpauseWebRTC()\n if (unpaused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: false,\n })\n // Play remote audio\n store.dispatch.player.playRemoteAudio()\n }\n }\n}\n\n/**\n * Transfer the current call through a blind transfer (not in use)\n */\nexport async function blindTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n // Transfer the call through blind transfer\n if (conversationId && default_device?.id && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device.id,\n })\n }\n}\n\n/**\n * Transfer the current call through a attended transfer\n */\nexport async function attendedTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n // Transfer the call through attended transfer\n if (conversationId && default_device?.id && number) {\n return await attendedTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device.id,\n })\n }\n}\n\n/**\n * Play the dtmf audio files\n */\nexport function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n store.dispatch.player.updateStartAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n}\n"],"names":["callSipURI","sipURI","_this","this","getSupportedDevices","__awaiter","Janus","log","call","audio","mandatory","echoCancellation","googEchoCancellation","googAutoGainControl","googAutoGainControl2","googNoiseSuppression","googHighpassFilter","googTypingNoiseDetection","audioSend","audioRecv","videoSend","videoRecv","_a","sent","isWebRTC","answerWebRTC","number","conversationId","store","getState","currentCall","default_device","currentUser","id","attendedTransferRequest","convid","to","endpointId","sipHost","concat","outgoing","accepted","hangup","decline","dispatch","player","stopAudioPlayer","reset","muteWebRTC","updateCurrentCall","muted","pauseWebRTC","paused","pauseRemoteAudio","key","updateStartAudioPlayer","src","dtmfAudios","unmuteWebRTC","unpauseWebRTC","playRemoteAudio"],"mappings":"0XAqCM,SAAUA,EAAWC,GAA3B,IAsBCC,EAAAC,KArBCC,EAAmBA,qBAAC,WAAA,OAAAC,EAAAA,UAAAH,OAAA,OAAA,GAAA,yEAGlB,OADAI,UAAMC,IAAI,sBACJ,CAAA,EAAAC,EAAIA,KAACP,EAAQ,CACjBQ,MAAO,CACLC,UAAW,CACTC,kBAAkB,EAClBC,sBAAsB,EACtBC,qBAAqB,EACrBC,sBAAsB,EACtBC,sBAAsB,EACtBC,oBAAoB,EACpBC,0BAA0B,IAG9BC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,WAAW,mBAfbC,EAAAC,cAiBD,GAAA,GACH,uCAMMC,EAAQA,YACVC,EAAAA,cAEJ,2BAoGM,SAAiCC,2HAKjC,OAHIC,EAAmBC,EAAAA,MAAMC,WAAWC,2BACpCC,EAAmBH,EAAAA,MAAMC,WAAWG,2BAExCL,IAAkBI,aAAA,EAAAA,EAAgBE,KAAMP,EACnC,CAAA,EAAMQ,mBAAwB,CACnCC,OAAQR,EACRS,GAAIV,EACJW,WAAYN,EAAeE,MAJmB,CAAA,EAAA,GAChD,KAAA,EAAA,MAAA,CAAA,EAAOX,iCAMV,qBAzJe,SAAWI,EAAgBY,GAEzCtC,EADe,OAAAuC,OAAOb,EAAU,KAAAa,OAAAD,GAElC,4DA4CQ,IAAAhB,EAAyBM,EAAAA,MAAMC,WAAWC,YAAxCU,EAAQlB,EAAAkB,SAAEC,aACdD,GAAYC,EACdC,EAAAA,SAEAC,EAAAA,UAEFf,EAAAA,MAAMgB,SAASC,OAAOC,kBACtBlB,EAAAA,MAAMgB,SAASd,YAAYiB,OAC7B,qCAOMvB,EAAQA,YACIwB,EAAAA,cAEZpB,QAAMgB,SAASd,YAAYmB,kBAAkB,CAC3CC,OAAO,GAIf,sCAsBM1B,EAAQA,YACK2B,EAAAA,gBAEbvB,QAAMgB,SAASd,YAAYmB,kBAAkB,CAC3CG,QAAQ,IAGVxB,EAAAA,MAAMgB,SAASC,OAAOQ,mBAG5B,wBAwDM,SAAwBC,GAChB,MAARA,IAAaA,EAAM,QACX,MAARA,IAAaA,EAAM,SACvB1B,EAAAA,MAAMgB,SAASC,OAAOU,uBAAuB,CAAEC,IAAKC,UAAW,QAAQlB,OAAAe,KACzE,uCArFM9B,EAAQA,YACMkC,EAAAA,gBAEd9B,QAAMgB,SAASd,YAAYmB,kBAAkB,CAC3CC,OAAO,GAIf,wCAwBM1B,EAAQA,YACOmC,EAAAA,kBAEf/B,QAAMgB,SAASd,YAAYmB,kBAAkB,CAC3CG,QAAQ,IAGVxB,EAAAA,MAAMgB,SAASC,OAAOe,kBAG5B"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export declare function register(sipExten
|
|
1
|
+
export declare function register({ sipExten, sipSecret, sipHost, sipPort, }: {
|
|
2
|
+
sipExten: string;
|
|
3
|
+
sipSecret: string;
|
|
4
|
+
sipHost: string;
|
|
5
|
+
sipPort: string;
|
|
6
|
+
}): void;
|
|
2
7
|
export declare function answerWebRTC(): void;
|
|
3
8
|
export declare function decline(): void;
|
|
4
9
|
export declare function hangup(): void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./janus.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./janus.js"),t=require("../../store/index.js"),r=require("../../node_modules/webrtc-adapter/src/js/adapter_core.js");exports.answerWebRTC=function(){var r=t.store.getState().webrtc,s=r.sipcall,o=r.jsepGlobal;s&&o&&s.createAnswer({jsep:o,media:{audio:!0,videoSend:!1,videoRecv:!1},success:function(e){s.send({message:{request:"accept"},jsep:e})},error:function(t){e.default.error("WebRTC error:",t),s.send({message:{request:"decline",code:480}})}})},exports.call=function(r,s){return new Promise((function(o,n){var a=t.store.getState().webrtc.sipcall;r&&s&&a.createOffer({media:s,success:function(t){e.default.debug("Got SDP!"),e.default.debug(t),a.send({message:{request:"call",uri:r},jsep:t}),o(!0)},error:function(t){e.default.error("ebRTC error...",t),e.default.error("WebRTC error call on createOffer: ",t),n(!1)}})}))},exports.decline=function(){var e=t.store.getState().webrtc.sipcall;e&&e.send({message:{request:"decline"}})},exports.handleRemote=function(e){var r=t.store.getState().webrtc.sipcall;r&&r.handleRemoteJsep({jsep:e,error:function(){r.send({message:{request:"hangup"}}),r.hangup()}})},exports.hangup=function(){var e=t.store.getState().webrtc.sipcall;e&&e.send({message:{request:"hangup"}})},exports.muteWebRTC=function(){var e=t.store.getState().webrtc.sipcall;return e.muteAudio(),e.isAudioMuted()},exports.pauseWebRTC=function(){var e=t.store.getState().webrtc.sipcall;try{return e.send({message:{request:"hold"}}),!0}catch(e){return console.error(e),!1}},exports.register=function(e){var r=e.sipExten,s=e.sipSecret,o=e.sipHost,n=e.sipPort,a=t.store.getState().webrtc.sipcall,c=t.store.getState().currentUser.name;a&&a.send({message:{request:"register",username:"sip:".concat(r,"@").concat(o),display_name:c||"",secret:s,proxy:"sip:".concat(o,":").concat(n),outbound_proxy:"sip:".concat(o,":").concat(n),sips:!1,refresh:!1}})},exports.sendDTMF=function(e){var s=t.store.getState().webrtc.sipcall;"chrome"===r.default.browserDetails.browser?s.dtmf({dtmf:{tones:e}}):s.send({message:{request:"dtmf_info",digit:e}})},exports.unmuteWebRTC=function(){var e=t.store.getState().webrtc.sipcall;return e.unmuteAudio(),!e.isAudioMuted()},exports.unpauseWebRTC=function(){var e=t.store.getState().webrtc.sipcall;try{return e.send({message:{request:"unhold"}}),!0}catch(e){return console.error(e),!1}},exports.unregister=function(){var e=t.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) 2022 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'\n\nexport function register(sipExten: string
|
|
1
|
+
{"version":3,"file":"messages.js","sources":["../../../src/lib/webrtc/messages.ts"],"sourcesContent":["// Copyright (C) 2022 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'\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 }: { sipcall: any } = store.getState().webrtc\n const { name } = store.getState().currentUser\n if (sipcall) {\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 if (sipcall && jsepGlobal) {\n sipcall.createAnswer({\n jsep: jsepGlobal,\n media: {\n audio: true,\n videoSend: false,\n videoRecv: false,\n },\n success: (jsep) => {\n sipcall.send({\n message: {\n request: 'accept',\n },\n jsep: jsep,\n })\n },\n error: (error) => {\n // @ts-ignore\n Janus.error('WebRTC error:', error)\n sipcall.send({\n message: {\n request: 'decline',\n code: 480,\n },\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 handleRemote(jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.handleRemoteJsep({\n jsep: jsep,\n error: function () {\n var hangup = {\n request: 'hangup',\n }\n sipcall.send({\n message: hangup,\n })\n sipcall.hangup()\n },\n })\n }\n}\n\n/**\n * Starts a call to a sipuri\n *\n * @param sipURI The sipuri to be called\n * @param mediaObj The object containing the media constrains\n * @returns\n */\nexport function call(sipURI: string, mediaObj: object) {\n return new Promise((resolve, reject) => {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipURI && mediaObj) {\n sipcall.createOffer({\n media: mediaObj,\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('ebRTC error...', error)\n // @ts-ignore\n Janus.error('WebRTC error call on createOffer: ', error)\n reject(false)\n },\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":["_a","store","getState","webrtc","sipcall","jsepGlobal","createAnswer","jsep","media","audio","videoSend","videoRecv","success","send","message","request","error","Janus","code","sipURI","mediaObj","Promise","resolve","reject","createOffer","debug","uri","handleRemoteJsep","hangup","muteAudio","isAudioMuted","err","console","sipExten","sipSecret","sipHost","sipPort","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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"}
|