amazon-connect-reference-dialer 1.0.0 → 1.4.3

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.

Potentially problematic release.


This version of amazon-connect-reference-dialer might be problematic. Click here for more details.

Files changed (239) hide show
  1. package/.babelrc +10 -0
  2. package/.eslintrc +24 -0
  3. package/Dockerfile +12 -0
  4. package/LICENSE +21 -0
  5. package/README.md +8 -0
  6. package/README.salesforce.md +50 -0
  7. package/config/appconfig.json +10 -0
  8. package/config/config.js +46 -0
  9. package/docker-compose.yml +16 -0
  10. package/index.js +46 -0
  11. package/nodemon.json +3 -0
  12. package/package.json +5 -4
  13. package/src/client/App.js +20 -0
  14. package/src/client/api/acManager.js +79 -0
  15. package/src/client/api/agentHandler.js +46 -0
  16. package/src/client/api/audioFrequencyMonitor.js +62 -0
  17. package/src/client/api/csioHandler.js +204 -0
  18. package/src/client/api/databaseManager.js +59 -0
  19. package/src/client/api/eventhandler.js +278 -0
  20. package/src/client/api/feedbackHandler.js +21 -0
  21. package/src/client/api/manager/agent.js +203 -0
  22. package/src/client/api/manager/connection.js +181 -0
  23. package/src/client/api/manager/contact.js +114 -0
  24. package/src/client/api/mediaManager.js +138 -0
  25. package/src/client/api/networkStrengthMonitor.js +64 -0
  26. package/src/client/api/precalltest.js +37 -0
  27. package/src/client/api/sessionManager.js +312 -0
  28. package/src/client/configs/consts.js +158 -0
  29. package/src/client/container/agentduration/duration.js +63 -0
  30. package/src/client/container/agentduration/index.js +3 -0
  31. package/src/client/container/agentview/conferenceconnection/agentview.css +100 -0
  32. package/src/client/container/agentview/conferenceconnection/components/bothhold.js +20 -0
  33. package/src/client/container/agentview/conferenceconnection/components/bothjoined.js +25 -0
  34. package/src/client/container/agentview/conferenceconnection/components/dialnumber.js +21 -0
  35. package/src/client/container/agentview/conferenceconnection/components/holdall.js +20 -0
  36. package/src/client/container/agentview/conferenceconnection/components/join.js +21 -0
  37. package/src/client/container/agentview/conferenceconnection/components/oneHoldOtherConnected.js +37 -0
  38. package/src/client/container/agentview/conferenceconnection/components/resumeall.js +21 -0
  39. package/src/client/container/agentview/conferenceconnection/components/swap.js +21 -0
  40. package/src/client/container/agentview/conferenceconnection/components/togglemute.js +23 -0
  41. package/src/client/container/agentview/conferenceconnection/index.js +3 -0
  42. package/src/client/container/agentview/conferenceconnection/lowerBody.js +154 -0
  43. package/src/client/container/agentview/conferenceconnection/main.js +22 -0
  44. package/src/client/container/agentview/conferenceconnection/primaryconnection.js +109 -0
  45. package/src/client/container/agentview/conferenceconnection/quickFeedback.js +118 -0
  46. package/src/client/container/agentview/conferenceconnection/thirdpartyconnection.js +107 -0
  47. package/src/client/container/agentview/conferenceconnection/upperBody.js +36 -0
  48. package/src/client/container/agentview/footer.js +190 -0
  49. package/src/client/container/agentview/index.js +3 -0
  50. package/src/client/container/agentview/main.js +39 -0
  51. package/src/client/container/agentview/primaryconnection/agentMutedLabel.js +23 -0
  52. package/src/client/container/agentview/primaryconnection/agentStatusAndAudioLabel.js +28 -0
  53. package/src/client/container/agentview/primaryconnection/agentview.css +73 -0
  54. package/src/client/container/agentview/primaryconnection/index.js +3 -0
  55. package/src/client/container/agentview/primaryconnection/lowerBody.js +159 -0
  56. package/src/client/container/agentview/primaryconnection/main.js +22 -0
  57. package/src/client/container/agentview/primaryconnection/peerAndAgentDuration.js +48 -0
  58. package/src/client/container/agentview/primaryconnection/quickFeedback.js +123 -0
  59. package/src/client/container/agentview/primaryconnection/upperBody.js +59 -0
  60. package/src/client/container/agentview/thirdparyconnection/agentMutedLabel.js +23 -0
  61. package/src/client/container/agentview/thirdparyconnection/agentStatusAndAudioLabel.js +28 -0
  62. package/src/client/container/agentview/thirdparyconnection/agentview.css +73 -0
  63. package/src/client/container/agentview/thirdparyconnection/index.js +3 -0
  64. package/src/client/container/agentview/thirdparyconnection/lowerBody.js +139 -0
  65. package/src/client/container/agentview/thirdparyconnection/main.js +22 -0
  66. package/src/client/container/agentview/thirdparyconnection/peerAndAgentDuration.js +49 -0
  67. package/src/client/container/agentview/thirdparyconnection/quickFeedback.js +118 -0
  68. package/src/client/container/agentview/thirdparyconnection/upperBody.js +59 -0
  69. package/src/client/container/audiolabelview/controller.js +104 -0
  70. package/src/client/container/audiolabelview/localaudiolevel.js +157 -0
  71. package/src/client/container/audiolabelview/noaudio.js +86 -0
  72. package/src/client/container/audiolabelview/remoteaudiolevel.js +110 -0
  73. package/src/client/container/audiolabelview/settingpageaudiolevel.js +154 -0
  74. package/src/client/container/common/contactField.js +30 -0
  75. package/src/client/container/common/each.contact.js +41 -0
  76. package/src/client/container/common/findContact.js +31 -0
  77. package/src/client/container/connectivitycheckview/body.js +113 -0
  78. package/src/client/container/connectivitycheckview/components/fractionalLoss.js +57 -0
  79. package/src/client/container/connectivitycheckview/components/mediaConnectivity.js +41 -0
  80. package/src/client/container/connectivitycheckview/components/roundTripTime.js +57 -0
  81. package/src/client/container/connectivitycheckview/components/rttgraph/rttgraph.js +176 -0
  82. package/src/client/container/connectivitycheckview/components/rttgraph/utils.js +96 -0
  83. package/src/client/container/connectivitycheckview/components/throughput.js +53 -0
  84. package/src/client/container/connectivitycheckview/components/throughputMessage.js +36 -0
  85. package/src/client/container/connectivitycheckview/connectivitycheck.css +44 -0
  86. package/src/client/container/connectivitycheckview/footer.js +43 -0
  87. package/src/client/container/connectivitycheckview/index.js +3 -0
  88. package/src/client/container/connectivitycheckview/loading/loading.css +73 -0
  89. package/src/client/container/connectivitycheckview/loading/loading.js +15 -0
  90. package/src/client/container/connectivitycheckview/main.js +19 -0
  91. package/src/client/container/dialerview/body.js +135 -0
  92. package/src/client/container/dialerview/dialpad.css +104 -0
  93. package/src/client/container/dialerview/dialpad.js +29 -0
  94. package/src/client/container/dialerview/index.js +3 -0
  95. package/src/client/container/dialerview/main.js +19 -0
  96. package/src/client/container/errors/error.css +30 -0
  97. package/src/client/container/errors/error.js +58 -0
  98. package/src/client/container/errors/index.js +3 -0
  99. package/src/client/container/footer/components/acceptOrReject.js +26 -0
  100. package/src/client/container/footer/components/availableOrEnd.js +28 -0
  101. package/src/client/container/footer/components/connectivitycheck.js +21 -0
  102. package/src/client/container/footer/components/downloadlogs.js +23 -0
  103. package/src/client/container/footer/components/info.js +22 -0
  104. package/src/client/container/footer/components/language.js +22 -0
  105. package/src/client/container/footer/components/reportcall.js +35 -0
  106. package/src/client/container/footer/components/version.js +22 -0
  107. package/src/client/container/header/header.css +46 -0
  108. package/src/client/container/header/header.js +135 -0
  109. package/src/client/container/header/index.js +3 -0
  110. package/src/client/container/home.js +129 -0
  111. package/src/client/container/login/body.js +67 -0
  112. package/src/client/container/login/ccpinputbox.js +23 -0
  113. package/src/client/container/login/footer.js +19 -0
  114. package/src/client/container/login/index.js +2 -0
  115. package/src/client/container/login/login.css +134 -0
  116. package/src/client/container/login/main.js +23 -0
  117. package/src/client/container/networkstrengthview/index.js +3 -0
  118. package/src/client/container/networkstrengthview/loading/loading.css +74 -0
  119. package/src/client/container/networkstrengthview/loading/loading.js +15 -0
  120. package/src/client/container/networkstrengthview/networkstrength.js +102 -0
  121. package/src/client/container/popups/confirmreport/confirmreport.css +47 -0
  122. package/src/client/container/popups/confirmreport/confirmreport.js +55 -0
  123. package/src/client/container/popups/quality/quality.css +32 -0
  124. package/src/client/container/popups/quality/quality.js +44 -0
  125. package/src/client/container/quickconnects/body.js +141 -0
  126. package/src/client/container/quickconnects/close.js +23 -0
  127. package/src/client/container/quickconnects/index.js +3 -0
  128. package/src/client/container/quickconnects/main.js +18 -0
  129. package/src/client/container/quickconnects/quickconnects.css +95 -0
  130. package/src/client/container/reportissueview/body.js +73 -0
  131. package/src/client/container/reportissueview/feedbackRatings.js +37 -0
  132. package/src/client/container/reportissueview/footer.js +20 -0
  133. package/src/client/container/reportissueview/index.js +3 -0
  134. package/src/client/container/reportissueview/issueNotes.js +22 -0
  135. package/src/client/container/reportissueview/issues.js +44 -0
  136. package/src/client/container/reportissueview/main.js +105 -0
  137. package/src/client/container/reportissueview/predefinedIssues.js +38 -0
  138. package/src/client/container/reportissueview/reportissue.css +102 -0
  139. package/src/client/container/settingsview/body.js +156 -0
  140. package/src/client/container/settingsview/components/audiooutputdevice.js +25 -0
  141. package/src/client/container/settingsview/components/deskphone.js +29 -0
  142. package/src/client/container/settingsview/components/desktopsettings.js +38 -0
  143. package/src/client/container/settingsview/components/dropdown-options.js +44 -0
  144. package/src/client/container/settingsview/components/phonetype.js +14 -0
  145. package/src/client/container/settingsview/components/settings.js +23 -0
  146. package/src/client/container/settingsview/components/softphone.js +30 -0
  147. package/src/client/container/settingsview/components/softphonesettings.js +35 -0
  148. package/src/client/container/settingsview/footer.js +96 -0
  149. package/src/client/container/settingsview/index.js +3 -0
  150. package/src/client/container/settingsview/main.js +20 -0
  151. package/src/client/container/settingsview/settings.css +126 -0
  152. package/src/client/container/statechangeview/body.js +61 -0
  153. package/src/client/container/statechangeview/footer.js +43 -0
  154. package/src/client/container/statechangeview/index.js +3 -0
  155. package/src/client/container/statechangeview/main.js +21 -0
  156. package/src/client/container/statechangeview/statuschange.css +47 -0
  157. package/src/client/container/transfercall/body.js +139 -0
  158. package/src/client/container/transfercall/close.js +23 -0
  159. package/src/client/container/transfercall/index.js +3 -0
  160. package/src/client/container/transfercall/main.js +18 -0
  161. package/src/client/container/transfercall/transfercall.css +99 -0
  162. package/src/client/index.js +13 -0
  163. package/src/client/reducers/acReducer.js +277 -0
  164. package/src/client/reducers/reducer.js +8 -0
  165. package/src/client/reducers.js +2 -0
  166. package/src/client/res/images/agent-voice-freq-icon.svg +61 -0
  167. package/src/client/res/images/change-status-icon.svg +16 -0
  168. package/src/client/res/images/csio-logo.png +0 -0
  169. package/src/client/res/images/csioLogo.png +0 -0
  170. package/src/client/res/images/dialer-setting-icon.svg +15 -0
  171. package/src/client/res/images/fa-circle-mark.svg +3 -0
  172. package/src/client/res/images/fa-circle-unmark.svg +3 -0
  173. package/src/client/res/images/fa-close-or-dismiss.svg +17 -0
  174. package/src/client/res/images/fa-danger.svg +3 -0
  175. package/src/client/res/images/fa-dial-button.svg +13 -0
  176. package/src/client/res/images/fa-dial-number.svg +15 -0
  177. package/src/client/res/images/fa-download.svg +3 -0
  178. package/src/client/res/images/fa-hold.svg +13 -0
  179. package/src/client/res/images/fa-ico-join.svg +27 -0
  180. package/src/client/res/images/fa-ico-swap.svg +27 -0
  181. package/src/client/res/images/fa-info.svg +3 -0
  182. package/src/client/res/images/fa-input-sound.svg +5 -0
  183. package/src/client/res/images/fa-language.svg +3 -0
  184. package/src/client/res/images/fa-mark-false.svg +3 -0
  185. package/src/client/res/images/fa-mark-true.svg +3 -0
  186. package/src/client/res/images/fa-mic-freq-temporary.gif +0 -0
  187. package/src/client/res/images/fa-mic.svg +3 -0
  188. package/src/client/res/images/fa-mini-endcall.svg +48 -0
  189. package/src/client/res/images/fa-mini-hold.svg +47 -0
  190. package/src/client/res/images/fa-mini-resume.svg +45 -0
  191. package/src/client/res/images/fa-mute.svg +13 -0
  192. package/src/client/res/images/fa-network-strength-1.svg +5 -0
  193. package/src/client/res/images/fa-network-strength-2.svg +6 -0
  194. package/src/client/res/images/fa-network-strength-3.svg +6 -0
  195. package/src/client/res/images/fa-network-strength-4.svg +6 -0
  196. package/src/client/res/images/fa-network-strength-5.svg +5 -0
  197. package/src/client/res/images/fa-network-strength-unknown-2.svg +9 -0
  198. package/src/client/res/images/fa-network-strength-unknown.svg +6 -0
  199. package/src/client/res/images/fa-quick-connect.svg +15 -0
  200. package/src/client/res/images/fa-refresh.svg +3 -0
  201. package/src/client/res/images/fa-resume.svg +3 -0
  202. package/src/client/res/images/fa-return.svg +3 -0
  203. package/src/client/res/images/fa-three-dots.svg +32 -0
  204. package/src/client/res/images/fa-tick-green.svg +3 -0
  205. package/src/client/res/images/fa-tick-mark.svg +3 -0
  206. package/src/client/res/images/fa-transfer.svg +3 -0
  207. package/src/client/res/images/fa-version.svg +4 -0
  208. package/src/client/res/images/fa-voice-no-freq.svg +5 -0
  209. package/src/client/res/images/favicon.ico +0 -0
  210. package/src/client/res/images/muted-icon.svg +13 -0
  211. package/src/client/res/images/network-strength-icon.svg +13 -0
  212. package/src/client/res/images/peer-voice-freq-icon.svg +26 -0
  213. package/src/client/res/images/star-white.svg +6 -0
  214. package/src/client/res/images/star-yellow.svg +6 -0
  215. package/src/client/res/scss/global.css +14 -0
  216. package/src/client/router.js +17 -0
  217. package/src/client/store.js +11 -0
  218. package/src/client/utils/acutils.js +114 -0
  219. package/src/client/utils/agetStateMap.js +36 -0
  220. package/src/client/utils/feedback.js +3 -0
  221. package/src/client/utils/initialStateManager.js +14 -0
  222. package/src/server/index.js +53 -0
  223. package/src/server/logger.js +93 -0
  224. package/src/server/public/fonts/AmazonEmber_Lt.ttf +0 -0
  225. package/src/server/public/fonts/AmazonEmber_Rg.ttf +0 -0
  226. package/src/server/public/img/favicon.ico +0 -0
  227. package/src/server/public/js/amazon-connect-pre-shim.js +2 -0
  228. package/src/server/router/compare.js +36 -0
  229. package/src/server/router/index.js +36 -0
  230. package/src/server/router/stock.js +33 -0
  231. package/src/server/views/_heap_prod.ejs +8 -0
  232. package/src/server/views/_hotjar_prod.ejs +14 -0
  233. package/src/server/views/_hotjar_test.ejs +12 -0
  234. package/src/server/views/compare.ejs +69 -0
  235. package/src/server/views/index.ejs +69 -0
  236. package/src/server/views/stock.ejs +101 -0
  237. package/webpack.common.config.js +48 -0
  238. package/webpack.dev.config.js +21 -0
  239. package/webpack.prod.config.js +10 -0
