@webex/calling 3.12.0-next.4 → 3.12.0-next.40

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.
Files changed (204) hide show
  1. package/dist/CallingClient/CallingClient.js +463 -205
  2. package/dist/CallingClient/CallingClient.js.map +1 -1
  3. package/dist/CallingClient/CallingClient.test.js +170 -77
  4. package/dist/CallingClient/CallingClient.test.js.map +1 -1
  5. package/dist/CallingClient/calling/call.js +589 -445
  6. package/dist/CallingClient/calling/call.js.map +1 -1
  7. package/dist/CallingClient/calling/call.test.js +695 -445
  8. package/dist/CallingClient/calling/call.test.js.map +1 -1
  9. package/dist/CallingClient/calling/callManager.js +53 -30
  10. package/dist/CallingClient/calling/callManager.js.map +1 -1
  11. package/dist/CallingClient/calling/callManager.test.js +35 -0
  12. package/dist/CallingClient/calling/callManager.test.js.map +1 -1
  13. package/dist/CallingClient/calling/types.js +2 -0
  14. package/dist/CallingClient/calling/types.js.map +1 -1
  15. package/dist/CallingClient/constants.js +25 -3
  16. package/dist/CallingClient/constants.js.map +1 -1
  17. package/dist/CallingClient/line/index.js +4 -1
  18. package/dist/CallingClient/line/index.js.map +1 -1
  19. package/dist/CallingClient/line/line.test.js +16 -1
  20. package/dist/CallingClient/line/line.test.js.map +1 -1
  21. package/dist/CallingClient/registration/register.js +712 -406
  22. package/dist/CallingClient/registration/register.js.map +1 -1
  23. package/dist/CallingClient/registration/register.test.js +202 -21
  24. package/dist/CallingClient/registration/register.test.js.map +1 -1
  25. package/dist/CallingClient/registration/types.js.map +1 -1
  26. package/dist/CallingClient/registration/webWorker.js +41 -104
  27. package/dist/CallingClient/registration/webWorker.js.map +1 -1
  28. package/dist/CallingClient/registration/webWorker.test.js +39 -153
  29. package/dist/CallingClient/registration/webWorker.test.js.map +1 -1
  30. package/dist/CallingClient/registration/webWorkerStr.js +1 -1
  31. package/dist/CallingClient/registration/webWorkerStr.js.map +1 -1
  32. package/dist/CallingClient/utils/constants.js +46 -0
  33. package/dist/CallingClient/utils/constants.js.map +1 -0
  34. package/dist/CallingClient/utils/index.js +63 -0
  35. package/dist/CallingClient/utils/index.js.map +1 -0
  36. package/dist/CallingClient/utils/mobiusSocketMapper.js +122 -0
  37. package/dist/CallingClient/utils/mobiusSocketMapper.js.map +1 -0
  38. package/dist/CallingClient/utils/mobiusSocketMapper.test.js +211 -0
  39. package/dist/CallingClient/utils/mobiusSocketMapper.test.js.map +1 -0
  40. package/dist/CallingClient/utils/request.js +354 -0
  41. package/dist/CallingClient/utils/request.js.map +1 -0
  42. package/dist/CallingClient/utils/request.test.js +881 -0
  43. package/dist/CallingClient/utils/request.test.js.map +1 -0
  44. package/dist/CallingClient/utils/types.js +7 -0
  45. package/dist/CallingClient/utils/types.js.map +1 -0
  46. package/dist/CallingClient/utils/wsFeatureFlag.js +70 -0
  47. package/dist/CallingClient/utils/wsFeatureFlag.js.map +1 -0
  48. package/dist/CallingClient/utils/wsFeatureFlag.test.js +139 -0
  49. package/dist/CallingClient/utils/wsFeatureFlag.test.js.map +1 -0
  50. package/dist/Contacts/ContactsClient.js +13 -11
  51. package/dist/Contacts/ContactsClient.js.map +1 -1
  52. package/dist/Contacts/ContactsClient.test.js +3 -8
  53. package/dist/Contacts/ContactsClient.test.js.map +1 -1
  54. package/dist/Events/types.js +1 -11
  55. package/dist/Events/types.js.map +1 -1
  56. package/dist/Metrics/index.js +63 -2
  57. package/dist/Metrics/index.js.map +1 -1
  58. package/dist/Metrics/index.test.js +357 -1
  59. package/dist/Metrics/index.test.js.map +1 -1
  60. package/dist/Metrics/types.js +19 -1
  61. package/dist/Metrics/types.js.map +1 -1
  62. package/dist/SDKConnector/types.js.map +1 -1
  63. package/dist/common/Utils.js +138 -44
  64. package/dist/common/Utils.js.map +1 -1
  65. package/dist/common/testUtil.js +8 -4
  66. package/dist/common/testUtil.js.map +1 -1
  67. package/dist/common/types.js +2 -0
  68. package/dist/common/types.js.map +1 -1
  69. package/dist/mobius-socket/config.js +24 -0
  70. package/dist/mobius-socket/config.js.map +1 -0
  71. package/dist/mobius-socket/errors.js +143 -0
  72. package/dist/mobius-socket/errors.js.map +1 -0
  73. package/dist/mobius-socket/errors.test.js +20 -0
  74. package/dist/mobius-socket/errors.test.js.map +1 -0
  75. package/dist/mobius-socket/index.js +57 -0
  76. package/dist/mobius-socket/index.js.map +1 -0
  77. package/dist/mobius-socket/mobius-socket-events.test.js +492 -0
  78. package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -0
  79. package/dist/mobius-socket/mobius-socket.js +841 -0
  80. package/dist/mobius-socket/mobius-socket.js.map +1 -0
  81. package/dist/mobius-socket/mobius-socket.test.js +1845 -0
  82. package/dist/mobius-socket/mobius-socket.test.js.map +1 -0
  83. package/dist/mobius-socket/socket/constants.js +55 -0
  84. package/dist/mobius-socket/socket/constants.js.map +1 -0
  85. package/dist/mobius-socket/socket/index.js +15 -0
  86. package/dist/mobius-socket/socket/index.js.map +1 -0
  87. package/dist/mobius-socket/socket/socket-base.js +604 -0
  88. package/dist/mobius-socket/socket/socket-base.js.map +1 -0
  89. package/dist/mobius-socket/socket/socket.js +19 -0
  90. package/dist/mobius-socket/socket/socket.js.map +1 -0
  91. package/dist/mobius-socket/socket/socket.shim.js +26 -0
  92. package/dist/mobius-socket/socket/socket.shim.js.map +1 -0
  93. package/dist/mobius-socket/socket/types.js +7 -0
  94. package/dist/mobius-socket/socket/types.js.map +1 -0
  95. package/dist/mobius-socket/socket.test.js +727 -0
  96. package/dist/mobius-socket/socket.test.js.map +1 -0
  97. package/dist/mobius-socket/test/mocha-helpers.js +23 -0
  98. package/dist/mobius-socket/test/mocha-helpers.js.map +1 -0
  99. package/dist/mobius-socket/test/promise-tick.js +28 -0
  100. package/dist/mobius-socket/test/promise-tick.js.map +1 -0
  101. package/dist/mobius-socket/types.js +7 -0
  102. package/dist/mobius-socket/types.js.map +1 -0
  103. package/dist/module/CallingClient/CallingClient.js +141 -10
  104. package/dist/module/CallingClient/calling/call.js +177 -61
  105. package/dist/module/CallingClient/calling/callManager.js +27 -7
  106. package/dist/module/CallingClient/calling/types.js +2 -0
  107. package/dist/module/CallingClient/constants.js +21 -0
  108. package/dist/module/CallingClient/line/index.js +2 -2
  109. package/dist/module/CallingClient/registration/register.js +234 -62
  110. package/dist/module/CallingClient/registration/webWorker.js +42 -61
  111. package/dist/module/CallingClient/registration/webWorkerStr.js +47 -82
  112. package/dist/module/CallingClient/utils/constants.js +30 -0
  113. package/dist/module/CallingClient/utils/index.js +5 -0
  114. package/dist/module/CallingClient/utils/mobiusSocketMapper.js +72 -0
  115. package/dist/module/CallingClient/utils/request.js +165 -0
  116. package/dist/module/CallingClient/utils/types.js +1 -0
  117. package/dist/module/CallingClient/utils/wsFeatureFlag.js +41 -0
  118. package/dist/module/Contacts/ContactsClient.js +1 -1
  119. package/dist/module/Events/types.js +0 -10
  120. package/dist/module/Metrics/index.js +48 -1
  121. package/dist/module/Metrics/types.js +18 -0
  122. package/dist/module/common/Utils.js +52 -12
  123. package/dist/module/common/testUtil.js +5 -1
  124. package/dist/module/common/types.js +2 -0
  125. package/dist/module/mobius-socket/config.js +15 -0
  126. package/dist/module/mobius-socket/errors.js +58 -0
  127. package/dist/module/mobius-socket/index.js +24 -0
  128. package/dist/module/mobius-socket/mobius-socket.js +589 -0
  129. package/dist/module/mobius-socket/socket/constants.js +26 -0
  130. package/dist/module/mobius-socket/socket/index.js +4 -0
  131. package/dist/module/mobius-socket/socket/socket-base.js +368 -0
  132. package/dist/module/mobius-socket/socket/socket.js +9 -0
  133. package/dist/module/mobius-socket/socket/socket.shim.js +12 -0
  134. package/dist/module/mobius-socket/socket/types.js +1 -0
  135. package/dist/module/mobius-socket/types.js +1 -0
  136. package/dist/types/CallingClient/CallingClient.d.ts +7 -0
  137. package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
  138. package/dist/types/CallingClient/calling/call.d.ts +12 -0
  139. package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
  140. package/dist/types/CallingClient/calling/callManager.d.ts +3 -2
  141. package/dist/types/CallingClient/calling/callManager.d.ts.map +1 -1
  142. package/dist/types/CallingClient/calling/types.d.ts +34 -9
  143. package/dist/types/CallingClient/calling/types.d.ts.map +1 -1
  144. package/dist/types/CallingClient/constants.d.ts +21 -0
  145. package/dist/types/CallingClient/constants.d.ts.map +1 -1
  146. package/dist/types/CallingClient/line/index.d.ts +1 -1
  147. package/dist/types/CallingClient/line/index.d.ts.map +1 -1
  148. package/dist/types/CallingClient/registration/register.d.ts +7 -1
  149. package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
  150. package/dist/types/CallingClient/registration/types.d.ts +4 -2
  151. package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
  152. package/dist/types/CallingClient/registration/webWorker.d.ts.map +1 -1
  153. package/dist/types/CallingClient/registration/webWorkerStr.d.ts +1 -1
  154. package/dist/types/CallingClient/registration/webWorkerStr.d.ts.map +1 -1
  155. package/dist/types/CallingClient/utils/constants.d.ts +30 -0
  156. package/dist/types/CallingClient/utils/constants.d.ts.map +1 -0
  157. package/dist/types/CallingClient/utils/index.d.ts +6 -0
  158. package/dist/types/CallingClient/utils/index.d.ts.map +1 -0
  159. package/dist/types/CallingClient/utils/mobiusSocketMapper.d.ts +5 -0
  160. package/dist/types/CallingClient/utils/mobiusSocketMapper.d.ts.map +1 -0
  161. package/dist/types/CallingClient/utils/request.d.ts +24 -0
  162. package/dist/types/CallingClient/utils/request.d.ts.map +1 -0
  163. package/dist/types/CallingClient/utils/types.d.ts +29 -0
  164. package/dist/types/CallingClient/utils/types.d.ts.map +1 -0
  165. package/dist/types/CallingClient/utils/wsFeatureFlag.d.ts +4 -0
  166. package/dist/types/CallingClient/utils/wsFeatureFlag.d.ts.map +1 -0
  167. package/dist/types/Events/types.d.ts +4 -11
  168. package/dist/types/Events/types.d.ts.map +1 -1
  169. package/dist/types/Metrics/index.d.ts.map +1 -1
  170. package/dist/types/Metrics/types.d.ts +19 -2
  171. package/dist/types/Metrics/types.d.ts.map +1 -1
  172. package/dist/types/SDKConnector/types.d.ts +24 -0
  173. package/dist/types/SDKConnector/types.d.ts.map +1 -1
  174. package/dist/types/common/Utils.d.ts +9 -2
  175. package/dist/types/common/Utils.d.ts.map +1 -1
  176. package/dist/types/common/testUtil.d.ts +4 -1
  177. package/dist/types/common/testUtil.d.ts.map +1 -1
  178. package/dist/types/common/types.d.ts +3 -0
  179. package/dist/types/common/types.d.ts.map +1 -1
  180. package/dist/types/mobius-socket/config.d.ts +17 -0
  181. package/dist/types/mobius-socket/config.d.ts.map +1 -0
  182. package/dist/types/mobius-socket/errors.d.ts +32 -0
  183. package/dist/types/mobius-socket/errors.d.ts.map +1 -0
  184. package/dist/types/mobius-socket/index.d.ts +14 -0
  185. package/dist/types/mobius-socket/index.d.ts.map +1 -0
  186. package/dist/types/mobius-socket/mobius-socket.d.ts +48 -0
  187. package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -0
  188. package/dist/types/mobius-socket/socket/constants.d.ts +27 -0
  189. package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -0
  190. package/dist/types/mobius-socket/socket/index.d.ts +5 -0
  191. package/dist/types/mobius-socket/socket/index.d.ts.map +1 -0
  192. package/dist/types/mobius-socket/socket/socket-base.d.ts +43 -0
  193. package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -0
  194. package/dist/types/mobius-socket/socket/socket.d.ts +6 -0
  195. package/dist/types/mobius-socket/socket/socket.d.ts.map +1 -0
  196. package/dist/types/mobius-socket/socket/socket.shim.d.ts +6 -0
  197. package/dist/types/mobius-socket/socket/socket.shim.d.ts.map +1 -0
  198. package/dist/types/mobius-socket/socket/types.d.ts +61 -0
  199. package/dist/types/mobius-socket/socket/types.d.ts.map +1 -0
  200. package/dist/types/mobius-socket/types.d.ts +21 -0
  201. package/dist/types/mobius-socket/types.d.ts.map +1 -0
  202. package/package.json +20 -5
  203. package/src/mobius-socket/socket/socket.shim.ts +22 -0
  204. package/src/mobius-socket/socket/socket.ts +14 -0
