@nethesis/phone-island 0.7.85 → 0.7.86
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/Socket.d.ts +2 -0
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/WebRTC.d.ts +2 -0
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/types/webrtc.d.ts +1 -0
- package/dist/utils/genericFunctions/exposeWorker.d.ts +1 -0
- package/dist/utils/genericFunctions/exposeWorker.js +2 -0
- package/dist/utils/genericFunctions/exposeWorker.js.map +1 -0
- package/dist/workers/wake_up.d.ts +6 -0
- package/dist/workers/wake_up.js +2 -0
- package/dist/workers/wake_up.js.map +1 -0
- 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"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),r=require("./components/Socket.js"),s=require("./components/WebRTC.js"),o=require("./components/Island.js"),n=require("./components/RestAPI.js");require("./node_modules/react-redux/es/index.js");var a=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var u=require("./node_modules/js-base64/base64.mjs.js"),d=require("./workers/wake_up.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var i=require("./node_modules/react-redux/es/components/Provider.js");function l(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 c=l(e),m=function(l){var m=l.dataConfig,f=l.showAlways,p=void 0!==f&&f,j=u.Base64.atob(m||"").split(":"),q=j[0],_=j[1],v=j[2],x=j[3],E=j[4],h=j[5],k=j[6],w=e.useState(!1),b=w[0],P=w[1],y=e.useState(!1),C=y[0],I=y[1],S=e.useState(!1),A=S[0],N=S[1];return e.useEffect((function(){var e=new Worker(d.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&P(!0)},function(){e.terminate()}}),[]),e.useEffect((function(){A&&C&&(P(!1),I(!1),N(!1))}),[A,C]),c.default.createElement(c.default.Fragment,null,c.default.createElement(i.default,{store:a.store},c.default.createElement(s.WebRTC,{hostName:q,sipExten:x,sipSecret:E,sipHost:h,sipPort:k,reload:b,reloadedCallback:function(){return I(!0)}},c.default.createElement(n.RestAPI,{hostName:q,username:_,authToken:v},c.default.createElement(r.Socket,{hostName:q,username:_,authToken:v,reload:b,reloadedCallback:function(){return N(!0)}},c.default.createElement(t.Events,{sipHost:h},c.default.createElement(o.Island,{showAlways:p})))))))};m.displayName="PhoneIsland",exports.PhoneIsland=m;
|
|
2
2
|
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\n\nimport 'react-tooltip/dist/react-tooltip.css'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n return (\n <>\n <Provider store={store}>\n <WebRTC\n hostName={HOST_NAME}\n sipExten={SIP_EXTEN}\n sipSecret={SIP_SECRET}\n sipHost={SIP_HOST}\n sipPort={SIP_PORT}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket
|
|
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'\n\nimport 'react-tooltip/dist/react-tooltip.css'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n // 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 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","React","createElement","Fragment","Provider","store","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"0/BAcaA,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,GAwBxC,OAtBAG,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,IAGlBc,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAACE,EAAAA,QAAQ,CAACC,MAAOA,EAAAA,OACfJ,UAAAC,cAACI,EAAMA,OAAA,CACLC,SAAUhC,EACViC,SAAU9B,EACV+B,UAAW9B,EACX+B,QAAS9B,EACT+B,QAAS9B,EACTG,OAAQA,EACR4B,iBAAkB,WAAM,OAAAxB,GAAkB,KAE1Ca,UAAAC,cAACW,EAAOA,QAAA,CAACN,SAAUhC,EAAWuC,SAAUtC,EAAUuC,UAAWtC,GAC3DwB,EAAC,QAAAC,cAAAc,SACC,CAAAT,SAAUhC,EACVuC,SAAUtC,EACVuC,UAAWtC,EACXO,OAAQA,EACR4B,iBAAkB,WAAM,OAAArB,GAAkB,KAE1CU,EAAAA,QAAAC,cAACe,EAAAA,OAAM,CAACP,QAAS9B,GACfqB,UAAAC,cAACgB,EAAMA,OAAA,CAAChD,WAAYA,SAQpC,EAEAJ,EAAYqD,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var o=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var a=require("../events/SocketEvents.js"),u=require("../utils/genericFunctions/timestamp.js"),s=require("../node_modules/react-redux/es/hooks/useDispatch.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=i(n);exports.Socket=function(i){var d=i.hostName,m=i.username,p=i.authToken,f=i.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var o=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var a=require("../events/SocketEvents.js"),u=require("../utils/genericFunctions/timestamp.js"),s=require("../node_modules/react-redux/es/hooks/useDispatch.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=i(n);exports.Socket=function(i){var d=i.hostName,m=i.username,p=i.authToken,f=i.reload,g=i.reloadedCallback,b=i.children,k=s.useDispatch(),v=n.useRef(),h=n.useRef();return n.useEffect((function(){return h.current=t.io(d,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),h.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(h.current.id))})),h.current.on("disconnect",(function(e){console.log("Socket disconnect - reason: ".concat(e))})),h.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),h.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),h.current.io.on("reconnect",(function(e){console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(h.current.id,")"))})),h.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),h.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),h.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),v.current=setInterval((function(){var e=Date.now();h.current.volatile.emit("ping",c.withTimeout((function(){k.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){k.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),5e3))}),5e3),h.current.on("connect",(function(){console.log("Socket on: "+d+" is connected!"),h.current.emit("login",{accessKeyId:"".concat(m),token:p,uaType:"desktop"})})),h.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),h.current.on("userMainPresenceUpdate",(function(n){o.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),a.dispatchMainPresence(n)})),h.current.on("extenUpdate",(function(e){k.users.updateExtension(e),a.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===m&&(function(e,n){var t=o.store.getState().currentCall,c=t.transferring,a=t.transferSwitching,s=t.transferCalls;if(Object.keys(n).length>0&&e.status){var i=o.store.getState().users.extensions;switch(e.status){case"ringing":k.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""});break;case"busy":if(n&&n.connected)k.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""}),k.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(u.getTimestampInSeconds())});else if(n&&!n.connected&&c&&!a){var l=s.find((function(e){return e.number===n.counterpartNum}));!n.connected&&l&&(k.currentCall.updateCurrentCall({transferring:!1}),k.currentCall.updateTransferSwitching(!1))}n&&!n.connected&&"out"===n.direction&&k.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(i&&i[n.counterpartNum]&&i[n.counterpartNum].username)||""});case"onhold":var d=n.counterpartName,m=n.counterpartNum,p=n.startTime;c&&m&&d&&"<unknown>"!==d&&(k.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:m,startTime:"".concat(u.getTimestampInSeconds())}),k.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:m,startTime:"".concat(p/1e3)}),k.island.setIslandView("call"))}}}(e,n),k.currentUser.updateConversations(e))})),h.current.on("queueUpdate",(function(e){a.dispatchQueueUpdate(e)})),h.current.on("queueMemberUpdate",(function(e){a.dispatchQueueMemberUpdate(e)})),h.current.on("takeOver",(function(){a.dispatchAlreadyLogin()})),function(){clearInterval(v.current),h.current.close()}}),[]),n.useEffect((function(){f&&(console.info("websocket reconnection"),h.current.disconnect(),h.current.connect(),g())}),[f]),l.default.createElement(l.default.Fragment,null,b)};
|
|
2
2
|
//# sourceMappingURL=Socket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n} from '../events'\nimport { store } from '../store'\nimport { withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n\nexport const Socket: FC<SocketProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n // // Manage call transferring\n // if (transferring) {\n // // Prepare the call data for the transfer\n // if (!transferringName && !transferringNumber && !transferringStartTime) {\n // dispatch.currentCall.updateCurrentCall({\n // transferringName: getDisplayName(conv),\n // transferringNumber: `${conv.counterpartNum}`,\n // transferringStartTime: `${conv.startTime / 1000}`,\n // })\n // }\n // }\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n // if (status) {\n // if (res.status == 'online' && userTotallyFree()) {\n // // Stop ringing sounds\n // dispatch.player.stopAudioPlayer()\n // // Reset current call info\n // dispatch.currentCall.reset()\n // }\n // }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io(hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n })\n socket.current.on('disconnect', (reason) => {\n console.log(`Socket disconnect - reason: ${reason}`)\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n console.debug('Socket is unreachable!')\n },\n 2000,\n ),\n )\n }, 5000)\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","children","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useEffect","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","concat","id","reason","log","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","res","store","users","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conv","conversations","Object","keys","getState","currentCall","transferring","transferSwitching","transferCalls","length","status","extensions","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","inTransferCalls","find","item","updateTransferSwitching","direction","checkOutgoingUpdate","outgoingSocket","counterpartName","island","setIslandView","handleCurrentUserEvents","currentUser","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","clearInterval","close","React","createElement","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n} from '../events'\nimport { store } from '../store'\nimport { withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n // if (status) {\n // if (res.status == 'online' && userTotallyFree()) {\n // // Stop ringing sounds\n // dispatch.player.stopAudioPlayer()\n // // Reset current call info\n // dispatch.currentCall.reset()\n // }\n // }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io(hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n })\n socket.current.on('disconnect', (reason) => {\n console.log(`Socket disconnect - reason: ${reason}`)\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n console.debug('Socket is unreachable!')\n },\n 5000,\n ),\n )\n }, 5000)\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useEffect","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","concat","id","reason","log","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","res","store","users","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conv","conversations","Object","keys","getState","currentCall","transferring","transferSwitching","transferCalls","length","status","extensions","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","inTransferCalls","find","item","updateTransferSwitching","direction","checkOutgoingUpdate","outgoingSocket","counterpartName","island","setIslandView","handleCurrentUserEvents","currentUser","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");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/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"),u=require("../lib/phone/call.js"),o=require("../lib/webrtc/connection.js"),s=require("../static/outgoing_ringtone.js"),i=require("../node_modules/react-redux/es/hooks/useDispatch.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=l(e);exports.WebRTC=function(l){var g=l.hostName,p=l.sipExten,b=l.sipSecret,f=l.children,m=l.sipHost,w=l.sipPort,h=l.reload,v=l.reloadedCallback,y=i.useDispatch(),S=e.useRef(null),k=e.useRef(t.default),C=e.useCallback((function(){k.current.init({debug:"all",dependencies:k.current.useDefaultDependencies({adapter:r.default}),callback:function(){var e=new k.current({server:"https://".concat(g,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(y.webrtc.updateWebRTC({sipcall:e}),n.register({sipExten:p,sipSecret:b,sipHost:m,sipPort:w}),e&&k.current.log&&k.current.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){k.current.error&&(k.current.error(" -- Error attaching plugin..."),k.current.error(e))},consentDialog:function(e){k.current.log&&k.current.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){k.current.log&&k.current.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){a.store.getState().webrtc.sipcall&&k.current.log&&k.current.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,r){k.current.log&&k.current.log("Janus "+(r?"started":"stopped")+" receiving our "+e)},slowLink:function(e,r){e?k.current.warn&&k.current.warn("SLOW link: several missing packets from janus (".concat(r,")")):k.current.warn&&k.current.warn("SLOW link: janus is not receiving all your packets (".concat(r,")"))},onmessage:function(e,r){var t=a.store.getState().webrtc.sipcall;k.current.debug&&(k.current.debug(" ::: Got a message :::"),k.current.debug(JSON.stringify(e)));var c=e.error;if(null==c||null==c){var o=e.result;if(null!=o&&void 0!==o.event&&null!==o.event)switch(o.event){case"registration_failed":k.current.error&&k.current.error("Registration failed: "+o.code+" "+o.reason);break;case"unregistered":k.current.log&&k.current.log("Successfully un-registered as "+o.username+"!");break;case"registered":k.current.log&&k.current.log("Successfully registered as "+o.username+"!"),a.store.getState().webrtc.registered||a.store.dispatch.webrtc.updateWebRTC({registered:!0}),y.alerts.removeAlert("webrtc_down"),y.webrtc.updateLastActivity((new Date).getTime());break;case"registering":k.current.log&&k.current.log("janus registering");break;case"calling":y.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),y.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":a.store.getState().player.audioPlayerPlaying||y.player.updateStartAudioPlayer({src:s.default,loop:!0}),y.webrtc.updateLastActivity((new Date).getTime());break;case"progress":k.current.log&&k.current.log("There's early media from "+o.username+", wairing for the call!"),null!=r&&n.handleRemote(r),y.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":y.webrtc.updateWebRTC({jsepGlobal:r}),y.currentCall.checkIncomingUpdatePlay({incomingWebRTC:!0}),k.current.log&&k.current.log("Incoming call from "+o.username+"!"),y.webrtc.updateLastActivity((new Date).getTime());break;case"accepted":k.current.log&&k.current.log(o.username+" accepted the call!"),r&&n.handleRemote(r),y.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),y.currentCall.updateCurrentCall({incoming:!1,incomingWebRTC:!1}),a.store.dispatch.player.stopAudioPlayer(),y.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":u.hangupCurrentCall(),t.hangup(),k.current.log&&k.current.log("Call hung up ("+o.code+" "+o.reason+")!"),y.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()):k.current.log&&k.current.log("User is not registered")},onlocalstream:function(e){k.current.debug&&(k.current.debug(" ::: Got a local stream :::"),k.current.debug(e))},onremotestream:function(e){k.current.debug&&k.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(k.current.attachMediaStream){if(n&&n.length>0){var u=new MediaStream(n);r&&r.current&&k.current.attachMediaStream(r.current,u),a.store.dispatch.webrtc.updateRemoteAudioStream(u)}else console.warn("No audio tracks on remote stream");if(c&&c.length>0){var o=new MediaStream(c);t&&t.current&&k.current.attachMediaStream(t.current,o)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){k.current.log&&k.current.log(" ::: janus Got a cleanup notification :::")},detached:function(){k.current.warn&&k.current.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){k.current.log&&k.current.log("error",e),y.alerts.setAlert("webrtc_down")},destroyed:function(){y.webrtc.updateWebRTC({destroyed:!0}),y.alerts.setAlert("webrtc_down")}})}})}),[k.current]);return e.useEffect((function(){c.checkMediaPermissions()}),[]),e.useEffect((function(){var e;return C(),e=a.store.getState().webrtc.CHECK_INTERVAL_TIME,S.current||(S.current=setInterval((function(){return o.webrtcCheck((function(){n.register({sipExten:p,sipSecret:b,sipHost:m,sipPort:w})}))}),e)),function(){n.unregister(),clearInterval(S.current)}}),[]),e.useEffect((function(){if(h){n.unregister();var e=a.store.getState().webrtc.sipcall;e&&e.detach(),k.current.destroy&&k.current.destroy(),setTimeout((function(){C(),v&&v()}),1e4)}}),[h]),d.default.createElement(d.default.Fragment,null,f)};
|
|
2
2
|
//# sourceMappingURL=WebRTC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useState, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store, type RootState } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n}\n\nconst Janus: JanusTypes = JanusLib\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n useEffect(() => {\n const setupDeps = () =>\n Janus.useDefaultDependencies({\n adapter,\n })\n\n function initWebRTC() {\n Janus.init({\n debug: 'all',\n dependencies: setupDeps(),\n callback: function () {\n const janusInstance = new Janus({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (Janus.log)\n Janus.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (Janus.error) {\n Janus.error(' -- Error attaching plugin...')\n Janus.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (Janus.log) Janus.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (Janus.log)\n Janus.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (Janus.log)\n Janus.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (Janus.log)\n Janus.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (Janus.warn)\n Janus.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (Janus.warn)\n Janus.warn(`SLOW link: janus is not receiving all your packets (${count})`)\n }\n },\n onmessage: function (msg, jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (Janus.debug) {\n Janus.debug(' ::: Got a message :::')\n Janus.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (Janus.log) Janus.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // get event\n var event = result['event']\n\n //switch event\n switch (event) {\n case 'registration_failed':\n if (Janus.error)\n Janus.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (Janus.log)\n Janus.log('Successfully un-registered as ' + result['username'] + '!')\n // registered = false\n break\n\n case 'registered':\n if (Janus.log)\n Janus.log('Successfully registered as ' + result['username'] + '!')\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (Janus.log) Janus.log('janus registering')\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (Janus.log)\n Janus.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n if (jsep !== null && jsep !== undefined) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n\n // Number and display name are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (Janus.log) Janus.log('Incoming call from ' + result['username'] + '!')\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (Janus.log) Janus.log(result['username'] + ' accepted the call!')\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // Set incoming value to false\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n hangupCurrentCall()\n sipcall.hangup()\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (Janus.log)\n Janus.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (Janus.debug) {\n Janus.debug(' ::: Got a local stream :::')\n Janus.debug(stream)\n }\n // if (Janus.attachMediaStream) Janus.attachMediaStream(localVideoElement, stream)\n /* IS VIDEO ENABLED ? */\n // var videoTracks = stream.getVideoTracks()\n /* */\n },\n onremotestream: function (stream: MediaStream) {\n if (Janus.debug) {\n Janus.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (Janus.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n remoteAudioElement &&\n remoteAudioElement.current &&\n Janus.attachMediaStream(remoteAudioElement.current, audioStream)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n remoteVideoElement &&\n remoteVideoElement.current &&\n Janus.attachMediaStream(remoteVideoElement.current, videoStream)\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (Janus.log) Janus.log(' ::: janus Got a cleanup notification :::')\n },\n detached: function () {\n if (Janus.warn) Janus.warn('SIP plugin handle detached from the plugin itself')\n },\n })\n }\n },\n error: (err: any) => {\n if (Janus.log) Janus.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }\n\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n return <>{children}</>\n}\n"],"names":["Janus","JanusLib","_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","dispatch","useDispatch","janusCheckInterval","useRef","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","registered","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","checkIncomingUpdatePlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","stopAudioPlayer","hangupCurrentCall","hangup","onlocalstream","stream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","current","updateRemoteAudioStream","console","videoStream","oncleanup","detached","err","alerts","setAlert","destroyed","setInterval","webrtcCheck","unregister","clearInterval","React","createElement","Fragment"],"mappings":"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"}
|
|
1
|
+
{"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, useMemo } 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 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\n var event = result['event']\n\n //switch event\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 // registered = false\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) janus.current.log('janus registering')\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log)\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n if (jsep !== null && jsep !== undefined) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n\n // Number and display name are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log)\n janus.current.log('Incoming call from ' + result['username'] + '!')\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (janus.current.log)\n janus.current.log(result['username'] + ' accepted the call!')\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // Set incoming value to false\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n hangupCurrentCall()\n sipcall.hangup()\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (janus.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 // if (Janus.attachMediaStream) Janus.attachMediaStream(localVideoElement, stream)\n /* IS VIDEO ENABLED ? */\n // var videoTracks = stream.getVideoTracks()\n /* */\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.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 remoteAudioElement &&\n 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 remoteVideoElement &&\n remoteVideoElement.current &&\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\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 detached: function () {\n if (janus.current.warn)\n janus.current.warn('SIP plugin handle detached from the plugin itself')\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","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","checkIncomingUpdatePlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","stopAudioPlayer","hangupCurrentCall","hangup","console","onlocalstream","stream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateRemoteAudioStream","videoStream","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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"}
|
package/dist/types/webrtc.d.ts
CHANGED
|
@@ -6,5 +6,6 @@ export interface JanusTypes extends JanusLibTypes {
|
|
|
6
6
|
error?: (message: string, error?: Error) => void;
|
|
7
7
|
debug?: (message: string, error?: Error) => void;
|
|
8
8
|
attachMediaStream?: (video: HTMLVideoElement | HTMLAudioElement | null, stream: MediaStream) => void;
|
|
9
|
+
destroy?: () => void;
|
|
9
10
|
}
|
|
10
11
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function exposeWorker(workerFunction: () => void): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposeWorker.js","sources":["../../../src/utils/genericFunctions/exposeWorker.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nexport default function exposeWorker(workerFunction: () => void) {\n return URL.createObjectURL(\n new Blob(['(', workerFunction.toString(), ')()'], { type: 'application/javascript' }),\n )\n}\n"],"names":["workerFunction","URL","createObjectURL","Blob","toString","type"],"mappings":"oFAGwB,SAAaA,GACnC,OAAOC,IAAIC,gBACT,IAAIC,KAAK,CAAC,IAAKH,EAAeI,WAAY,OAAQ,CAAEC,KAAM,2BAE9D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../utils/genericFunctions/exposeWorker.js").default((function(){var e=(new Date).getTime();setInterval((function(){var t=(new Date).getTime();t>e+4e3&&postMessage("wakeup"),e=t}),2e3)}));exports.default=e;
|
|
2
|
+
//# sourceMappingURL=wake_up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake_up.js","sources":["../../src/workers/wake_up.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport exposeWorker from '../utils/genericFunctions/exposeWorker'\n\n/**\n * Performs a check about the tab inactivity\n * ...probably a standby of the computer\n */\nconst wakeUpWorker = exposeWorker(() => {\n let lastTime = new Date().getTime()\n const CHECK_INTERVAL = 2000\n setInterval(() => {\n const currentTime = new Date().getTime()\n if (currentTime > lastTime + CHECK_INTERVAL * 2) {\n postMessage('wakeup')\n }\n lastTime = currentTime\n }, CHECK_INTERVAL)\n})\n\nexport default wakeUpWorker\n"],"names":["wakeUpWorker","lastTime","Date","getTime","setInterval","currentTime","CHECK_INTERVAL","postMessage"],"mappings":"wEASMA,uDAA2B,SAAC,WAChC,IAAIC,GAAW,IAAIC,MAAOC,UAE1BC,aAAY,WACV,IAAMC,GAAc,IAAIH,MAAOC,UAC3BE,EAAcJ,EAAWK,KAC3BC,YAAY,UAEdN,EAAWI,CACZ,GAPsB,IAQzB"}
|