@@ -0,0 +1,59 @@
1
+ import React, { Component } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { connect } from 'react-redux';
4
+
5
+ import AgentStatusAndAudioLabel from './agentStatusAndAudioLabel';
6
+ import AgentMutedLabel from './agentMutedLabel';
7
+ import PeerAndAgentDuration from './peerAndAgentDuration';
8
+
9
+ import { getColorSchema } from '../../../utils/agetStateMap';
10
+ import sessionManager from './../../../api/sessionManager';
11
+ import Error from '../../errors/index';
12
+
13
+ class UpperBody extends Component {
14
+ constructor (props) {
15
+ super(props);
16
+ }
17
+
18
+ render () {
19
+ const hasError = this.props.errorMessage && this.props.errorMessage.errorType;
20
+ const state = sessionManager.getCurrentStateString(this.props.currentState, false);
21
+
22
+ return (
23
+ <div className={`row`}
24
+ style={{ height: '182px', backgroundColor: getColorSchema(state), paddingTop: '5%' }}>
25
+ {!hasError &&
26
+ <AgentStatusAndAudioLabel currentState={state}
27
+ muted={this.props.muted}/>}
28
+ {!hasError &&
29
+ <AgentMutedLabel muted={this.props.muted}/>}
30
+
31
+ {!hasError &&
32
+ <PeerAndAgentDuration currentState={state}
33
+ remoteStream={this.props.remoteStream}/>}
34
+ {hasError &&
35
+ <Error errorMessage={this.props.errorMessage}/>}
36
+ </div>
37
+ );
38
+ }
39
+ }
40
+
41
+ UpperBody.propTypes = {
42
+ currentState: PropTypes.object,
43
+ muted: PropTypes.bool,
44
+ remoteStream: PropTypes.object,
45
+ errorMessage: PropTypes.object
46
+
47
+ };
48
+ const mapStateToProps = state => ({
49
+ currentState: state.acReducer.currentState,
50
+ muted: state.acReducer.muted,
51
+ remoteStream: state.acReducer.remoteStream,
52
+ errorMessage: state.acReducer.errorMessage
53
+ });
54
+ const mapDispatchToProps = dispatch => ({});
55
+
56
+ export default connect(
57
+ mapStateToProps,
58
+ mapDispatchToProps
59
+ )(UpperBody);
@@ -0,0 +1,104 @@
1
+ /*
2
+ 2c6873
3
+ f2be45
4
+ ef8336
5
+ eb4358
6
+ 51b1ca
7
+ */
8
+
9
+ const range = 60;
10
+ const interval = range / 6;
11
+ const sensitivity = 2;
12
+ const min = 10;
13
+ const max = 480;
14
+
15
+ class AudioFrequencyMonitor {
16
+ constructor () {
17
+ this.id = undefined;
18
+ this.frequencyBar = [];
19
+ this.agentStateFn = undefined;
20
+
21
+ // audio
22
+ this.context = undefined;
23
+ this.analyser = undefined;
24
+ this.sourceNode = undefined;
25
+ }
26
+
27
+ register (bars = [], agentStateFn = undefined) {
28
+ this.frequencyBar = bars;
29
+ this.agentStateFn = agentStateFn;
30
+ }
31
+
32
+ visualize (analyser = undefined) {
33
+ let data = new Uint8Array(analyser.frequencyBinCount);
34
+
35
+ const render = () => {
36
+ if (analyser) {
37
+ analyser.getByteFrequencyData(data);
38
+ for (let channel = 1; channel < this.frequencyBar.length; channel += 1) {
39
+ const to = Math.floor(interval * channel);
40
+ const from = Math.ceil(to - interval);
41
+ const segment = data.slice(from, to);
42
+ const sum = segment.reduce((a, b) => a + b);
43
+
44
+ const average = sum / segment.length;
45
+ let height = sensitivity * average;
46
+ let translateY = -average * 0.8;
47
+
48
+ // scale down first and last channels to achieve an 'eyes' aesthetic
49
+ if (channel === 1 || channel === this.frequencyBar.length) {
50
+ translateY *= 0.2;
51
+ height *= 0.2;
52
+ }
53
+
54
+ height = Math.max(min, Math.min(max, height));
55
+ let bar = this.frequencyBar[channel];
56
+ // louder frequencies render with a greater height
57
+ bar.setAttribute(
58
+ 'd',
59
+ `m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v ${height} c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0`
60
+ );
61
+ // louder frequencies are shifted down further
62
+ bar.setAttribute('transform', `translate(0, ${translateY})`);
63
+ }
64
+ }
65
+ this.id = window.requestAnimationFrame(render);
66
+ };
67
+ render();
68
+ }
69
+
70
+ renderStream (stream = undefined) {
71
+ // clear animation
72
+ this.dispose().then(_ => {
73
+ if (!stream) {
74
+ return;
75
+ }
76
+ this.context = new AudioContext();
77
+ this.analyser = this.context.createAnalyser();
78
+ this.analyser.fftSize = 1024;
79
+
80
+ this.sourceNode = this.context.createMediaStreamSource(stream);
81
+ this.sourceNode.connect(this.analyser);
82
+ this.visualize(this.analyser);
83
+ }).catch(err => {
84
+ console.error('~', err);
85
+ });
86
+ }
87
+
88
+ async dispose () {
89
+ // console.warn('~audiolabel.controller.dispose');
90
+ if (this.id) {
91
+ window.cancelAnimationFrame(this.id);
92
+ this.id = null;
93
+ }
94
+ if (this.context) {
95
+ await this.context.close();
96
+ this.context = undefined;
97
+ this.analyser = undefined;
98
+ }
99
+
100
+ this.sourceNode = undefined;
101
+ }
102
+ }
103
+
104
+ export default AudioFrequencyMonitor;
@@ -0,0 +1,157 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import mediaManager from './../../api/mediaManager';
5
+ import sessionManager from './../../api/sessionManager';
6
+ import AudioFrequencyMonitor from './controller';
7
+
8
+ const style = {
9
+ fill: '#ffffff',
10
+ fillOpacity: 1,
11
+ fillRule: 'nonzero',
12
+ stroke: 'none'
13
+ };
14
+
15
+ const MEDIA_RETRY_INTERVAL_MS = 1 * 1000;
16
+ const MAX_MEDIA_RETRY_COUNT = 60;
17
+
18
+ class LocalAudiolevel extends React.Component {
19
+ constructor (props) {
20
+ super(props);
21
+ this.audioControler = new AudioFrequencyMonitor();
22
+ this.intervalId = undefined;
23
+ this.lastRetry = 0;
24
+ }
25
+
26
+ async _fetchMediaInternals (mediaRetryCount = 0) {
27
+ let now = (new Date()).getTime();
28
+ if (now - this.lastRetry < MEDIA_RETRY_INTERVAL_MS) {
29
+ throw new Error('Already trying to fetch media');
30
+ }
31
+ let selectedDevice = await mediaManager.getDefaultOrPreferredAudioInputDevice();
32
+ // console.warn('~fetchMedia', 'trying to fetch local media', mediaRetryCount, selectedDevice);
33
+ const localStream = await mediaManager.getUserMedia(selectedDevice);
34
+ this.lastRetry = (new Date()).getTime();
35
+ return localStream;
36
+ }
37
+
38
+ fetchMedia (mediaRetryCount = 0) {
39
+ this._fetchMediaInternals(mediaRetryCount).then(localStream => {
40
+ mediaManager.setLocalStream(localStream);
41
+ this.audioControler.renderStream(localStream);
42
+ }).catch(() => {
43
+ this.intervalId = setInterval(async () => {
44
+ try {
45
+ const localStream = await this._fetchMediaInternals(mediaRetryCount);
46
+ this.clearInterval();
47
+ this.audioControler.renderStream(localStream);
48
+ } catch (err) {
49
+ // console.warn('~fetchMedia', err);
50
+ if (mediaRetryCount < 1) {
51
+ // console.warn('maximum media recover count exceeded');
52
+ this.clearInterval();
53
+ }
54
+ mediaRetryCount -= 1;
55
+ }
56
+ }, MEDIA_RETRY_INTERVAL_MS);
57
+ });
58
+ }
59
+
60
+ componentDidMount () {
61
+ // console.warn('~componentDidMount');
62
+ const barList = [this.refs.bar1, this.refs.bar2, this.refs.bar3, this.refs.bar4, this.refs.bar5, this.refs.bar6, this.refs.bar7];
63
+ this.audioControler.register(barList, sessionManager.getPrimaryAgentState);
64
+ this.clearInterval();
65
+ mediaManager.dispose();
66
+ }
67
+
68
+ componentWillUnmount () {
69
+ // console.warn('~componentWillUnmount');
70
+ this.clearInterval();
71
+ mediaManager.dispose();
72
+ this.audioControler.dispose();
73
+ }
74
+
75
+ dummyClick (e) {
76
+ setTimeout(() => {
77
+ e && e.click();
78
+ }, 1000);
79
+ }
80
+
81
+ clearInterval () {
82
+ if (!this.intervalId) {
83
+ return;
84
+ }
85
+ clearInterval(this.intervalId);
86
+ this.intervalId = undefined;
87
+ }
88
+
89
+ render () {
90
+ const viewBox = this.props.viewBox || '0 200 1000 1000';
91
+ return (
92
+ <span ref={this.dummyClick} onClick={() => this.fetchMedia(MAX_MEDIA_RETRY_COUNT)}>
93
+ <svg xmlns="http://www.w3.org/2000/svg"
94
+ viewBox={viewBox}
95
+ x="0"
96
+ y="0"
97
+ width="100%"
98
+ height="100%">
99
+ <defs id="defs6">
100
+ <clipPath id="clipPath18">
101
+ <path id="path16" d="M 0,1211 H 1127 V 0 H 0 Z"/>
102
+ </clipPath>
103
+ </defs>
104
+ <g transform="translate(285.45 600)" id="g40">
105
+ <path ref="bar1"
106
+ style={style}
107
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
108
+ />
109
+ </g>
110
+ <g transform="translate(400.049 600)" id="g36">
111
+ <path ref="bar2"
112
+ style={style}
113
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
114
+ />
115
+ </g>
116
+ <g transform="translate(514.647 600)" id="g32">
117
+ <path ref="bar3"
118
+ style={style}
119
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
120
+ />
121
+ </g>
122
+ <g transform="translate(629.245 600)" id="g28">
123
+ <path ref="bar4"
124
+ style={style}
125
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
126
+ />
127
+ </g>
128
+ <g transform="translate(743.843 600)" id="g24">
129
+ <path ref="bar5"
130
+ style={style}
131
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
132
+ />
133
+ </g>
134
+ <g transform="translate(858.442 600)" id="g44">
135
+ <path ref="bar6"
136
+ style={style}
137
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
138
+ />
139
+ </g>
140
+
141
+ <g transform="translate(973.041 600)" id="g45">
142
+ <path ref="bar7"
143
+ style={style}
144
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
145
+ />
146
+ </g>
147
+ </svg>
148
+ </span>
149
+ );
150
+ }
151
+ }
152
+
153
+ LocalAudiolevel.propTypes = {
154
+ viewBox: PropTypes.string
155
+ };
156
+
157
+ export default LocalAudiolevel;
@@ -0,0 +1,86 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import mediaManager from './../../api/mediaManager';
5
+ import sessionManager from './../../api/sessionManager';
6
+ import AudioFrequencyMonitor from './controller';
7
+
8
+ const style = {
9
+ fill: '#ffffff',
10
+ fillOpacity: 1,
11
+ fillRule: 'nonzero',
12
+ stroke: 'none'
13
+ };
14
+
15
+ class NoAudio extends React.Component {
16
+ constructor (props) {
17
+ super(props);
18
+ }
19
+
20
+ render () {
21
+ const viewBox = this.props.viewBox || '0 200 1000 1000';
22
+ return (
23
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox={viewBox}
24
+ x="0"
25
+ y="0"
26
+ width="100%"
27
+ height="100%">
28
+ <defs id="defs6">
29
+ <clipPath id="clipPath18">
30
+ <path id="path16" d="M 0,1211 H 1127 V 0 H 0 Z"/>
31
+ </clipPath>
32
+ </defs>
33
+ <g transform="translate(285.45 600)" id="g40">
34
+ <path ref="bar1"
35
+ style={style}
36
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
37
+ />
38
+ </g>
39
+ <g transform="translate(400.049 600)" id="g36">
40
+ <path ref="bar2"
41
+ style={style}
42
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
43
+ />
44
+ </g>
45
+ <g transform="translate(514.647 600)" id="g32">
46
+ <path ref="bar3"
47
+ style={style}
48
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
49
+ />
50
+ </g>
51
+ <g transform="translate(629.245 600)" id="g28">
52
+ <path ref="bar4"
53
+ style={style}
54
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
55
+ />
56
+ </g>
57
+ <g transform="translate(743.843 600)" id="g24">
58
+ <path ref="bar5"
59
+ style={style}
60
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
61
+ />
62
+ </g>
63
+ <g transform="translate(858.442 600)" id="g44">
64
+ <path ref="bar6"
65
+ style={style}
66
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
67
+ />
68
+ </g>
69
+
70
+ <g transform="translate(973.041 600)" id="g45">
71
+ <path ref="bar7"
72
+ style={style}
73
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
74
+ />
75
+ </g>
76
+ </svg>
77
+
78
+ );
79
+ }
80
+ }
81
+
82
+ NoAudio.propTypes = {
83
+ viewBox: PropTypes.string
84
+ };
85
+
86
+ export default NoAudio;
@@ -0,0 +1,110 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import mediaManager from './../../api/mediaManager';
5
+ import sessionManager from './../../api/sessionManager';
6
+ import AudioFrequencyMonitor from './controller';
7
+
8
+ const style = {
9
+ fill: '#ffffff',
10
+ fillOpacity: 1,
11
+ fillRule: 'nonzero',
12
+ stroke: 'none'
13
+ };
14
+ const spanStyle = {
15
+ marginLeft: '-2.5em'
16
+ };
17
+
18
+ class RemoteAudioLevel extends React.Component {
19
+ constructor (props) {
20
+ super(props);
21
+ this.audioControler = new AudioFrequencyMonitor();
22
+ }
23
+
24
+ componentDidMount () {
25
+ // console.warn('~componentDidMount>remote');
26
+ const barList = [this.refs.bar1, this.refs.bar2, this.refs.bar3, this.refs.bar4, this.refs.bar5, this.refs.bar6, this.refs.bar7];
27
+ this.audioControler.register(barList, sessionManager.getPrimaryAgentState);
28
+ }
29
+
30
+ componentWillUnmount () {
31
+ // console.warn('~componentWillUnmount>remote');
32
+ this.audioControler.dispose();
33
+ }
34
+
35
+ dummyClick (e) {
36
+ setTimeout(() => {
37
+ e && e.click();
38
+ }, 1000);
39
+ }
40
+
41
+ render () {
42
+ const viewBox = this.props.viewBox || '0 200 1000 1000';
43
+ return (
44
+ <span ref={this.dummyClick} onClick={() => this.audioControler.renderStream(this.props.remoteStream)}
45
+ style={spanStyle}>
46
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox={viewBox}
47
+ x="0"
48
+ y="0"
49
+ width="100%"
50
+ height="100%">
51
+ <defs id="defs6">
52
+ <clipPath id="clipPath18">
53
+ <path id="path16" d="M 0,1211 H 1127 V 0 H 0 Z"/>
54
+ </clipPath>
55
+ </defs>
56
+ <g transform="translate(285.45 600)" id="g40">
57
+ <path ref="bar1"
58
+ style={style}
59
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
60
+ />
61
+ </g>
62
+ <g transform="translate(400.049 600)" id="g36">
63
+ <path ref="bar2"
64
+ style={style}
65
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
66
+ />
67
+ </g>
68
+ <g transform="translate(514.647 600)" id="g32">
69
+ <path ref="bar3"
70
+ style={style}
71
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
72
+ />
73
+ </g>
74
+ <g transform="translate(629.245 600)" id="g28">
75
+ <path ref="bar4"
76
+ style={style}
77
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
78
+ />
79
+ </g>
80
+ <g transform="translate(743.843 600)" id="g24">
81
+ <path ref="bar5"
82
+ style={style}
83
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
84
+ />
85
+ </g>
86
+ <g transform="translate(858.442 600)" id="g44">
87
+ <path ref="bar6"
88
+ style={style}
89
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
90
+ />
91
+ </g>
92
+
93
+ <g transform="translate(973.041 600)" id="g45">
94
+ <path ref="bar7"
95
+ style={style}
96
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
97
+ />
98
+ </g>
99
+ </svg>
100
+ </span>
101
+ );
102
+ }
103
+ }
104
+
105
+ RemoteAudioLevel.propTypes = {
106
+ viewBox: PropTypes.string,
107
+ remoteStream: PropTypes.object
108
+ };
109
+
110
+ export default RemoteAudioLevel;
@@ -0,0 +1,154 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import mediaManager from './../../api/mediaManager';
5
+ import sessionManager from './../../api/sessionManager';
6
+ import AudioFrequencyMonitor from './controller';
7
+
8
+ const style = {
9
+ fill: 'rgba(0, 0, 0, 0.5)',
10
+ fillOpacity: 1,
11
+ fillRule: 'nonzero',
12
+ stroke: 'none'
13
+ };
14
+
15
+ const MEDIA_RETRY_INTERVAL_MS = 1.5 * 1000;
16
+ const MAX_MEDIA_RETRY_COUNT = 60;
17
+
18
+ class LocalAudiolevel extends React.Component {
19
+ constructor (props) {
20
+ super(props);
21
+ this.audioControler = new AudioFrequencyMonitor();
22
+ this.intervalId = undefined;
23
+ this.lastRetry = 0;
24
+ }
25
+
26
+ async _fetchMediaInternals (mediaRetryCount = 0) {
27
+ let now = (new Date()).getTime();
28
+ if (now - this.lastRetry < MEDIA_RETRY_INTERVAL_MS) {
29
+ throw new Error('Already trying to fetch media');
30
+ }
31
+ let selectedDevice = await mediaManager.getDefaultOrPreferredAudioInputDevice();
32
+ // console.warn('~fetchMedia', 'trying to fetch local media', mediaRetryCount, selectedDevice);
33
+ const localStream = await mediaManager.getUserMedia(selectedDevice);
34
+ this.lastRetry = (new Date()).getTime();
35
+ return localStream;
36
+ }
37
+
38
+ fetchMedia (mediaRetryCount = 0) {
39
+ this._fetchMediaInternals(mediaRetryCount).then(localStream => this.audioControler.renderStream(localStream)).catch(() => {
40
+ this.intervalId = setInterval(async () => {
41
+ try {
42
+ const localStream = await this._fetchMediaInternals(mediaRetryCount);
43
+ this.clearInterval();
44
+ this.audioControler.renderStream(localStream);
45
+ } catch (err) {
46
+ // console.warn('~fetchMedia', err);
47
+ if (mediaRetryCount < 1) {
48
+ // console.warn('maximum media recover count exceeded');
49
+ this.clearInterval();
50
+ }
51
+ mediaRetryCount -= 1;
52
+ }
53
+ }, MEDIA_RETRY_INTERVAL_MS);
54
+ });
55
+ }
56
+
57
+ componentDidMount () {
58
+ // console.warn('~componentDidMount');
59
+ const barList = [this.refs.bar1, this.refs.bar2, this.refs.bar3, this.refs.bar4, this.refs.bar5, this.refs.bar6, this.refs.bar7];
60
+ this.audioControler.register(barList, sessionManager.getPrimaryAgentState);
61
+ this.clearInterval();
62
+ mediaManager.dispose();
63
+ }
64
+
65
+ componentWillUnmount () {
66
+ // console.warn('~componentWillUnmount');
67
+ this.clearInterval();
68
+ mediaManager.dispose();
69
+ this.audioControler.dispose();
70
+ }
71
+
72
+ dummyClick (e) {
73
+ setTimeout(() => {
74
+ e && e.click();
75
+ }, 1000);
76
+ }
77
+
78
+ clearInterval () {
79
+ if (!this.intervalId) {
80
+ return;
81
+ }
82
+ clearInterval(this.intervalId);
83
+ this.intervalId = undefined;
84
+ }
85
+
86
+ render () {
87
+ const viewBox = this.props.viewBox || '0 200 1000 1000';
88
+ return (
89
+ <span ref={this.dummyClick} onClick={() => this.fetchMedia(MAX_MEDIA_RETRY_COUNT)}>
90
+ <svg xmlns="http://www.w3.org/2000/svg"
91
+ viewBox={viewBox}
92
+ x="0"
93
+ y="0"
94
+ width="100%"
95
+ height="100%">
96
+ <defs id="defs6">
97
+ <clipPath id="clipPath18">
98
+ <path id="path16" d="M 0,1211 H 1127 V 0 H 0 Z"/>
99
+ </clipPath>
100
+ </defs>
101
+ <g transform="translate(285.45 600)" id="g40">
102
+ <path ref="bar1"
103
+ style={style}
104
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
105
+ />
106
+ </g>
107
+ <g transform="translate(400.049 600)" id="g36">
108
+ <path ref="bar2"
109
+ style={style}
110
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
111
+ />
112
+ </g>
113
+ <g transform="translate(514.647 600)" id="g32">
114
+ <path ref="bar3"
115
+ style={style}
116
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
117
+ />
118
+ </g>
119
+ <g transform="translate(629.245 600)" id="g28">
120
+ <path ref="bar4"
121
+ style={style}
122
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
123
+ />
124
+ </g>
125
+ <g transform="translate(743.843 600)" id="g24">
126
+ <path ref="bar5"
127
+ style={style}
128
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
129
+ />
130
+ </g>
131
+ <g transform="translate(858.442 600)" id="g44">
132
+ <path ref="bar6"
133
+ style={style}
134
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
135
+ />
136
+ </g>
137
+
138
+ <g transform="translate(973.041 600)" id="g45">
139
+ <path ref="bar7"
140
+ style={style}
141
+ d="m 0,0 h -11.941 c -14.938,0 -27.048,12.11 -27.048,27.048 v 10 c 0,14.938 12.11,27.048 27.048,27.048 H 0 c 14.938,0 27.048,-12.11 27.048,-27.048 V 27.048 C 27.048,12.11 14.938,0 0,0"
142
+ />
143
+ </g>
144
+ </svg>
145
+ </span>
146
+ );
147
+ }
148
+ }
149
+
150
+ LocalAudiolevel.propTypes = {
151
+ viewBox: PropTypes.string
152
+ };
153
+
154
+ export default LocalAudiolevel;