@@ -14,9 +14,10 @@ import { CALL_EVENT_KEYS, MEDIA_CONNECTION_EVENT_KEYS, MOBIUS_MIDCALL_STATE, SUP
14
14
  import { DisconnectCause, DisconnectCode, MidCallEventType, MobiusCallState, MUTE_TYPE, RoapScenario, TransferType, } from './types';
15
15
  import log from '../../Logger';
16
16
  import { createCallerId } from './CallerId';
17
- import { METRIC_TYPE, METRIC_EVENT, TRANSFER_ACTION } from '../../Metrics/types';
17
+ import { METRIC_TYPE, METRIC_EVENT, TRANSFER_ACTION, MEDIA_CONNECTION_ACTION, } from '../../Metrics/types';
18
18
  import { getMetricManager } from '../../Metrics';
19
19
  import { METHOD_START_MESSAGE, SERVICES_ENDPOINT } from '../../common/constants';
20
+ import { APIRequest } from '../utils/request';
20
21
  export class Call extends Eventing {
21
22
  sdkConnector;
22
23
  webex;
@@ -48,10 +49,143 @@ export class Call extends Eventing {
48
49
  broadworksCorrelationInfo;
49
50
  serviceIndicator;
50
51
  mediaNegotiationCompleted;
52
+ connectPending;
51
53
  receivedRoapOKSeq;
52
54
  localAudioStream;
53
55
  rtcMetrics;
54
56
  callKeepaliveRetryCount = 0;
57
+ apiRequest;
58
+ handleMediaRoapEvent = async (event) => {
59
+ log.info(`ROAP message to send (rcv from MEDIA-SDK) :
60
+ \n type: ${event.roapMessage?.messageType}, seq: ${event.roapMessage.seq} , version: ${event.roapMessage.version}`, { file: CALL_FILE, method: METHODS.MEDIA_ROAP_EVENTS_LISTENER });
61
+ log.info(`SDP message to send : \n ${event.roapMessage?.sdp}`, {
62
+ file: CALL_FILE,
63
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
64
+ });
65
+ switch (event.roapMessage.messageType) {
66
+ case RoapScenario.OK: {
67
+ const mediaOk = {
68
+ received: false,
69
+ message: event.roapMessage,
70
+ };
71
+ this.sendMediaStateMachineEvt({ type: 'E_ROAP_OK', data: mediaOk });
72
+ break;
73
+ }
74
+ case RoapScenario.OFFER: {
75
+ if (!event.roapMessage.sdp) {
76
+ log.warn('Received OFFER without SDP from media SDK', {
77
+ file: CALL_FILE,
78
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
79
+ });
80
+ break;
81
+ }
82
+ log.info(`before modifying sdp: ${event.roapMessage.sdp}`, {
83
+ file: CALL_FILE,
84
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
85
+ });
86
+ event.roapMessage.sdp = modifySdpForIPv4(event.roapMessage.sdp);
87
+ const sdpVideoPortZero = event.roapMessage.sdp.replace(/^m=(video) (?:\d+) /gim, 'm=$1 0 ');
88
+ log.info(`after modification sdp: ${sdpVideoPortZero}`, {
89
+ file: CALL_FILE,
90
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
91
+ });
92
+ event.roapMessage.sdp = sdpVideoPortZero;
93
+ this.localRoapMessage = event.roapMessage;
94
+ this.sendCallStateMachineEvt({ type: 'E_SEND_CALL_SETUP', data: event.roapMessage });
95
+ break;
96
+ }
97
+ case RoapScenario.ANSWER:
98
+ if (!event.roapMessage.sdp) {
99
+ log.warn('Received OFFER without SDP from media SDK', {
100
+ file: CALL_FILE,
101
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
102
+ });
103
+ break;
104
+ }
105
+ event.roapMessage.sdp = modifySdpForIPv4(event.roapMessage.sdp);
106
+ this.localRoapMessage = event.roapMessage;
107
+ if (this.connectPending) {
108
+ this.sendCallStateMachineEvt({ type: 'E_SEND_CALL_CONNECT' });
109
+ }
110
+ this.sendMediaStateMachineEvt({ type: 'E_SEND_ROAP_ANSWER', data: event.roapMessage });
111
+ break;
112
+ case RoapScenario.ERROR:
113
+ this.sendMediaStateMachineEvt({ type: 'E_ROAP_ERROR', data: event.roapMessage });
114
+ break;
115
+ case RoapScenario.OFFER_RESPONSE:
116
+ if (!event.roapMessage.sdp) {
117
+ log.warn('Received OFFER without SDP from media SDK', {
118
+ file: CALL_FILE,
119
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
120
+ });
121
+ break;
122
+ }
123
+ event.roapMessage.sdp = modifySdpForIPv4(event.roapMessage.sdp);
124
+ this.localRoapMessage = event.roapMessage;
125
+ if (this.connectPending) {
126
+ this.sendCallStateMachineEvt({ type: 'E_SEND_CALL_CONNECT' });
127
+ }
128
+ this.sendMediaStateMachineEvt({ type: 'E_SEND_ROAP_OFFER', data: event.roapMessage });
129
+ break;
130
+ default:
131
+ }
132
+ };
133
+ handleRemoteTrackAdded = (event) => {
134
+ if (event.type === MEDIA_CONNECTION_EVENT_KEYS.MEDIA_TYPE_AUDIO) {
135
+ this.emit(CALL_EVENT_KEYS.REMOTE_MEDIA, event.track);
136
+ }
137
+ };
138
+ static getPeerConnectionStateFromEvent(event, preferredKey) {
139
+ return event[preferredKey] || event.state || 'unknown';
140
+ }
141
+ handleIceGatheringStateChanged = (event) => {
142
+ const iceGatheringState = Call.getPeerConnectionStateFromEvent(event, 'iceGatheringState');
143
+ log.info(`ICE gathering state changed to: ${iceGatheringState}`, {
144
+ file: CALL_FILE,
145
+ method: METHODS.MEDIA_ICE_EVENTS_LISTENER,
146
+ });
147
+ this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA, MEDIA_CONNECTION_ACTION.ICE_GATHERING_STATE_CHANGED, METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, undefined, undefined, iceGatheringState);
148
+ };
149
+ handlePeerConnectionStateChanged = (event) => {
150
+ const connectionState = Call.getPeerConnectionStateFromEvent(event, 'connectionState');
151
+ log.info(`Peer connection state changed to: ${connectionState}`, {
152
+ file: CALL_FILE,
153
+ method: METHODS.MEDIA_ICE_EVENTS_LISTENER,
154
+ });
155
+ this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA, MEDIA_CONNECTION_ACTION.PEER_CONNECTION_STATE_CHANGED, METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, undefined, undefined, connectionState);
156
+ };
157
+ handleIceConnectionStateChanged = (event) => {
158
+ const iceConnectionState = Call.getPeerConnectionStateFromEvent(event, 'iceConnectionState');
159
+ log.info(`ICE connection state changed to: ${iceConnectionState}`, {
160
+ file: CALL_FILE,
161
+ method: METHODS.MEDIA_ICE_EVENTS_LISTENER,
162
+ });
163
+ this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA, MEDIA_CONNECTION_ACTION.ICE_CONNECTION_STATE_CHANGED, METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, undefined, undefined, iceConnectionState);
164
+ };
165
+ handleIceCandidateError = (event) => {
166
+ const iceErrorPayload = {
167
+ address: event.address ?? null,
168
+ errorCode: event.errorCode,
169
+ errorText: event.errorText,
170
+ port: event.port ?? null,
171
+ url: event.url,
172
+ };
173
+ log.warn(`ICE candidate error occurred: ${JSON.stringify(iceErrorPayload)}`, {
174
+ file: CALL_FILE,
175
+ method: METHODS.MEDIA_ICE_EVENTS_LISTENER,
176
+ });
177
+ const callError = createCallError(`ICE candidate error occurred: ${JSON.stringify(iceErrorPayload)}`, { file: CALL_FILE, method: METHODS.MEDIA_ICE_EVENTS_LISTENER }, ERROR_TYPE.CALL_ERROR, this.correlationId, ERROR_LAYER.MEDIA);
178
+ this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA_ERROR, MEDIA_CONNECTION_ACTION.ICE_CANDIDATE_ERROR, METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, undefined, undefined, undefined, callError);
179
+ };
180
+ handleRoapFailure = (error) => {
181
+ const failureMessage = error.message || 'Unknown ROAP failure received from media SDK';
182
+ log.warn(`ROAP failure occurred: ${failureMessage}`, {
183
+ file: CALL_FILE,
184
+ method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
185
+ });
186
+ const callError = createCallError(`ROAP failure occurred: ${failureMessage}`, { file: CALL_FILE, method: METHODS.MEDIA_ROAP_EVENTS_LISTENER }, ERROR_TYPE.CALL_ERROR, this.correlationId, ERROR_LAYER.MEDIA);
187
+ this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA_ERROR, MEDIA_CONNECTION_ACTION.ROAP_FAILURE, METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, undefined, undefined, undefined, callError);
188
+ };
55
189
  isMuted() {
56
190
  return this.muted;
57
191
  }
