Advertisement
Guest User

Untitled

a guest
Jan 30th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.77 KB | None | 0 0
  1. import SdpInterop from '../libs/interop/SdpInterop';
  2. import JsSIP from '../libs/jssip';
  3. import store from '../store';
  4. import {callControl, callReduxTest} from "./commonActions";
  5. import {overNone, overCall} from "./overActions";
  6. import {newMessage, notify} from "./socketActions";
  7. import {loadMessagesUser} from "./messageActions";
  8. import pako from 'pako';
  9. import axios from 'axios';
  10.  
  11. import {
  12. SIP_SOCKET,
  13. SIP_REGISTER,
  14. HAS_USER_MEDIA,
  15. LOST_USER_MEDIA,
  16. CALL_ENDED,
  17. CALL_CONFIRMED,
  18. ON_TRACK,
  19. NEW_RTC_SESSION,
  20. DASHBOARD,
  21. MUTE_AUDIO,
  22. MUTE_MIC,
  23. VIEW_COMPRESSED,
  24. SET_COUNTERPART,
  25. SET_COUNTERPART_USER,
  26. REMOVE_STREAM,
  27. SET_CONFERENCE,
  28. SET_CURRENT_VIDEO,
  29. UPGRADE,
  30. CLEAR_VIDEO_STREAMS,
  31. VIDEO_ENABLED,
  32. AUDIO_ONLY,
  33. SET_REGISTERED, NEW_MESSAGE, OVER_ANSWER, CALL, OVER_CALL
  34. } from './types';
  35. import {soundPlay, soundStop} from "./soundActions";
  36.  
  37. // Create SIP Socket Connection
  38. export const sipSocket = () => (dispatch) => {
  39. const socket = new JsSIP.WebSocketInterface('wss://' + store.getState().sip.server + ':' + store.getState().sip.port + '/ws');
  40. socket.onconnect = () => {
  41. console.log('WARNING: SIP SOCKET CONNECTED');
  42. };
  43. socket.ondiscconnect = (error, code, reason) => {
  44. console.log('WARNING: SIP SOCKET DISCCONNECTED');
  45. if (error)
  46. console.log('socket si è disconnesso a causa di un errore', code + ' ' + reason);
  47. else
  48. console.log('socket si è disconnesso senza errori');
  49. };
  50. dispatch({
  51. type: SIP_SOCKET,
  52. payload: socket
  53. });
  54. };
  55.  
  56. export const answer = (session, e) => dispatch => {
  57. dispatch(overNone());
  58. dispatch(callControl());
  59. dispatch(soundStop('incoming'));
  60. dispatch(soundStop('outgoing'));
  61.  
  62. window.onbeforeunload = function (e) {
  63. // do some ajax post here
  64. //
  65.  
  66. if (store.getState().sip.session) {
  67. store.getState().sip.session.terminate()
  68. .catch(() => {
  69. });
  70. }
  71.  
  72. /*if (store.getState().sip.ua) {
  73. store.getState().sip.ua.unregister();
  74. }*/
  75.  
  76. // Display a message (or generic message in some browsers) and allow the user to cancel leaving the page.
  77. return 'Ho terminato la sessione corrente. Sicuro di voler uscire?';
  78. };
  79.  
  80. if (e.originator === 'remote') {
  81. if (store.getState().sip.inCall) {
  82. session.terminate({status_code: 486, reason_phrase: 'Utente Occupato'});
  83. return;
  84. }
  85. let options = {
  86. mediaConstraints: {audio: true, video: store.getState().sip.videoEnabled},
  87. pcConfig: {
  88. rtcpMuxPolicy: 'negotiate',
  89. bundlePolicy: 'balanced',
  90. iceServers:
  91. [
  92. {urls: 'stun:even.i-tel.it:3478'},
  93. {
  94. urls: 'turn:even.i-tel.it:3478?transport=tcp',
  95. username: 'admin',
  96. credential: 'admin'
  97. }
  98. ]
  99. }
  100. };
  101. session.answer(options);
  102. }
  103.  
  104. session.on('sdp', (data) => {
  105. let isFirefox = typeof InstallTrigger !== 'undefined';
  106. let isChrome = !!window.chrome && !!window.chrome.webstore;
  107. if (isFirefox && data.originator === 'remote') {
  108. data.sdp = data.sdp.replace(/actpass/g, 'active');
  109. } else if (isChrome) {
  110. console.log('doing dark magic in chrome...');
  111. let converted;
  112. let desc = new RTCSessionDescription({
  113. type: data.type,
  114. sdp: data.sdp
  115. });
  116. if (data.originator === 'local') {
  117. converted = store.getState().sip.interop.toUnifiedPlan(desc);
  118. } else {
  119. converted = store.getState().sip.interop.toPlanB(desc);
  120. data.sdp = data.sdp.replace(/a=rtcp:9 IN IP4 0.0.0.0/g, 's=-');
  121. }
  122. data.sdp = converted.sdp;
  123. }
  124. });
  125.  
  126. session.on('ended', data => {
  127. console.log('CALL ENDED EVENT')
  128. dispatch({
  129. type: CALL_ENDED
  130. });
  131. dispatch({
  132. type: VIEW_COMPRESSED
  133. });
  134. });
  135.  
  136. session.on('failed', data => {
  137. console.log('CALL FAILED EVENT')
  138. dispatch({
  139. type: CALL_ENDED
  140. });
  141. dispatch({
  142. type: VIEW_COMPRESSED
  143. });
  144. });
  145.  
  146. session.on('confirmed', () => {
  147. let stream = store.getState().sip.session.connection.getLocalStreams()[0];
  148. /*this.setState({
  149. localVideo: stream,
  150. inCall: true
  151. });*/
  152. dispatch({
  153. type: CALL_CONFIRMED,
  154. payload: stream
  155. });
  156. });
  157.  
  158. session.connection.ontrack = evt => {
  159. let track = evt.track;
  160. let transceiver = evt.transceiver;
  161. console.log(evt);
  162. for (let i = 0; i < evt.streams.length; ++i) {
  163. let stream = evt.streams[i];
  164.  
  165. console.log('Setting up onremovetrack event listener.');
  166. evt.track.onended = (event) => {
  167. console.log('onended: ' + evt.track.id);
  168. dispatch({
  169. type: REMOVE_STREAM,
  170. stream: stream,
  171. event: event
  172. });
  173. };
  174.  
  175. dispatch({
  176. type: ON_TRACK,
  177. stream: stream,
  178. track: track,
  179. transceiver: transceiver
  180. });
  181. }
  182. };
  183.  
  184. console.log(session._remote_identity._uri._user);
  185.  
  186. let counterpart = session._remote_identity._uri._user.toString();
  187.  
  188. if (counterpart.startsWith('6000')) {
  189. counterpart = counterpart.substring(4);
  190. dispatch({
  191. type: NEW_RTC_SESSION,
  192. payload: session,
  193. counterpart: counterpart,
  194. counterpartUser: {username: counterpart, extension: counterpart}
  195. })
  196. } else {
  197. dispatch({
  198. type: NEW_RTC_SESSION,
  199. payload: session,
  200. counterpart: session._remote_identity._uri._user
  201. });
  202. axios
  203. .get('/api/users/ext/' + session._remote_identity._uri._user)
  204. .then(response => {
  205. console.log(response.data);
  206. dispatch({
  207. type: NEW_RTC_SESSION,
  208. payload: session,
  209. counterpart: session._remote_identity._uri._user,
  210. counterpartUser: response.data
  211. })
  212. })
  213. }
  214. };
  215.  
  216. // SIP Register
  217. export const sipRegister = (user) => dispatch => {
  218. const configuration = {
  219. sockets: [store.getState().sip.socket],
  220. uri: 'sip:' + store.getState().auth.user.extension + '@' + store.getState().sip.server,
  221. authorization_user: store.getState().auth.user.extension,
  222. password: 'supersecretqaz'
  223. };
  224.  
  225. const ua = new JsSIP.UA(configuration);
  226.  
  227. ua.start();
  228.  
  229. ua.on('connected', (e) => {
  230. console.log('WARNING: SIP UA CONNECTED', e);
  231. });
  232.  
  233. ua.on('disconnected', (e) => {
  234. console.log('WARNING: SIP UA DISCONNECTED', e);
  235. dispatch(sipRegister());
  236. });
  237.  
  238. ua.on('newMessage', (e) => {
  239. console.log("NEW MESSAGE", e);
  240. if (e.originator === 'remote') {
  241. let text;
  242. let SIPMessage = e.message;
  243. SIPMessage.accept();
  244. let message = e.request;
  245. console.log('Ricevuto messaggio SIP: ', e.request.body);
  246. let extension = message.getHeader('X-Caller');
  247. // let type = message.getHeader('X-EvenType');
  248. let payload = message.getHeader('X-Even');
  249. if (payload === 'itelphone') {
  250. let from = {};
  251. store.getState().users.list.forEach((value) => {
  252. if (value.extension === extension) {
  253. from = value;
  254. }
  255. });
  256. let to = store.getState().auth.user;
  257. text = message.body;
  258. let data = {
  259. from: from,
  260. message: {
  261. text: text,
  262. time: new Date(),
  263. from: from,
  264. to: to,
  265. roomName: to.extension
  266. },
  267. to: to
  268. };
  269. //dispatch(newMessage(data));
  270. }
  271. }
  272. });
  273.  
  274. ua.on('newRTCSession', (e) => {
  275. console.log('newRTCSession', e);
  276.  
  277. let request = e.request;
  278. let extension = request.getHeader('X-Caller');
  279. let type = request.getHeader('X-EvenType');
  280. let payload = request.getHeader('X-Even');
  281. let autoAnswer = request.getHeader('X-AutoAnswer');
  282. let autoUser = request.getHeader('X-AutoUser');
  283. let autoExt = request.getHeader('X-AutoExt');
  284.  
  285. let session = e.session;
  286.  
  287. if (e.originator === 'remote') {
  288. if (store.getState().sip.inCall) {
  289. session.terminate({status_code: 486, reason_phrase: 'Utente Occupato'});
  290. return;
  291. }
  292. }
  293.  
  294. session.on('ended', () => {
  295. dispatch(soundStop('rejected'));
  296. dispatch(soundStop('incoming'));
  297. dispatch(soundStop('outgoing'));
  298. dispatch(overNone());
  299. });
  300.  
  301. session.on('failed', () => {
  302. dispatch(soundStop('rejected'));
  303. dispatch(soundStop('incoming'));
  304. dispatch(soundStop('outgoing'));
  305. dispatch(overNone());
  306. });
  307.  
  308. //lanciato quando la chiamata verso un cellulare o fisso è risposta
  309. session.on('accepted', () => {
  310. console.log("SONO NEL BLOCCO ACCEPTED");
  311. dispatch(soundStop('rejected'));
  312. dispatch(soundStop('incoming'));
  313. dispatch(soundStop('outgoing'));
  314. dispatch(overNone());
  315. dispatch(answer(session, e));
  316. dispatch(loadMessagesUser({
  317. from: store.getState().auth.user.extension,
  318. to: store.getState().sip.counterpartUser ? store.getState().sip.counterpartUser.extension : 'trunk-in'
  319. }));
  320. });
  321.  
  322. if (autoAnswer === 'yes' && session.direction === 'incoming') {
  323. dispatch(enableVideo());
  324. dispatch(setCounterpartUser({username: autoUser, extension: autoExt}));
  325. }
  326.  
  327. //Se chiamata da itelphone
  328. if (payload === 'itelphone') {
  329. if (type === 'videocall') {
  330. dispatch(enableVideo());
  331. } else {
  332. dispatch(audioOnly());
  333. }
  334. dispatch({
  335. type: NEW_RTC_SESSION,
  336. payload: session,
  337. e,
  338. sessionType: 'itelphone'
  339. });
  340. dispatch({
  341. type: OVER_ANSWER,
  342. payload: {
  343. from: {
  344. username: 'Utente Mobile',
  345. extension
  346. }
  347. },
  348. session,
  349. e
  350. });
  351. dispatch(soundPlay('incoming'));
  352. setTimeout(overNone, 8000);
  353. setTimeout(soundStop, 8000);
  354. return;
  355. //altrimenti se chiamata da rete GSM o fisso in ingresso
  356. } else if (session.direction === 'incoming' && session._remote_identity._uri._user.toString().startsWith('0')) {
  357. dispatch(audioOnly());
  358. dispatch({
  359. type: NEW_RTC_SESSION,
  360. payload: session,
  361. e,
  362. sessionType: 'itelphone'
  363. });
  364. const rand = Math.random() * (1000);
  365. dispatch({
  366. type: OVER_ANSWER,
  367. payload: {
  368. from: {
  369. username: 'Utente Mobile',
  370. extension: 'trunk-in' + rand
  371. }
  372. },
  373. session,
  374. e
  375. });
  376. dispatch(soundPlay('incoming'));
  377. setTimeout(overNone, 8000);
  378. setTimeout(soundStop, 8000);
  379. return;
  380. //altrimenti se la chiamata è verso un numero GSM o fisso
  381. } else if (session.direction === 'outgoing' && session._remote_identity._uri._user.toString().startsWith('0')) {
  382. console.log("SONO NEL BLOCCO OUTGOING");
  383. dispatch(audioOnly());
  384. dispatch(overCall(store.getState().auth.user));
  385. dispatch(soundPlay('outgoing'));
  386. setTimeout(overNone, 8000);
  387. setTimeout(soundStop, 8000);
  388. return;
  389. }
  390.  
  391. dispatch(answer(session, e));
  392. dispatch(loadMessagesUser({
  393. from: store.getState().auth.user.extension,
  394. to: store.getState().sip.counterpartUser ? store.getState().sip.counterpartUser.extension : 'trunk-in'
  395. }));
  396. });
  397.  
  398. ua.on('registered', (e) => {
  399. console.log('registered', e);
  400. dispatch(setRegistered(true));
  401. });
  402.  
  403. ua.on('unregistered', (e) => {
  404. console.log('unregistered', e);
  405. dispatch(setRegistered(false));
  406. });
  407.  
  408. ua.on('registrationFailed', (e) => {
  409. console.log('registrationFailed', e);
  410. });
  411.  
  412. dispatch({
  413. type: SIP_REGISTER,
  414. configuration: configuration,
  415. ua: ua,
  416. interop: new SdpInterop.InteropChrome()
  417. })
  418. };
  419.  
  420. // Start SIP Call
  421. export const sipCall = (extension, headers) => (dispatch) => {
  422. let options = {
  423. mediaConstraints: {audio: true, video: store.getState().sip.videoEnabled},
  424. pcConfig: {
  425. rtcpMuxPolicy: 'negotiate',
  426. bundlePolicy: 'balanced',
  427. iceServers:
  428. [
  429. {urls: 'stun:even.i-tel.it:3478'},
  430. {
  431. urls: 'turn:even.i-tel.it:3478?transport=tcp',
  432. username: 'admin',
  433. credential: 'admin'
  434. }
  435. ]
  436. }
  437. };
  438. if (headers)
  439. options.extraHeaders = headers;
  440. store.getState().sip.ua.call('sip:' + extension + '@' + store.getState().sip.server, options);
  441. };
  442.  
  443. // Start SIP Call
  444. export const callPhone = (extension) => (dispatch) => {
  445. let options = {
  446. mediaConstraints: {audio: true, video: store.getState().sip.videoEnabled},
  447. pcConfig: {
  448. rtcpMuxPolicy: 'negotiate',
  449. bundlePolicy: 'balanced',
  450. iceServers:
  451. [
  452. {urls: 'stun:even.i-tel.it:3478'},
  453. {
  454. urls: 'turn:even.i-tel.it:3478?transport=tcp',
  455. username: 'admin',
  456. credential: 'admin'
  457. }
  458. ]
  459. }
  460. };
  461. store.getState().sip.ua.call('sip:' + extension + '@' + store.getState().sip.server, options);
  462. };
  463.  
  464. // Close SIP Call
  465. export const sipHangUp = () => (dispatch) => {
  466. if (store.getState().sip.session)
  467. store.getState().sip.session.terminate();
  468. store.getState().sip.ua.stop();
  469. dispatch({
  470. type: DASHBOARD
  471. });
  472. };
  473.  
  474. // Has User Media
  475. export const gotUserMedia = () => dispatch => {
  476. dispatch({
  477. type: HAS_USER_MEDIA
  478. });
  479. };
  480.  
  481. // Lost User Media
  482. export const lostUserMedia = () => dispatch => {
  483. dispatch({
  484. type: LOST_USER_MEDIA
  485. });
  486. };
  487.  
  488. // Mute Remote Audio
  489. export const muteAudio = () => (dispatch) => {
  490. dispatch({
  491. type: MUTE_AUDIO
  492. });
  493. };
  494.  
  495. // Mute Local Mic
  496. export const muteMic = () => (dispatch) => {
  497. dispatch({
  498. type: MUTE_MIC
  499. });
  500. if (!store.getState().sip.mutedMic) {
  501. store.getState().sip.session.unmute({
  502. audio: true,
  503. video: false
  504. });
  505. } else {
  506. store.getState().sip.session.mute({
  507. audio: true,
  508. video: false
  509. });
  510. }
  511. };
  512.  
  513. // Set Conference
  514. export const setConference = () => dispatch => {
  515. dispatch({
  516. type: SET_CONFERENCE
  517. })
  518. };
  519.  
  520. // Upgrade to conference
  521. export const sipUpgrade = () => dispatch => {
  522. let users;
  523. if (store.getState().sip.counterpart !== '') {
  524. dispatch(setConference());
  525. dispatch(notify(UPGRADE, {}, store.getState().sip.counterpart));
  526. dispatch(setCounterpartUser({
  527. username: 'Conferenza',
  528. extension: store.getState().sip.counterpart
  529. }))
  530. } else if (store.getState().auth.user.extension < store.getState().sip.counterpart) {
  531. users = store.getState().auth.user.extension + '_' + store.getState().sip.counterpart;
  532. } else {
  533. users = store.getState().sip.counterpart + '_' + store.getState().auth.user.extension;
  534. }
  535.  
  536. dispatch({
  537. type: CLEAR_VIDEO_STREAMS
  538. });
  539. console.log("counterpart", store.getState().sip.counterpartUser);
  540. console.log("roomname", store.getState().sip);
  541. axios
  542. .post('/api/asterisk/upgrade', {
  543. prefix: store.getState().sip.counterpartUser.role === 'guest' ? '6000' : '5000',
  544. ext1: store.getState().auth.user.extension,
  545. ext2: store.getState().sip.counterpart
  546. })
  547. .then(() => {
  548. dispatch(setConference());
  549. // if (store.getState().sip.counterpartUser.username!=='Conferenza'){
  550. dispatch(notify(UPGRADE, {}, store.getState().sip.counterpart));
  551. dispatch(setCounterpartUser({
  552. username: 'Conferenza',
  553. extension: store.getState().sip.counterpartUser.role === 'guest' ? '6000' : '5000' + users
  554. }));
  555. //}
  556. });
  557. };
  558.  
  559. // Set Current Video
  560. export const setCurrentVideo = (stream) => dispatch => {
  561. dispatch({
  562. type: SET_CURRENT_VIDEO,
  563. stream
  564. })
  565. };
  566.  
  567. // Enable Video
  568. export const enableVideo = () => dispatch => {
  569. dispatch({
  570. type: VIDEO_ENABLED
  571. })
  572. };
  573.  
  574. // Audio Only
  575. export const audioOnly = () => dispatch => {
  576. dispatch({
  577. type: AUDIO_ONLY
  578. })
  579. };
  580.  
  581. // Set Counterpart
  582. export const setCounterpartUser = (counterpartUser) => dispatch => {
  583. dispatch({
  584. type: SET_COUNTERPART,
  585. counterpart: counterpartUser.extension,
  586. counterpartUser: counterpartUser
  587. })
  588. };
  589.  
  590. // Set Registered
  591. export const setRegistered = (registered) => dispatch => {
  592. dispatch({
  593. type: SET_REGISTERED,
  594. registered: registered
  595. })
  596. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement