@nethesis/phone-island 0.7.113 → 0.7.115
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/CallView/Actions.js +1 -1
- package/dist/components/CallView/Actions.js.map +1 -1
- package/dist/components/CallView/Avatar.js +1 -1
- package/dist/components/CallView/Avatar.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/lib/webrtc/messages.d.ts +1 -0
- 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"),n=require("./components/Island.js"),o=require("./components/RestAPI.js"),a=require("./utils/customHooks/useEventListener.js");require("./node_modules/react-redux/es/index.js");var u=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var i=require("./node_modules/js-base64/base64.mjs.js"),d=require("./workers/wake_up.js"),l=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var c=require("./node_modules/react-redux/es/components/Provider.js");function
|
|
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"),n=require("./components/Island.js"),o=require("./components/RestAPI.js"),a=require("./utils/customHooks/useEventListener.js");require("./node_modules/react-redux/es/index.js");var u=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var i=require("./node_modules/js-base64/base64.mjs.js"),d=require("./workers/wake_up.js"),l=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var c=require("./lib/webrtc/messages.js"),m=require("./node_modules/react-redux/es/components/Provider.js");function f(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 p=f(e),j=function(f){var j=f.dataConfig,q=f.showAlways,h=void 0!==q&&q,v=i.Base64.atob(j||"").split(":"),E=v[0],_=v[1],b=v[2],x=v[3],k=v[4],w=v[5],S=v[6],I=e.useState(!1),P=I[0],y=I[1],C=e.useState(!1),L=C[0],g=C[1],A=e.useState(!1),N=A[0],R=A[1];e.useEffect((function(){var e=new Worker(d.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&y(!0)},function(){e.terminate()}}),[]),e.useEffect((function(){N&&L&&(y(!1),g(!1),R(!1))}),[N,L]),a.useEventListener("phone-island-listen-call",(function(e){u.store.dispatch.listen.setUpdateListenStatus(!0,e.to)})),a.useEventListener("phone-island-intrude-call",(function(e){u.store.dispatch.listen.setUpdateIntrudeStatus(!0,e.to)})),a.useEventListener("phone-island-detach",(function(){c.detach()}));var T=e.useState(!0),H=T[0],W=T[1];return e.useEffect((function(){H&&(l.loadI18n(),W(!1))}),[H]),p.default.createElement(p.default.Fragment,null,p.default.createElement(m.default,{store:u.store},p.default.createElement(r.WebRTC,{hostName:E,sipExten:x,sipSecret:k,sipHost:w,sipPort:S,reload:P,reloadedCallback:function(){return g(!0)}},p.default.createElement(o.RestAPI,{hostName:E,username:_,authToken:b},p.default.createElement(s.Socket,{hostName:E,username:_,authToken:b,reload:P,reloadedCallback:function(){return R(!0)}},p.default.createElement(t.Events,{sipHost:w},p.default.createElement(n.Island,{showAlways:h})))))))};j.displayName="PhoneIsland",exports.PhoneIsland=j;
|
|
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, useState, useEffect } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\nimport wakeUpWorker from './workers/wake_up'\nimport loadI18n from './lib/i18n'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener } from './utils'\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 // Initialize the state to manage the reload events\n const [reload, setReload] = useState<boolean>(false)\n const [reloadedWebRTC, setReloadedWebRTC] = useState<boolean>(false)\n const [reloadedSocket, setReloadedSocket] = useState<boolean>(false)\n\n useEffect(() => {\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n // Handle wakeup message\n if (event.data === 'wakeup') {\n setReload(true)\n }\n }\n\n return () => {\n worker.terminate()\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n useEventListener('phone-island-listen-call', (data: any) => {\n store.dispatch.listen.setUpdateListenStatus(true, data.to)\n })\n\n useEventListener('phone-island-intrude-call', (data: any) => {\n store.dispatch.listen.setUpdateIntrudeStatus(true, data.to)\n })\n\n const [firstRenderI18n, setFirstRenderI18n] = useState(true)\n //initialize i18n\n useEffect(() => {\n if (firstRenderI18n) {\n loadI18n()\n setFirstRenderI18n(false)\n }\n }, [firstRenderI18n])\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 reload={reload}\n reloadedCallback={() => setReloadedWebRTC(true)}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket\n hostName={HOST_NAME}\n username={USERNAME}\n authToken={AUTH_TOKEN}\n reload={reload}\n reloadedCallback={() => setReloadedSocket(true)}\n >\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","_c","useState","reload","setReload","_d","reloadedWebRTC","setReloadedWebRTC","_e","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","listen","setUpdateListenStatus","to","setUpdateIntrudeStatus","_f","firstRenderI18n","setFirstRenderI18n","loadI18n","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"
|
|
1
|
+
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\nimport wakeUpWorker from './workers/wake_up'\nimport loadI18n from './lib/i18n'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener } from './utils'\nimport { detach } from './lib/webrtc/messages'\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 // Initialize the state to manage the reload events\n const [reload, setReload] = useState<boolean>(false)\n const [reloadedWebRTC, setReloadedWebRTC] = useState<boolean>(false)\n const [reloadedSocket, setReloadedSocket] = useState<boolean>(false)\n\n useEffect(() => {\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n // Handle wakeup message\n if (event.data === 'wakeup') {\n setReload(true)\n }\n }\n\n return () => {\n worker.terminate()\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n useEventListener('phone-island-listen-call', (data: any) => {\n store.dispatch.listen.setUpdateListenStatus(true, data.to)\n })\n\n useEventListener('phone-island-intrude-call', (data: any) => {\n store.dispatch.listen.setUpdateIntrudeStatus(true, data.to)\n })\n\n useEventListener('phone-island-detach', () => {\n detach()\n })\n\n const [firstRenderI18n, setFirstRenderI18n] = useState(true)\n //initialize i18n\n useEffect(() => {\n if (firstRenderI18n) {\n loadI18n()\n setFirstRenderI18n(false)\n }\n }, [firstRenderI18n])\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 reload={reload}\n reloadedCallback={() => setReloadedWebRTC(true)}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket\n hostName={HOST_NAME}\n username={USERNAME}\n authToken={AUTH_TOKEN}\n reload={reload}\n reloadedCallback={() => setReloadedSocket(true)}\n >\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","_c","useState","reload","setReload","_d","reloadedWebRTC","setReloadedWebRTC","_e","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","listen","setUpdateListenStatus","to","setUpdateIntrudeStatus","detach","_f","firstRenderI18n","setFirstRenderI18n","loadI18n","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"gnCAiBaA,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,GAG1BW,EAAsBC,EAAAA,UAAkB,GAAvCC,EAAMF,EAAA,GAAEG,EAASH,EAAA,GAClBI,EAAsCH,EAAAA,UAAkB,GAAvDI,EAAcD,EAAA,GAAEE,EAAiBF,EAAA,GAClCG,EAAsCN,EAAAA,UAAkB,GAAvDO,EAAcD,EAAA,GAAEE,EAAiBF,EAAA,GAExCG,EAAAA,WAAU,WACR,IAAMC,EAAS,IAAIC,OAAOC,EAAAA,QAAc,CAAEC,KAAM,WAQhD,OAPAH,EAAOI,UAAY,SAACC,GAEC,WAAfA,EAAMC,MACRd,GAAU,EAEd,EAEO,WACLQ,EAAOO,WACT,CACD,GAAE,IAEHR,EAAAA,WAAU,WACJF,GAAkBH,IACpBF,GAAU,GACVG,GAAkB,GAClBG,GAAkB,GAEtB,GAAG,CAACD,EAAgBH,IAEpBc,mBAAiB,4BAA4B,SAACF,GAC5CG,EAAKA,MAACC,SAASC,OAAOC,uBAAsB,EAAMN,EAAKO,GACzD,IAEAL,mBAAiB,6BAA6B,SAACF,GAC7CG,EAAKA,MAACC,SAASC,OAAOG,wBAAuB,EAAMR,EAAKO,GAC1D,IAEAL,EAAgBA,iBAAC,uBAAuB,WACtCO,EAAAA,QACF,IAEM,IAAAC,EAAwC1B,EAAAA,UAAS,GAAhD2B,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GAS1C,OAPAjB,EAAAA,WAAU,WACJkB,IACFE,EAAAA,WACAD,GAAmB,GAEvB,GAAG,CAACD,IAGFG,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAACE,EAAAA,QAAQ,CAACd,MAAOA,EAAAA,OACfW,UAAAC,cAACG,EAAMA,OAAA,CACLC,SAAU3C,EACV4C,SAAUzC,EACV0C,UAAWzC,EACX0C,QAASzC,EACT0C,QAASzC,EACTG,OAAQA,EACRuC,iBAAkB,WAAM,OAAAnC,GAAkB,KAE1CyB,UAAAC,cAACU,EAAOA,QAAA,CAACN,SAAU3C,EAAWkD,SAAUjD,EAAUkD,UAAWjD,GAC3DoC,EAAC,QAAAC,cAAAa,SACC,CAAAT,SAAU3C,EACVkD,SAAUjD,EACVkD,UAAWjD,EACXO,OAAQA,EACRuC,iBAAkB,WAAM,OAAAhC,GAAkB,KAE1CsB,EAAAA,QAAAC,cAACc,EAAAA,OAAM,CAACP,QAASzC,GACfiC,UAAAC,cAACe,EAAMA,OAAA,CAAC3D,WAAYA,SAQpC,EAEAJ,EAAYgE,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),n=require("../../lib/phone/call.js"),o=require("../../utils/customHooks/useEventListener.js"),r=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/react-redux/es/index.js");var a=require("../../store/index.js");require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js");var i=require("../../lib/webrtc/messages.js");require("../../node_modules/mic-check/lib/index.js");var l=require("../../static/outgoing_ringtone.js");require("../Island.js");var s=require("../Button.js"),u=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),c=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules/framer-motion/dist/framer-motion.js");var d=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),p=require("../TransferView/TransferActions.js"),m=require("../../node_modules/react-tooltip/dist/react-tooltip.min.cjs.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var f=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var j=require("../../node_modules/react-redux/es/hooks/useSelector.js"),v=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function x(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var q=x(t);exports.default=function(){var t=j.useSelector((function(e){return e.currentCall})),x=t.paused,_=t.muted,g=j.useSelector((function(e){return e.currentCall.parked})),E=j.useSelector((function(e){return e.island})),h=E.view,y=E.actionsExpanded,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),n=require("../../lib/phone/call.js"),o=require("../../utils/customHooks/useEventListener.js"),r=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/react-redux/es/index.js");var a=require("../../store/index.js");require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js");var i=require("../../lib/webrtc/messages.js");require("../../node_modules/mic-check/lib/index.js");var l=require("../../static/outgoing_ringtone.js");require("../Island.js");var s=require("../Button.js"),u=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),c=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules/framer-motion/dist/framer-motion.js");var d=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),p=require("../TransferView/TransferActions.js"),m=require("../../node_modules/react-tooltip/dist/react-tooltip.min.cjs.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var f=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var j=require("../../node_modules/react-redux/es/hooks/useSelector.js"),v=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function x(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var q=x(t);exports.default=function(){var t=j.useSelector((function(e){return e.currentCall})),x=t.paused,_=t.muted,g=j.useSelector((function(e){return e.currentCall.parked})),E=j.useSelector((function(e){return e.island})),h=E.view,y=E.actionsExpanded,w=j.useSelector((function(e){return e.currentCall.transferring})),C=v.useDispatch();o.useEventListener("phone-island-transfer-call",(function(t){!function(t){e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,n.attendedTransfer(t)];case 1:return e.sent()&&(C.currentCall.updateCurrentCall({transferring:!0,paused:!1}),C.player.playRemoteAudio()),[2]}}))}))}(t.to)}));var b=f.useTranslation().t;return q.default.createElement(q.default.Fragment,null,q.default.createElement("div",{className:"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},q.default.createElement(s.Button,{variant:"default",active:!!x,onClick:function(){return x?n.unpauseCurrentCall():n.pauseCurrentCall()},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(b(x?"Tooltip.Play":"Tooltip.Pause"))},x?q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faPlay}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faPause})),q.default.createElement(s.Button,{variant:"default",active:!!_,onClick:function(){return _?n.unmuteCurrentCall():n.muteCurrentCall()},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(b(_?"Tooltip.Unmute":"Tooltip.Mute"))},_?q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faMicrophoneSlash}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faMicrophone})),q.default.createElement(s.Button,{active:w,onClick:w?function(){i.sendDTMF("*"),a.store.getState().player.audioPlayerPlaying||C.player.updateStartAudioPlayer({src:l.default,loop:!0}),setTimeout((function(){i.sendDTMF("1"),C.player.stopAudioPlayer(),w&&setTimeout((function(){C.currentCall.updateTransferring(!1)}),500)}),500)}:function(){C.island.setIslandView("transfer"!==h?"transfer":"call")},variant:"default","data-tooltip-id":"tooltip","data-tooltip-content":"".concat(b(w?"Tooltip.Cancel transfer":"Tooltip.Transfer"))},w?q.default.createElement(u.FontAwesomeIcon,{className:"",size:"xl",icon:c.faArrowDownUpAcrossLine}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",className:"pi-rotate-90",icon:c.faArrowRightArrowLeft})),q.default.createElement(s.Button,{active:y,variant:"transparent",onClick:function(){y?C.island.toggleActionsExpanded(!1):C.island.toggleActionsExpanded(!0)},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(b(y?"Tooltip.Collapse":"Tooltip.Expand"))},y?q.default.createElement(u.FontAwesomeIcon,{className:"",size:"xl",icon:c.faChevronUp}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faChevronDown}))),y?q.default.createElement(q.default.Fragment,null," ",q.default.createElement("div",{className:"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},q.default.createElement(s.Button,{active:"keypad"===h,variant:"default",onClick:function(){C.island.setIslandView("keypad"!==h?"keypad":"call")},"data-tooltip-id":"tooltip","data-tooltip-content":b("Tooltip.Keyboard")},q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:d.faGridRound})),q.default.createElement(s.Button,{active:g,variant:"default",onClick:function(){n.park(),C.currentCall.setParked(!0),r.eventDispatch("phone-island-call-parked",{})},"data-tooltip-id":"tooltip","data-tooltip-content":b("Tooltip.Park")},q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faSquareParking})),w&&q.default.createElement(p.TransferActions,null))):q.default.createElement(q.default.Fragment,null),q.default.createElement(m.Tooltip,{className:"pi-z-20",id:"tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n attendedTransfer,\n} from '../../lib/phone/call'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faMicrophone,\n faMicrophoneSlash,\n faArrowDownUpAcrossLine,\n faSquareParking,\n faChevronDown,\n faChevronUp,\n faArrowRightArrowLeft,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faGridRound } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store } from '../../store'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { TransferActions } from '../TransferView'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { park } from '../../lib/phone/call'\nimport { eventDispatch, useEventListener } from '../../utils'\nimport { useTranslation } from 'react-i18next'\n\nconst Actions: FC = () => {\n // Get multiple values from currentCall store\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n const parked = useSelector((state: RootState) => state.currentCall.parked)\n\n // Get isOpen and view from island store\n const { view, actionsExpanded } = useSelector((state: RootState) => state.island)\n const transferring = useSelector((state: RootState) => state.currentCall.transferring)\n\n const dispatch = useDispatch<Dispatch>()\n\n function openKeypad() {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n }\n\n function transfer() {\n // Open the transfer view\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n // Pause the call\n pauseCurrentCall()\n }\n\n // Cancels the current transfer through dtmfs\n function calcelTransfer() {\n sendDTMF('*')\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n setTimeout(() => {\n sendDTMF('1')\n dispatch.player.stopAudioPlayer()\n // The workarround to disable transfer because of the wrong conv.connection value from ws\n if (transferring) {\n setTimeout(() => {\n dispatch.currentCall.updateTransferring(false)\n }, 500)\n }\n }, 500)\n }\n\n function toggleActionsExpanded() {\n if (actionsExpanded) {\n dispatch.island.toggleActionsExpanded(false)\n } else {\n dispatch.island.toggleActionsExpanded(true)\n }\n }\n\n function parkAction() {\n park()\n dispatch.currentCall.setParked(true)\n eventDispatch('phone-island-call-parked', {})\n }\n\n /**\n * Event listner for phone-island-transfer-call event\n */\n useEventListener('phone-island-transfer-call', (data) => {\n const transferNumber = data.to\n handleAttendedTransfer(transferNumber)\n })\n\n async function handleAttendedTransfer(number: string) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n // Play the remote audio element\n dispatch.player.playRemoteAudio()\n }\n }\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n variant='default'\n active={paused ? true : false}\n onClick={() => (paused ? unpauseCurrentCall() : pauseCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={paused ? `${t('Tooltip.Play')}` : `${t('Tooltip.Pause')}`}\n >\n {paused ? (\n <FontAwesomeIcon size='xl' icon={faPlay} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faPause} />\n )}\n </Button>\n\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={muted ? `${t('Tooltip.Unmute')}` : `${t('Tooltip.Mute')}`}\n >\n {muted ? (\n <FontAwesomeIcon size='xl' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faMicrophone} />\n )}\n </Button>\n <Button\n active={transferring}\n onClick={transferring ? calcelTransfer : transfer}\n variant='default'\n data-tooltip-id='tooltip'\n data-tooltip-content={\n transferring ? `${t('Tooltip.Cancel transfer')}` : `${t('Tooltip.Transfer')}`\n }\n >\n {transferring ? (\n <FontAwesomeIcon className='' size='xl' icon={faArrowDownUpAcrossLine} />\n ) : (\n <FontAwesomeIcon size='xl' className='pi-rotate-90' icon={faArrowRightArrowLeft} />\n )}\n </Button>\n <Button\n active={actionsExpanded}\n variant='transparent'\n onClick={() => toggleActionsExpanded()}\n data-tooltip-id='tooltip'\n data-tooltip-content={\n actionsExpanded ? `${t('Tooltip.Collapse')}` : `${t('Tooltip.Expand')}`\n }\n >\n {actionsExpanded ? (\n <FontAwesomeIcon className='' size='xl' icon={faChevronUp} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faChevronDown} />\n )}\n </Button>\n </div>\n {/* Actions expanded section */}\n {actionsExpanded ? (\n <>\n {' '}\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n active={view === 'keypad'}\n variant='default'\n onClick={openKeypad}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Keyboard')}\n >\n <FontAwesomeIcon size='xl' icon={faGridRound} />\n </Button>\n <Button\n active={parked}\n variant='default'\n onClick={parkAction}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Park')}\n >\n <FontAwesomeIcon size='xl' icon={faSquareParking} />\n </Button>\n {transferring && <TransferActions />}\n </div>\n </>\n ) : (\n <></>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </>\n )\n}\n\nexport default Actions\n"],"names":["_a","useSelector","state","currentCall","paused","muted","parked","_b","island","view","actionsExpanded","transferring","dispatch","useDispatch","useEventListener","data","number","attendedTransfer","sent","updateCurrentCall","player","playRemoteAudio","handleAttendedTransfer","to","t","useTranslation","React","createElement","Fragment","className","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","concat","FontAwesomeIcon","size","icon","faPlay","faPause","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophone","sendDTMF","store","getState","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","updateTransferring","setIslandView","faArrowDownUpAcrossLine","faArrowRightArrowLeft","toggleActionsExpanded","faChevronUp","faChevronDown","faGridRound","park","setParked","eventDispatch","faSquareParking","TransferActions","Tooltip","id","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n attendedTransfer,\n} from '../../lib/phone/call'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faMicrophone,\n faMicrophoneSlash,\n faArrowDownUpAcrossLine,\n faSquareParking,\n faChevronDown,\n faChevronUp,\n faArrowRightArrowLeft,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faGridRound } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store } from '../../store'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { TransferActions } from '../TransferView'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { park } from '../../lib/phone/call'\nimport { eventDispatch, useEventListener } from '../../utils'\nimport { useTranslation } from 'react-i18next'\n\nconst Actions: FC = () => {\n // Get multiple values from currentCall store\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n const parked = useSelector((state: RootState) => state.currentCall.parked)\n\n // Get isOpen and view from island store\n const { view, actionsExpanded } = useSelector((state: RootState) => state.island)\n const transferring = useSelector((state: RootState) => state.currentCall.transferring)\n\n const dispatch = useDispatch<Dispatch>()\n\n function openKeypad() {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n }\n\n function transfer() {\n // Open the transfer view\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n }\n\n // Cancels the current transfer through dtmfs\n function calcelTransfer() {\n sendDTMF('*')\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n setTimeout(() => {\n sendDTMF('1')\n dispatch.player.stopAudioPlayer()\n // The workarround to disable transfer because of the wrong conv.connection value from ws\n if (transferring) {\n setTimeout(() => {\n dispatch.currentCall.updateTransferring(false)\n }, 500)\n }\n }, 500)\n }\n\n function toggleActionsExpanded() {\n if (actionsExpanded) {\n dispatch.island.toggleActionsExpanded(false)\n } else {\n dispatch.island.toggleActionsExpanded(true)\n }\n }\n\n function parkAction() {\n park()\n dispatch.currentCall.setParked(true)\n eventDispatch('phone-island-call-parked', {})\n }\n\n /**\n * Event listner for phone-island-transfer-call event\n */\n useEventListener('phone-island-transfer-call', (data) => {\n const transferNumber = data.to\n handleAttendedTransfer(transferNumber)\n })\n\n async function handleAttendedTransfer(number: string) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n // Play the remote audio element\n dispatch.player.playRemoteAudio()\n }\n }\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n variant='default'\n active={paused ? true : false}\n onClick={() => (paused ? unpauseCurrentCall() : pauseCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={paused ? `${t('Tooltip.Play')}` : `${t('Tooltip.Pause')}`}\n >\n {paused ? (\n <FontAwesomeIcon size='xl' icon={faPlay} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faPause} />\n )}\n </Button>\n\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={muted ? `${t('Tooltip.Unmute')}` : `${t('Tooltip.Mute')}`}\n >\n {muted ? (\n <FontAwesomeIcon size='xl' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faMicrophone} />\n )}\n </Button>\n <Button\n active={transferring}\n onClick={transferring ? calcelTransfer : transfer}\n variant='default'\n data-tooltip-id='tooltip'\n data-tooltip-content={\n transferring ? `${t('Tooltip.Cancel transfer')}` : `${t('Tooltip.Transfer')}`\n }\n >\n {transferring ? (\n <FontAwesomeIcon className='' size='xl' icon={faArrowDownUpAcrossLine} />\n ) : (\n <FontAwesomeIcon size='xl' className='pi-rotate-90' icon={faArrowRightArrowLeft} />\n )}\n </Button>\n <Button\n active={actionsExpanded}\n variant='transparent'\n onClick={() => toggleActionsExpanded()}\n data-tooltip-id='tooltip'\n data-tooltip-content={\n actionsExpanded ? `${t('Tooltip.Collapse')}` : `${t('Tooltip.Expand')}`\n }\n >\n {actionsExpanded ? (\n <FontAwesomeIcon className='' size='xl' icon={faChevronUp} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faChevronDown} />\n )}\n </Button>\n </div>\n {/* Actions expanded section */}\n {actionsExpanded ? (\n <>\n {' '}\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n active={view === 'keypad'}\n variant='default'\n onClick={openKeypad}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Keyboard')}\n >\n <FontAwesomeIcon size='xl' icon={faGridRound} />\n </Button>\n <Button\n active={parked}\n variant='default'\n onClick={parkAction}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Park')}\n >\n <FontAwesomeIcon size='xl' icon={faSquareParking} />\n </Button>\n {transferring && <TransferActions />}\n </div>\n </>\n ) : (\n <></>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </>\n )\n}\n\nexport default Actions\n"],"names":["_a","useSelector","state","currentCall","paused","muted","parked","_b","island","view","actionsExpanded","transferring","dispatch","useDispatch","useEventListener","data","number","attendedTransfer","sent","updateCurrentCall","player","playRemoteAudio","handleAttendedTransfer","to","t","useTranslation","React","createElement","Fragment","className","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","concat","FontAwesomeIcon","size","icon","faPlay","faPause","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophone","sendDTMF","store","getState","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","updateTransferring","setIslandView","faArrowDownUpAcrossLine","faArrowRightArrowLeft","toggleActionsExpanded","faChevronUp","faChevronDown","faGridRound","park","setParked","eventDispatch","faSquareParking","TransferActions","Tooltip","id","place"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var r=require("../../node_modules/react-redux/es/hooks/useSelector.js"),t=require("../../_virtual/framer-motion.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=n(e),o={open:{width:"48px",height:"48px",borderRadius:"12px"},closed:{width:"24px",height:"24px",borderRadius:"6px"}};exports.default=function(){var e,n,a=r.useSelector((function(e){return e.currentCall})).username,u=r.useSelector((function(e){return e.avatars})).avatars,l=r.useSelector((function(e){return e.island})).isOpen,s=r.useSelector((function(e){return e.currentCall})),d=s.incoming,c=s.outgoing,p=s.accepted,m=s.transferring,v=r.useSelector((function(e){return e.currentCall})),f=r.useSelector((function(e){return e.users}));return i.default.createElement(i.default.Fragment,null,i.default.createElement(t.framerMotion.exports.motion.div,{className:"pi-relative",animate:l?"open":"closed",variants:o},(d||c&&!p)&&i.default.createElement(t.framerMotion.exports.motion.div,{style:{animationDuration:"2s"},animate:l?"open":"closed",variants:o,className:"pi-rounded-xl pi-bg-white pi-absolute pi-opacity-60 pi-top-0 pi-left-0 pi-animate-ping pi-h-12 pi-w-12"}),m?i.default.createElement(t.framerMotion.exports.motion.div,{className:"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-bg-gray-300 pi-rounded-sm pi-bg-cover",style:{backgroundImage:"url(".concat(u&&f&&(null==f?void 0:f.extensions)&&u[null===(e=null==f?void 0:f.extensions[null==v?void 0:v.number])||void 0===e?void 0:e.username]&&u[null===(n=null==f?void 0:f.extensions[null==v?void 0:v.number])||void 0===n?void 0:n.username],")"),backgroundRepeat:"no-repeat",backgroundSize:"contain"},animate:l?"open":"closed",variants:o}):i.default.createElement(t.framerMotion.exports.motion.div,{className:"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-bg-gray-300 pi-rounded-sm pi-bg-cover",style:{backgroundImage:"url(".concat(u&&u[a]&&u[a],")"),backgroundRepeat:"no-repeat",backgroundSize:"contain"},animate:l?"open":"closed",variants:o})))};
|
|
2
2
|
//# sourceMappingURL=Avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../../src/components/CallView/Avatar.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\nconst iconVariants = {\n open: {\n width: '48px',\n height: '48px',\n borderRadius: '12px',\n },\n closed: {\n width: '24px',\n height: '24px',\n borderRadius: '6px',\n },\n}\n\nconst Avatar: FC = () => {\n // Get multiple values from currentCall store\n const { username } = useSelector((state: RootState) => state.currentCall)\n\n // Get avatars from avatars store\n const { avatars } = useSelector((state: RootState) => state.avatars)\n\n // Get isOpen from island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Get multiple values from currentCall store\n const { incoming, outgoing, accepted } = useSelector((state: RootState) => state.currentCall)\n\n return (\n <>\n <motion.div\n className='pi-relative'\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n >\n {(incoming || (outgoing && !accepted)) && (\n // The background pulse effect\n <motion.div\n style={{\n animationDuration: '2s'
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/CallView/Avatar.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\nconst iconVariants = {\n open: {\n width: '48px',\n height: '48px',\n borderRadius: '12px',\n },\n closed: {\n width: '24px',\n height: '24px',\n borderRadius: '6px',\n },\n}\n\nconst Avatar: FC = () => {\n // Get multiple values from currentCall store\n const { username } = useSelector((state: RootState) => state.currentCall)\n\n // Get avatars from avatars store\n const { avatars } = useSelector((state: RootState) => state.avatars)\n\n // Get isOpen from island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Get multiple values from currentCall store\n const { incoming, outgoing, accepted, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n const currentCallDetails: any = useSelector((state: RootState) => state.currentCall)\n const user = useSelector((state: RootState) => state.users)\n\n return (\n <>\n <motion.div\n className='pi-relative'\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n >\n {(incoming || (outgoing && !accepted)) && (\n // The background pulse effect\n <motion.div\n style={{\n animationDuration: '2s',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n className={`pi-rounded-xl pi-bg-white pi-absolute pi-opacity-60 pi-top-0 pi-left-0 pi-animate-ping pi-h-12 pi-w-12`}\n ></motion.div>\n )}\n {!transferring ? (\n <motion.div\n className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-bg-gray-300 pi-rounded-sm pi-bg-cover'\n style={{\n backgroundImage: `url(${avatars && avatars[username] && avatars[username]})`,\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'contain',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n />\n ) : (\n <motion.div\n className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-bg-gray-300 pi-rounded-sm pi-bg-cover'\n style={{\n backgroundImage: `url(${\n avatars &&\n user &&\n user?.extensions &&\n avatars[user?.extensions[currentCallDetails?.number]?.username] &&\n avatars[user?.extensions[currentCallDetails?.number]?.username]\n })`,\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'contain',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n />\n )}\n </motion.div>\n </>\n )\n}\n\nexport default Avatar\n"],"names":["iconVariants","open","width","height","borderRadius","closed","username","useSelector","state","currentCall","avatars","isOpen","island","_c","incoming","outgoing","accepted","transferring","currentCallDetails","user","users","React","createElement","Fragment","motion","div","className","animate","variants","style","animationDuration","backgroundImage","extensions","number","_a","_b","backgroundRepeat","backgroundSize","concat"],"mappings":"2ZAQMA,EAAe,CACnBC,KAAM,CACJC,MAAO,OACPC,OAAQ,OACRC,aAAc,QAEhBC,OAAQ,CACNH,MAAO,OACPC,OAAQ,OACRC,aAAc,wBAIC,mBAETE,EAAaC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,wBAGrDC,EAAYH,eAAY,SAACC,GAAqB,OAAAA,EAAME,mBAGpDC,EAAWJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,iBAGrDC,EAAiDN,eACrD,SAACC,GAAqB,OAAAA,EAAMC,eADtBK,EAAQD,EAAAC,SAAEC,EAAQF,EAAAE,SAAEC,EAAQH,EAAAG,SAAEC,EAAYJ,EAAAI,aAG5CC,EAA0BX,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMC,WAAN,IAC5DU,EAAOZ,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMY,KAAN,IAE/C,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAACC,cAAAE,EAAAA,aAAAA,QAAAA,OAAOC,IAAG,CACTC,UAAU,cACVC,QAAShB,EAAS,OAAS,SAC3BiB,SAAU5B,IAERc,GAAaC,IAAaC,IAE1BK,EAAAA,QAAAC,cAACE,EAAAA,aAAAA,QAAAA,OAAOC,IAAG,CACTI,MAAO,CACLC,kBAAmB,MAErBH,QAAShB,EAAS,OAAS,SAC3BiB,SAAU5B,EACV0B,UAAW,2GAGbT,EAYAI,EAAAA,sBAACG,EAAAA,aAAAA,QAAAA,OAAOC,IAAG,CACTC,UAAU,+EACVG,MAAO,CACLE,gBAAiB,cACfrB,GACAS,IACAA,aAAI,EAAJA,EAAMa,aACNtB,EAAoD,UAA5CS,aAAA,EAAAA,EAAMa,WAAWd,eAAAA,EAAoBe,eAAO,IAAAC,OAAA,EAAAA,EAAE5B,WACtDI,EAAoD,UAA5CS,aAAA,EAAAA,EAAMa,WAAWd,eAAAA,EAAoBe,eAAO,IAAAE,OAAA,EAAAA,EAAE7B,UACrD,KACH8B,iBAAkB,YAClBC,eAAgB,WAElBV,QAAShB,EAAS,OAAS,SAC3BiB,SAAU5B,IAzBZqB,EAAC,QAAAC,cAAAE,EAAAA,aAAAA,QAAAA,OAAOC,KACNC,UAAU,+EACVG,MAAO,CACLE,gBAAiB,OAAAO,OAAO5B,GAAWA,EAAQJ,IAAaI,EAAQJ,GAAY,KAC5E8B,iBAAkB,YAClBC,eAAgB,WAElBV,QAAShB,EAAS,OAAS,SAC3BiB,SAAU5B,KAuBtB"}
|
|
@@ -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 r=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),t=require("../lib/webrtc/janus.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),t=require("../lib/webrtc/janus.js"),n=require("../lib/webrtc/messages.js"),a=require("../store/index.js"),c=require("../lib/devices/devices.js"),o=require("../lib/phone/call.js"),s=require("../lib/webrtc/connection.js"),u=require("../static/outgoing_ringtone.js"),i=require("../utils/customHooks/useEventListener.js"),l=require("../node_modules/react-redux/es/hooks/useDispatch.js");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=d(e);exports.WebRTC=function(d){var p=d.hostName,b=d.sipExten,f=d.sipSecret,m=d.children,w=d.sipHost,h=d.sipPort,v=d.reload,y=d.reloadedCallback,S=l.useDispatch(),k=e.useRef(null),T=e.useRef(t.default),C=e.useCallback((function(){T.current.init({debug:"all",dependencies:T.current.useDefaultDependencies({adapter:r.default}),callback:function(){var e=new T.current({server:"https://".concat(p,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(S.webrtc.updateWebRTC({sipcall:e}),n.register({sipExten:b,sipSecret:f,sipHost:w,sipPort:h}),e&&T.current.log&&T.current.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){T.current.error&&(T.current.error(" -- Error attaching plugin..."),T.current.error(e))},consentDialog:function(e){T.current.log&&T.current.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){T.current.log&&T.current.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){a.store.getState().webrtc.sipcall&&T.current.log&&T.current.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,r){T.current.log&&T.current.log("Janus "+(r?"started":"stopped")+" receiving our "+e)},slowLink:function(e,r){e?T.current.warn&&T.current.warn("SLOW link: several missing packets from janus (".concat(r,")")):T.current.warn&&T.current.warn("SLOW link: janus is not receiving all your packets (".concat(r,")"))},onmessage:function(e,r){var t=a.store.getState().webrtc.sipcall;T.current.debug&&(T.current.debug(" ::: Got a message :::"),T.current.debug(JSON.stringify(e)));var c=e.error;if(null==c||null==c){var s=e.result;if(null!=s&&void 0!==s.event&&null!==s.event){var i=s.event,l=a.store.getState().recorder.recording;switch(i){case"registration_failed":T.current.error&&T.current.error("Registration failed: "+s.code+" "+s.reason);break;case"unregistered":T.current.log&&T.current.log("Successfully un-registered as "+s.username+"!");break;case"registered":T.current.log&&T.current.log("Successfully registered as "+s.username+"!"),a.store.getState().webrtc.registered||a.store.dispatch.webrtc.updateWebRTC({registered:!0}),S.alerts.removeAlert("webrtc_down"),S.webrtc.updateLastActivity((new Date).getTime());break;case"registering":T.current.log&&T.current.log("janus registering");break;case"calling":S.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),S.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":a.store.getState().player.audioPlayerPlaying||S.player.updateStartAudioPlayer({src:u.default,loop:!0}),S.webrtc.updateLastActivity((new Date).getTime());break;case"progress":T.current.log&&T.current.log("There's early media from "+s.username+", wairing for the call!"),r&&n.handleRemote(r),S.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":S.webrtc.updateWebRTC({jsepGlobal:r}),l?S.recorder.setIncoming(!0):(S.currentCall.checkIncomingUpdatePlay({incomingWebRTC:!0}),T.current.log&&T.current.log("Incoming call from "+s.username+"!")),S.webrtc.updateLastActivity((new Date).getTime());break;case"accepted":T.current.log&&T.current.log(s.username+" accepted the call!"),r&&n.handleRemote(r),S.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),S.currentCall.updateCurrentCall({incoming:!1,incomingWebRTC:!1}),a.store.dispatch.player.stopAudioPlayer(),S.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":l&&S.recorder.setRecording(!1),o.hangupCurrentCall(),t.hangup(),a.store.dispatch.player.stopAudioPlayer(),T.current.log&&T.current.log("Call hung up ("+s.code+" "+s.reason+")!"),S.webrtc.updateLastActivity((new Date).getTime());break;case"gateway_down":console.warn("THE GATEWAY IS DOWN")}}}else a.store.getState().webrtc.registered?(t&&t.hangup(),a.store.dispatch.player.stopAudioPlayer()):T.current.log&&T.current.log("User is not registered")},onlocalstream:function(e){T.current.debug&&(T.current.debug(" ::: Got a local stream :::"),T.current.debug(e));var r=a.store.getState().player.localVideo,t=e.getAudioTracks(),n=e.getVideoTracks();if(T.current.attachMediaStream){if(t&&t.length>0){var c=new MediaStream(t);a.store.dispatch.webrtc.updateLocalAudioStream(c)}else console.warn("No audio tracks on local stream");if(n&&n.length>0){var o=new MediaStream(n);r&&r.current&&T.current.attachMediaStream(r.current,o)}else console.warn("No video tracks on local stream")}},onremotestream:function(e){T.current.debug&&T.current.debug(" ::: Got a remote stream :::"),a.store.dispatch.player.stopAudioPlayer();var r=a.store.getState().player.remoteAudio,t=a.store.getState().player.remoteVideo,n=e.getAudioTracks(),c=e.getVideoTracks();if(T.current.attachMediaStream){if(n&&n.length>0){var o=new MediaStream(n);r&&r.current&&T.current.attachMediaStream(r.current,o),a.store.dispatch.webrtc.updateRemoteAudioStream(o)}else console.warn("No audio tracks on remote stream");if(c&&c.length>0){var s=new MediaStream(c);t&&t.current&&T.current.attachMediaStream(t.current,s)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){T.current.log&&T.current.log(" ::: janus Got a cleanup notification :::")},detached:function(){T.current.warn&&T.current.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){T.current.log&&T.current.log("error",e),S.alerts.setAlert("webrtc_down")},destroyed:function(){S.webrtc.updateWebRTC({destroyed:!0}),S.alerts.setAlert("webrtc_down")}})}})}),[T.current]);return e.useEffect((function(){c.checkMediaPermissions()}),[]),e.useEffect((function(){var e;return C(),e=a.store.getState().webrtc.CHECK_INTERVAL_TIME,k.current||(k.current=setInterval((function(){return s.webrtcCheck((function(){n.register({sipExten:b,sipSecret:f,sipHost:w,sipPort:h})}))}),e)),function(){n.unregister(),clearInterval(k.current)}}),[]),e.useEffect((function(){if(v){n.unregister();var e=a.store.getState().webrtc.sipcall;e&&e.detach(),T.current.destroy&&T.current.destroy(),setTimeout((function(){C(),y&&y()}),1e4)}}),[v]),i.useEventListener("phone-island-attach",(function(){C()})),g.default.createElement(g.default.Fragment,null,m)};
|
|
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, useRef, useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { 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 reload: boolean\n reloadedCallback?: () => void\n}\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n reload,\n reloadedCallback,\n}) => {\n // Initialize store dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // Initialize Janus from Janus library\n const janus = useRef<JanusTypes>(JanusLib)\n\n // Initializes the webrtc connection and handlers\n const initWebRTC = useCallback(() => {\n janus.current.init({\n debug: 'all',\n dependencies: janus.current.useDefaultDependencies({\n adapter,\n }),\n callback: function () {\n const janusInstance = new janus.current({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (janus.current.log)\n janus.current.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (janus.current.error) {\n janus.current.error(' -- Error attaching plugin...')\n janus.current.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (janus.current.log) janus.current.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (janus.current.log)\n janus.current.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (janus.current.warn)\n janus.current.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (janus.current.warn)\n janus.current.warn(\n `SLOW link: janus is not receiving all your packets (${count})`,\n )\n }\n },\n onmessage: function (msg, jsep) {\n // Get webrtc state\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a message :::')\n janus.current.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (janus.current.log) janus.current.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // Get event data\n var event = result['event']\n // Get the recording state\n const { recording } = store.getState().recorder\n\n // Manage different types of events\n switch (event) {\n case 'registration_failed':\n if (janus.current.error)\n janus.current.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully un-registered as ' + result['username'] + '!',\n )\n break\n\n case 'registered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully registered as ' + result['username'] + '!',\n )\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Remove WebRTC connections alert if any\n dispatch.alerts.removeAlert('webrtc_down')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (janus.current.log) {\n janus.current.log('janus registering')\n }\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log) {\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n // Update webrtc state\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n // Check if is recording an audio through call\n // ...recording an audio is a request made by the user\n // ...it must be managed differently than an incoming call\n if (recording) {\n // Update the recorder state\n dispatch.recorder.setIncoming(true)\n } else {\n // Manage the incoming message as a webrtc call\n // Update incoming webrtc state, number and display name\n // ...are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log) {\n janus.current.log('Incoming call from ' + result['username'] + '!')\n }\n }\n\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (janus.current.log) {\n janus.current.log(result['username'] + ' accepted the call!')\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // 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 // Manage hangup message during recording\n if (recording) {\n dispatch.recorder.setRecording(false)\n }\n\n hangupCurrentCall()\n sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Check the janus doc before enable the following\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (janus.current.log)\n janus.current.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n case 'gateway_down':\n console.warn('THE GATEWAY IS DOWN')\n\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a local stream :::')\n janus.current.debug(stream)\n }\n\n // Get local video element\n const localVideoElement = store.getState().player.localVideo\n\n // Get audio and video tracks from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for local audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateLocalAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on local stream')\n }\n // Initialize the new media stream for local video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (localVideoElement && localVideoElement.current) {\n janus.current.attachMediaStream(localVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on local stream')\n }\n }\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n if (remoteAudioElement && remoteAudioElement.current) {\n janus.current.attachMediaStream(remoteAudioElement.current, audioStream)\n }\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (remoteVideoElement && remoteVideoElement.current) {\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (janus.current.log) {\n janus.current.log(' ::: janus Got a cleanup notification :::')\n }\n },\n detached: function () {\n if (janus.current.warn) {\n janus.current.warn('SIP plugin handle detached from the plugin itself')\n }\n },\n })\n }\n },\n error: (err: any) => {\n if (janus.current.log) janus.current.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }, [janus.current])\n\n // Check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n // Manage webrtc connections and events\n useEffect(() => {\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n // Unregister the WebRTC extension\n unregister()\n // Detach sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) sipcall.detach()\n // Destroy Janus session\n if (janus.current.destroy) janus.current.destroy()\n // Initialize a new Janus session\n setTimeout(() => {\n initWebRTC()\n // Execute the reloaded callback\n if (reloadedCallback) reloadedCallback()\n }, 10000)\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","reload","reloadedCallback","dispatch","useDispatch","janusCheckInterval","useRef","janus","JanusLib","initWebRTC","useCallback","current","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","event","recording","recorder","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","setIncoming","checkIncomingUpdatePlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","stopAudioPlayer","setRecording","hangupCurrentCall","hangup","console","onlocalstream","stream","localVideoElement","localVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateLocalAudioStream","videoStream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","updateRemoteAudioStream","oncleanup","detached","err","setAlert","destroyed","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","setInterval","webrtcCheck","unregister","clearInterval","detach","destroy","setTimeout","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, useRef, useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\nimport { useEventListener } from '../utils'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n reload: boolean\n reloadedCallback?: () => void\n}\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n reload,\n reloadedCallback,\n}) => {\n // Initialize store dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // Initialize Janus from Janus library\n const janus = useRef<JanusTypes>(JanusLib)\n\n // Initializes the webrtc connection and handlers\n const initWebRTC = useCallback(() => {\n janus.current.init({\n debug: 'all',\n dependencies: janus.current.useDefaultDependencies({\n adapter,\n }),\n callback: function () {\n const janusInstance = new janus.current({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (janus.current.log)\n janus.current.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (janus.current.error) {\n janus.current.error(' -- Error attaching plugin...')\n janus.current.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (janus.current.log) janus.current.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (janus.current.log)\n janus.current.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (janus.current.warn)\n janus.current.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (janus.current.warn)\n janus.current.warn(\n `SLOW link: janus is not receiving all your packets (${count})`,\n )\n }\n },\n onmessage: function (msg, jsep) {\n // Get webrtc state\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a message :::')\n janus.current.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (janus.current.log) janus.current.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // Get event data\n var event = result['event']\n // Get the recording state\n const { recording } = store.getState().recorder\n\n // Manage different types of events\n switch (event) {\n case 'registration_failed':\n if (janus.current.error)\n janus.current.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully un-registered as ' + result['username'] + '!',\n )\n break\n\n case 'registered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully registered as ' + result['username'] + '!',\n )\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Remove WebRTC connections alert if any\n dispatch.alerts.removeAlert('webrtc_down')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (janus.current.log) {\n janus.current.log('janus registering')\n }\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log) {\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n // Update webrtc state\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n // Check if is recording an audio through call\n // ...recording an audio is a request made by the user\n // ...it must be managed differently than an incoming call\n if (recording) {\n // Update the recorder state\n dispatch.recorder.setIncoming(true)\n } else {\n // Manage the incoming message as a webrtc call\n // Update incoming webrtc state, number and display name\n // ...are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log) {\n janus.current.log('Incoming call from ' + result['username'] + '!')\n }\n }\n\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (janus.current.log) {\n janus.current.log(result['username'] + ' accepted the call!')\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // 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 // Manage hangup message during recording\n if (recording) {\n dispatch.recorder.setRecording(false)\n }\n\n hangupCurrentCall()\n sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Check the janus doc before enable the following\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (janus.current.log)\n janus.current.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n case 'gateway_down':\n console.warn('THE GATEWAY IS DOWN')\n\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a local stream :::')\n janus.current.debug(stream)\n }\n\n // Get local video element\n const localVideoElement = store.getState().player.localVideo\n\n // Get audio and video tracks from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for local audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateLocalAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on local stream')\n }\n // Initialize the new media stream for local video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (localVideoElement && localVideoElement.current) {\n janus.current.attachMediaStream(localVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on local stream')\n }\n }\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n if (remoteAudioElement && remoteAudioElement.current) {\n janus.current.attachMediaStream(remoteAudioElement.current, audioStream)\n }\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (remoteVideoElement && remoteVideoElement.current) {\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (janus.current.log) {\n janus.current.log(' ::: janus Got a cleanup notification :::')\n }\n },\n detached: function () {\n if (janus.current.warn) {\n janus.current.warn('SIP plugin handle detached from the plugin itself')\n }\n },\n })\n }\n },\n error: (err: any) => {\n if (janus.current.log) janus.current.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }, [janus.current])\n\n // Check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n // Manage webrtc connections and events\n useEffect(() => {\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n // Unregister the WebRTC extension\n unregister()\n // Detach sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) sipcall.detach()\n // Destroy Janus session\n if (janus.current.destroy) janus.current.destroy()\n // Initialize a new Janus session\n setTimeout(() => {\n initWebRTC()\n // Execute the reloaded callback\n if (reloadedCallback) reloadedCallback()\n }, 10000)\n }\n }, [reload])\n\n useEventListener('phone-island-attach', () => {\n initWebRTC()\n })\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","reload","reloadedCallback","dispatch","useDispatch","janusCheckInterval","useRef","janus","JanusLib","initWebRTC","useCallback","current","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","event","recording","recorder","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","setIncoming","checkIncomingUpdatePlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","stopAudioPlayer","setRecording","hangupCurrentCall","hangup","console","onlocalstream","stream","localVideoElement","localVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateLocalAudioStream","videoStream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","updateRemoteAudioStream","oncleanup","detached","err","setAlert","destroyed","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","setInterval","webrtcCheck","unregister","clearInterval","detach","destroy","setTimeout","useEventListener","React","createElement","Fragment"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export declare function answerWebRTC(): void;
|
|
|
8
8
|
export declare function decline(): void;
|
|
9
9
|
export declare function hangup(): void;
|
|
10
10
|
export declare function unregister(): void;
|
|
11
|
+
export declare function detach(): any;
|
|
11
12
|
export declare function handleRemote(jsep: any): void;
|
|
12
13
|
/**
|
|
13
14
|
* Starts a call to a sipuri
|
|
@@ -1,2 +1,2 @@
|
|
|
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,a){var n=t.store.getState().webrtc.sipcall;r&&s&&n.createOffer({media:s,success:function(t){e.default.debug("Got SDP!"),e.default.debug(t),n.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),a(!1)}})}))},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,a=e.sipPort,n=t.store.getState().webrtc.sipcall,c=t.store.getState().currentUser.name;n&&n.send({message:{request:"register",username:"sip:".concat(r,"@").concat(o),display_name:c||"",secret:s,proxy:"sip:".concat(o,":").concat(a),outbound_proxy:"sip:".concat(o,":").concat(a),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:"".concat(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"}})};
|
|
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,a){var n=t.store.getState().webrtc.sipcall;r&&s&&n.createOffer({media:s,success:function(t){e.default.debug("Got SDP!"),e.default.debug(t),n.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),a(!1)}})}))},exports.detach=function(){var e=t.store.getState().webrtc.sipcall;if(e)return e.detach()},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,a=e.sipPort,n=t.store.getState().webrtc.sipcall,c=t.store.getState().currentUser.name;n&&n.send({message:{request:"register",username:"sip:".concat(r,"@").concat(o),display_name:c||"",secret:s,proxy:"sip:".concat(o,":").concat(a),outbound_proxy:"sip:".concat(o,":").concat(a),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:"".concat(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({\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":"wOAqCQ,IAAAA,EAA6DC,EAAAA,MAAMC,WAAWC,OAA5EC,EAAOJ,EAAAI,QAAEC,eACbD,GAAWC,GACbD,EAAQE,aAAa,CACnBC,KAAMF,EACNG,MAAO,CACLC,OAAO,EACPC,WAAW,EACXC,WAAW,GAEbC,QAAS,SAACL,GACRH,EAAQS,KAAK,CACXC,QAAS,CACPC,QAAS,UAEXR,KAAMA,GAET,EACDS,MAAO,SAACA,GAENC,EAAAA,QAAMD,MAAM,gBAAiBA,GAC7BZ,EAAQS,KAAK,CACXC,QAAS,CACPC,QAAS,UACTG,KAAM,MAGX,GAGP,
|
|
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 detach() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n return sipcall.detach()\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","detach","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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"}
|