@@ -86,6 +220,7 @@ export class Call extends Eventing {
86
220
  this.mobiusUrl = activeUrl;
87
221
  this.receivedRoapOKSeq = 0;
88
222
  this.mediaNegotiationCompleted = false;
223
+ this.connectPending = false;
89
224
  log.info(`Webex Calling Url:- ${this.mobiusUrl}`, {
90
225
  file: CALL_FILE,
91
226
  method: METHODS.CONSTRUCTOR,
@@ -102,6 +237,7 @@ export class Call extends Eventing {
102
237
  this.remoteRoapMessage = null;
103
238
  this.disconnectReason = { code: DisconnectCode.NORMAL, cause: DisconnectCause.NORMAL };
104
239
  this.rtcMetrics = new RtcMetrics(this.webex, { callId: this.callId }, this.correlationId);
240
+ this.apiRequest = APIRequest.getInstance({ webex: this.webex });
105
241
  const callMachine = createMachine({
106
242
  schema: {
107
243
  context: {},
@@ -281,6 +417,11 @@ export class Call extends Eventing {
281
417
  },
282
418
  },
283
419
  on: {
420
+ E_SEND_CALL_CONNECT: {
421
+ cond: () => this.connectPending,
422
+ target: 'S_SEND_CALL_CONNECT',
423
+ actions: ['outgoingCallConnect'],
424
+ },
284
425
  E_CALL_ESTABLISHED: {
285
426
  target: 'S_CALL_ESTABLISHED',
286
427
  actions: ['callEstablished'],
@@ -842,6 +983,7 @@ export class Call extends Eventing {
842
983
  }
843
984
  }
844
985
  async handleOutgoingCallConnect(event) {
986
+ this.connectPending = false;
845
987
  log.info(`${METHOD_START_MESSAGE} with: ${this.getCorrelationId()}`, {
846
988
  file: CALL_FILE,
847
989
  method: METHODS.HANDLE_OUTGOING_CALL_CONNECT,
@@ -851,6 +993,7 @@ export class Call extends Eventing {
851
993
  file: CALL_FILE,
852
994
  method: METHODS.HANDLE_OUTGOING_CALL_CONNECT,
853
995
  });
996
+ this.connectPending = true;
854
997
  return;
855
998
  }
856
999
  try {
@@ -910,6 +1053,7 @@ export class Call extends Eventing {
910
1053
  clearInterval(this.sessionTimer);
911
1054
  }
912
1055
  if (this.mediaConnection) {
1056
+ this.unregisterMediaConnectionListeners();
913
1057
  this.mediaConnection.close();
914
1058
  log.info('Closing media channel', {
915
1059
  file: CALL_FILE,
@@ -953,6 +1097,7 @@ export class Call extends Eventing {
953
1097
  clearInterval(this.sessionTimer);
954
1098
  }
955
1099
  if (this.mediaConnection) {
1100
+ this.unregisterMediaConnectionListeners();
956
1101
  this.mediaConnection.close();
957
1102
  log.info('Closing media channel', {
958
1103
  file: CALL_FILE,
@@ -1064,6 +1209,7 @@ export class Call extends Eventing {
1064
1209
  clearInterval(this.sessionTimer);
1065
1210
  }
1066
1211
  if (this.mediaConnection) {
1212
+ this.unregisterMediaConnectionListeners();
1067
1213
  this.mediaConnection.close();
1068
1214
  log.info('Closing media channel', {
1069
1215
  file: CALL_FILE,
@@ -1435,6 +1581,7 @@ export class Call extends Eventing {
1435
1581
  this.initMediaConnection(localAudioTrack);
1436
1582
  this.mediaRoapEventsListener();
1437
1583
  this.mediaTrackListener();
1584
+ this.mediaIceEventsListener();
1438
1585
  this.registerListeners(localAudioStream);
1439
1586
  }
1440
1587
  if (this.callStateMachine.state.value === 'S_SEND_CALL_PROGRESS') {
@@ -1465,6 +1612,7 @@ export class Call extends Eventing {
1465
1612
  this.initMediaConnection(localAudioTrack);
1466
1613
  this.mediaRoapEventsListener();
1467
1614
  this.mediaTrackListener();
1615
+ this.mediaIceEventsListener();
1468
1616
  this.registerListeners(localAudioStream);
1469
1617
  }
1470
1618
  if (this.mediaStateMachine.state.value === 'S_ROAP_IDLE') {
@@ -1485,7 +1633,7 @@ export class Call extends Eventing {
1485
1633
  mediaId: uuid(),
1486
1634
  },
1487
1635
  };
1488
- return this.webex.request({
1636
+ return this.apiRequest.makeRequest({
1489
1637
  uri: `${this.mobiusUrl}${DEVICES_ENDPOINT_RESOURCE}/${this.deviceId}/${CALL_ENDPOINT_RESOURCE}`,
1490
1638
  method: HTTP_METHODS.POST,
1491
1639
  service: ALLOWED_SERVICES.MOBIUS,
@@ -1509,7 +1657,7 @@ export class Call extends Eventing {
1509
1657
  file: CALL_FILE,
1510
1658
  method: 'patch',
1511
1659
  });
1512
- return this.webex.request({
1660
+ return this.apiRequest.makeRequest({
1513
1661
  uri: `${this.mobiusUrl}${DEVICES_ENDPOINT_RESOURCE}/${this.deviceId}/${CALLS_ENDPOINT_RESOURCE}/${this.callId}`,
1514
1662
  method: HTTP_METHODS.PATCH,
1515
1663
  service: ALLOWED_SERVICES.MOBIUS,
@@ -1574,10 +1722,10 @@ export class Call extends Eventing {
1574
1722
  });
1575
1723
  }
1576
1724
  }
1577
- return this.webex.request(request);
1725
+ return this.apiRequest.makeRequest(request);
1578
1726
  }
1579
1727
  async postStatus() {
1580
- return this.webex.request({
1728
+ return this.apiRequest.makeRequest({
1581
1729
  uri: `${this.mobiusUrl}${DEVICES_ENDPOINT_RESOURCE}/${this.deviceId}/${CALLS_ENDPOINT_RESOURCE}/${this.callId}/${CALL_STATUS_RESOURCE}`,
1582
1730
  method: HTTP_METHODS.POST,
1583
1731
  service: ALLOWED_SERVICES.MOBIUS,
@@ -1688,7 +1836,7 @@ export class Call extends Eventing {
1688
1836
  file: CALL_FILE,
1689
1837
  method: METHODS.POST_MEDIA,
1690
1838
  });
1691
- return this.webex.request({
1839
+ return this.apiRequest.makeRequest({
1692
1840
  uri: `${this.mobiusUrl}${DEVICES_ENDPOINT_RESOURCE}/${this.deviceId}/${CALLS_ENDPOINT_RESOURCE}/${this.callId}/${MEDIA_ENDPOINT_RESOURCE}`,
1693
1841
  method: HTTP_METHODS.POST,
1694
1842
  service: ALLOWED_SERVICES.MOBIUS,
@@ -1710,61 +1858,29 @@ export class Call extends Eventing {
1710
1858
  });
1711
1859
  }
1712
1860
  mediaRoapEventsListener() {
1713
- this.mediaConnection.on(MediaConnectionEventNames.ROAP_MESSAGE_TO_SEND, async (event) => {
1714
- log.info(`ROAP message to send (rcv from MEDIA-SDK) :
1715
- \n type: ${event.roapMessage?.messageType}, seq: ${event.roapMessage.seq} , version: ${event.roapMessage.version}`, { file: CALL_FILE, method: METHODS.MEDIA_ROAP_EVENTS_LISTENER });
1716
- log.info(`SDP message to send : \n ${event.roapMessage?.sdp}`, {
1717
- file: CALL_FILE,
1718
- method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
1719
- });
1720
- switch (event.roapMessage.messageType) {
1721
- case RoapScenario.OK: {
1722
- const mediaOk = {
1723
- received: false,
1724
- message: event.roapMessage,
1725
- };
1726
- this.sendMediaStateMachineEvt({ type: 'E_ROAP_OK', data: mediaOk });
1727
- break;
1728
- }
1729
- case RoapScenario.OFFER: {
1730
- log.info(`before modifying sdp: ${event.roapMessage.sdp}`, {
1731
- file: CALL_FILE,
1732
- method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
1733
- });
1734
- event.roapMessage.sdp = modifySdpForIPv4(event.roapMessage.sdp);
1735
- const sdpVideoPortZero = event.roapMessage.sdp.replace(/^m=(video) (?:\d+) /gim, 'm=$1 0 ');
1736
- log.info(`after modification sdp: ${sdpVideoPortZero}`, {
1737
- file: CALL_FILE,
1738
- method: METHODS.MEDIA_ROAP_EVENTS_LISTENER,
1739
- });
1740
- event.roapMessage.sdp = sdpVideoPortZero;
1741
- this.localRoapMessage = event.roapMessage;
1742
- this.sendCallStateMachineEvt({ type: 'E_SEND_CALL_SETUP', data: event.roapMessage });
1743
- break;
1744
- }
1745
- case RoapScenario.ANSWER:
1746
- event.roapMessage.sdp = modifySdpForIPv4(event.roapMessage.sdp);
1747
- this.localRoapMessage = event.roapMessage;
1748
- this.sendMediaStateMachineEvt({ type: 'E_SEND_ROAP_ANSWER', data: event.roapMessage });
1749
- break;
1750
- case RoapScenario.ERROR:
1751
- this.sendMediaStateMachineEvt({ type: 'E_ROAP_ERROR', data: event.roapMessage });
1752
- break;
1753
- case RoapScenario.OFFER_RESPONSE:
1754
- event.roapMessage.sdp = modifySdpForIPv4(event.roapMessage.sdp);
1755
- this.localRoapMessage = event.roapMessage;
1756
- this.sendMediaStateMachineEvt({ type: 'E_SEND_ROAP_OFFER', data: event.roapMessage });
1757
- break;
1758
- default:
1759
- }
1760
- });
1861
+ this.mediaConnection.on(MediaConnectionEventNames.ROAP_MESSAGE_TO_SEND, this.handleMediaRoapEvent);
1862
+ this.mediaConnection.on(MediaConnectionEventNames.ROAP_FAILURE, this.handleRoapFailure);
1761
1863
  }
1762
1864
  mediaTrackListener() {
1763
- this.mediaConnection.on(MediaConnectionEventNames.REMOTE_TRACK_ADDED, (e) => {
1764
- if (e.type === MEDIA_CONNECTION_EVENT_KEYS.MEDIA_TYPE_AUDIO) {
1765
- this.emit(CALL_EVENT_KEYS.REMOTE_MEDIA, e.track);
1766
- }
1767
- });
1865
+ this.mediaConnection.on(MediaConnectionEventNames.REMOTE_TRACK_ADDED, this.handleRemoteTrackAdded);
1866
+ }
1867
+ mediaIceEventsListener() {
1868
+ this.mediaConnection.on(MediaConnectionEventNames.ICE_GATHERING_STATE_CHANGED, this.handleIceGatheringStateChanged);
1869
+ this.mediaConnection.on(MediaConnectionEventNames.PEER_CONNECTION_STATE_CHANGED, this.handlePeerConnectionStateChanged);
1870
+ this.mediaConnection.on(MediaConnectionEventNames.ICE_CONNECTION_STATE_CHANGED, this.handleIceConnectionStateChanged);
1871
+ this.mediaConnection.on(MediaConnectionEventNames.ICE_CANDIDATE_ERROR, this.handleIceCandidateError);
1872
+ }
1873
+ unregisterMediaConnectionListeners() {
1874
+ if (!this.mediaConnection || typeof this.mediaConnection.off !== 'function') {
1875
+ return;
1876
+ }
1877
+ this.mediaConnection.off(MediaConnectionEventNames.ROAP_MESSAGE_TO_SEND, this.handleMediaRoapEvent);
1878
+ this.mediaConnection.off(MediaConnectionEventNames.ROAP_FAILURE, this.handleRoapFailure);
1879
+ this.mediaConnection.off(MediaConnectionEventNames.REMOTE_TRACK_ADDED, this.handleRemoteTrackAdded);
1880
+ this.mediaConnection.off(MediaConnectionEventNames.ICE_GATHERING_STATE_CHANGED, this.handleIceGatheringStateChanged);
1881
+ this.mediaConnection.off(MediaConnectionEventNames.PEER_CONNECTION_STATE_CHANGED, this.handlePeerConnectionStateChanged);
1882
+ this.mediaConnection.off(MediaConnectionEventNames.ICE_CONNECTION_STATE_CHANGED, this.handleIceConnectionStateChanged);
1883
+ this.mediaConnection.off(MediaConnectionEventNames.ICE_CANDIDATE_ERROR, this.handleIceCandidateError);
1768
1884
  }
1769
1885
  onEffectEnabled = () => {
1770
1886
  this.metricManager.submitBNRMetric(METRIC_EVENT.BNR_ENABLED, METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId);
@@ -1809,7 +1925,7 @@ export class Call extends Eventing {
1809
1925
  }
1810
1926
  async delete() {
1811
1927
  const disconnectMetrics = await this.getCallStats();
1812
- return this.webex.request({
1928
+ return this.apiRequest.makeRequest({
1813
1929
  uri: `${this.mobiusUrl}${DEVICES_ENDPOINT_RESOURCE}/${this.deviceId}/${CALLS_ENDPOINT_RESOURCE}/${this.callId}`,
1814
1930
  method: HTTP_METHODS.DELETE,
1815
1931
  service: ALLOWED_SERVICES.MOBIUS,
@@ -1834,7 +1950,7 @@ export class Call extends Eventing {
1834
1950
  this.metricManager.submitCallMetric(METRIC_EVENT.CALL_ERROR, transferMetricAction || this.callStateMachine.state.value.toString(), METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, error);
1835
1951
  }
1836
1952
  else {
1837
- this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA_ERROR, this.mediaStateMachine.state.value.toString(), METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, this.localRoapMessage.sdp, this.remoteRoapMessage?.sdp, error);
1953
+ this.metricManager.submitMediaMetric(METRIC_EVENT.MEDIA_ERROR, this.mediaStateMachine.state.value.toString(), METRIC_TYPE.BEHAVIORAL, this.callId, this.correlationId, this.localRoapMessage.sdp, this.remoteRoapMessage?.sdp, undefined, error);
1838
1954
  }
1839
1955
  }
1840
1956
  handleMidCallEvent(event) {
@@ -1,3 +1,4 @@
1
+ import { APIRequest } from '../utils/request';
1
2
  import { METHOD_START_MESSAGE } from '../../common/constants';
2
3
  import { CALL_MANAGER_FILE, METHODS } from '../constants';
3
4
  import { CALLING_CLIENT_EVENT_KEYS, LINE_EVENT_KEYS } from '../../Events/types';
@@ -15,6 +16,7 @@ export class CallManager extends Eventing {
15
16
  activeMobiusUrl;
16
17
  serviceIndicator;
17
18
  lineDict;
19
+ apiRequest;
18
20
  constructor(webex, indicator) {
19
21
  super();
20
22
  this.sdkConnector = SDKConnector;
@@ -24,6 +26,7 @@ export class CallManager extends Eventing {
24
26
  }
25
27
  this.lineDict = {};
26
28
  this.webex = this.sdkConnector.getWebex();
29
+ this.apiRequest = APIRequest.getInstance({ webex: this.webex });
27
30
  this.callCollection = {};
28
31
  this.activeMobiusUrl = '';
29
32
  this.listenForWsEvents();
@@ -59,13 +62,15 @@ export class CallManager extends Eventing {
59
62
  });
60
63
  }
61
64
  listenForWsEvents() {
62
- this.sdkConnector.registerListener('event:mobius', async (event) => {
63
- this.dequeueWsEvents(event);
64
- });
65
- log.info('Successfully registered listener for Mobius events', {
66
- file: CALL_MANAGER_FILE,
67
- method: METHODS.REGISTER_SESSIONS_LISTENER,
68
- });
65
+ if (!this.apiRequest.isSocketEnabled()) {
66
+ this.sdkConnector.registerListener('event:mobius', async (event) => {
67
+ this.dequeueWsEvents(event);
68
+ });
69
+ log.info('Successfully registered listener for Mobius events', {
70
+ file: CALL_MANAGER_FILE,
71
+ method: METHODS.REGISTER_SESSIONS_LISTENER,
72
+ });
73
+ }
69
74
  }
70
75
  dequeueWsEvents(event) {
71
76
  log.info(`${METHOD_START_MESSAGE} with event ${event}`, {
@@ -147,6 +152,21 @@ export class CallManager extends Eventing {
147
152
  call.sendCallStateMachineEvt({ type: 'E_RECV_CALL_PROGRESS', data: mobiusEvent.data });
148
153
  break;
149
154
  }
155
+ case MobiusEventType.CALL_INFO: {
156
+ log.log(`Received call info mobiusEvent for call: ${correlationId}`, {
157
+ file: CALL_MANAGER_FILE,
158
+ method: METHODS.DEQUEUE_WS_EVENTS,
159
+ });
160
+ const call = this.getCall(correlationId);
161
+ if (call && mobiusEvent.data.callerId) {
162
+ log.info('Processing Caller-Id data', {
163
+ file: CALL_MANAGER_FILE,
164
+ method: METHODS.DEQUEUE_WS_EVENTS,
165
+ });
166
+ call.startCallerIdResolution(mobiusEvent.data.callerId);
167
+ }
168
+ break;
169
+ }
150
170
  case MobiusEventType.CALL_MEDIA: {
151
171
  log.log(`Received call media mobiusEvent for call: ${correlationId}`, {
152
172
  file: CALL_MANAGER_FILE,
@@ -5,6 +5,8 @@ export var MobiusEventType;
5
5
  MobiusEventType["CALL_CONNECTED"] = "mobius.callconnected";
6
6
  MobiusEventType["CALL_MEDIA"] = "mobius.media";
7
7
  MobiusEventType["CALL_DISCONNECTED"] = "mobius.calldisconnected";
8
+ MobiusEventType["CALL_INFO"] = "mobius.callinfo";
9
+ MobiusEventType["REGISTRATION_DOWN"] = "registration.down";
8
10
  })(MobiusEventType || (MobiusEventType = {}));
9
11
  export var MediaState;
10
12
  (function (MediaState) {
@@ -69,6 +69,9 @@ export const CALL_FILE = 'call';
69
69
  export const CALL_MANAGER_FILE = 'callManager';
70
70
  export const METRIC_FILE = 'metric';
71
71
  export const REGISTRATION_FILE = 'register';
72
+ export const REQUEST_FILE = 'REQUEST';
73
+ export const MOBIUS_SOCKET_MAPPER_FILE = 'mobiusSocketMapper';
74
+ export const WS_FEATURE_FLAG_FILE = 'wsFeatureFlag';
72
75
  export const CODEC_ID = 'codecId';
73
76
  export const MEDIA_ID = 'id';
74
77
  export const RTC_ICE_CANDIDATE_PAIR = 'RTCIceCandidatePair_';
@@ -127,6 +130,7 @@ export const MOBIUS_EU_INT = 'mobius-eu-central-1.int.infra.webex.com';
127
130
  export const FAILOVER_CACHE_PREFIX = 'wxc-failover-state';
128
131
  export const ACTIVE_MOBIUS_STORAGE_KEY = 'wxc-active-mobius';
129
132
  export const ICE_CANDIDATES_TIMEOUT = 3000;
133
+ export const WCC_CALLING_RTMS_DOMAIN = 'wcc-calling-rtms-domain';
130
134
  export const METHODS = {
131
135
  CONSTRUCTOR: 'constructor',
132
136
  CREATE_CALL: 'createCall',
@@ -179,6 +183,7 @@ export const METHODS = {
179
183
  POST_MEDIA: 'postMedia',
180
184
  MEDIA_ROAP_EVENTS_LISTENER: 'mediaRoapEventsListener',
181
185
  MEDIA_TRACK_LISTENER: 'mediaTrackListener',
186
+ MEDIA_ICE_EVENTS_LISTENER: 'mediaIceEventsListener',
182
187
  ON_EFFECT_ENABLED: 'onEffectEnabled',
183
188
  ON_EFFECT_DISABLED: 'onEffectDisabled',
184
189
  UPDATE_TRACK: 'updateTrack',
@@ -230,4 +235,20 @@ export const METHODS = {
230
235
  UPLOAD_LOGS: 'uploadLogs',
231
236
  GET_SDK_CONNECTOR: 'getSDKConnector',
232
237
  GET_CONNECTED_CALL: 'getConnectedCall',
238
+ CONNECT_TO_MOBIUS_SOCKET: 'connectToMobiusSocket',
239
+ REGISTER_MOBIUS_SOCKET_LISTENER: 'registerMobiusSocketListener',
240
+ UNREGISTER_MOBIUS_SOCKET_LISTENER: 'unregisterMobiusSocketListener',
241
+ HANDLE_MOBIUS_ASYNC_EVENT: 'handleMobiusAsyncEvent',
242
+ HANDLE_REGISTRATION_DOWN_EVENT: 'handleRegistrationDownEvent',
243
+ DISCONNECT_FROM_MOBIUS_SOCKET: 'disconnectFromMobiusSocket',
244
+ MAKE_REQUEST: 'makeRequest',
245
+ DERIVE_MOBIUS_SOCKET_MESSAGE_TYPE: 'deriveMobiusSocketMessageType',
246
+ IS_MOBIUS_WSS_ENABLED: 'isMobiusWssEnabled',
247
+ RESTORE_PREVIOUS_REGISTRATION: 'restorePreviousRegistration',
248
+ RESTART_REGISTRATION: 'restartRegistration',
249
+ TRIGGER_REGISTRATION: 'triggerRegistration',
250
+ HANDLE_404_KEEPALIVE_FAILURE: 'handle404KeepaliveFailure',
251
+ INITIATE_FAILBACK: 'initiateFailback',
252
+ EXECUTE_FAILBACK: 'executeFailback',
253
+ GET_RTMS_DOMAIN: 'getRTMSDomain',
233
254
  };
@@ -70,12 +70,12 @@ export default class Line extends Eventing {
70
70
  await this.registration.triggerRegistration();
71
71
  });
72
72
  }
73
- async deregister() {
73
+ async deregister(closeMobiusWss = false) {
74
74
  log.info(METHOD_START_MESSAGE, {
75
75
  file: LINE_FILE,
76
76
  method: METHODS.DEREGISTER,
77
77
  });
78
- await this.registration.deregister();
78
+ await this.registration.deregister(closeMobiusWss);
79
79
  this.registration.setStatus(RegistrationStatus.IDLE);
80
80
  }
81
81
  normalizeLine(deviceInfo) {