@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
@@ -1,106 +1,71 @@
1
1
  const webWorkerStr = `/* eslint-env worker */
2
2
 
3
- const uuid = () => {
4
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
5
- const r = (Math.random() * 16) | 0;
6
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
7
- return v.toString(16);
8
- });
9
- };
10
-
11
- // Enum values from the original imports
12
- const HTTP_METHODS = {
13
- GET: 'GET',
14
- POST: 'POST',
15
- PUT: 'PUT',
16
- DELETE: 'DELETE',
17
- PATCH: 'PATCH',
18
- };
19
-
20
3
  const WorkerMessageType = {
21
4
  START_KEEPALIVE: 'START_KEEPALIVE',
22
5
  CLEAR_KEEPALIVE: 'CLEAR_KEEPALIVE',
6
+ SEND_KEEPALIVE: 'SEND_KEEPALIVE',
7
+ KEEPALIVE_RESULT: 'KEEPALIVE_RESULT',
23
8
  KEEPALIVE_SUCCESS: 'KEEPALIVE_SUCCESS',
24
9
  KEEPALIVE_FAILURE: 'KEEPALIVE_FAILURE',
25
10
  };
26
11
 
27
12
  let keepaliveTimer;
13
+ let keepAliveRetryCount = 0;
14
+ let keepaliveInFlight = false;
15
+
16
+ const clearKeepaliveTimer = () => {
17
+ if (keepaliveTimer) {
18
+ clearInterval(keepaliveTimer);
19
+ keepaliveTimer = undefined;
20
+ }
21
+ };
28
22
 
29
23
  const messageHandler = (event) => {
30
24
  const {type} = event.data;
31
25
 
32
- const postKeepAlive = async (accessToken, deviceUrl, url) => {
33
- const response = await fetch(\`\${url}/status\`, {
34
- method: HTTP_METHODS.POST,
35
- headers: {
36
- 'cisco-device-url': deviceUrl,
37
- 'spark-user-agent': 'webex-calling/beta',
38
- Authorization: \`\${accessToken}\`,
39
- trackingId: \`web_worker_\${uuid()}\`,
40
- },
41
- });
42
-
43
- if (!response.ok) {
44
- throw response;
45
- }
46
-
47
- return response;
48
- };
49
-
50
26
  if (type === WorkerMessageType.START_KEEPALIVE) {
51
- let keepAliveRetryCount = 0;
52
- const {accessToken, deviceUrl, interval, retryCountThreshold, url} = event.data;
53
-
54
- if (keepaliveTimer) {
55
- clearInterval(keepaliveTimer);
56
- keepaliveTimer = undefined;
57
- }
58
-
59
- keepaliveTimer = setInterval(async () => {
60
- if (keepAliveRetryCount < retryCountThreshold) {
61
- try {
62
- const res = await postKeepAlive(accessToken, deviceUrl, url);
63
- const statusCode = res.status;
64
- if (keepAliveRetryCount > 0) {
65
- self.postMessage({
66
- type: WorkerMessageType.KEEPALIVE_SUCCESS,
67
- statusCode,
68
- });
69
- }
70
- keepAliveRetryCount = 0;
71
- } catch (err) {
72
- let headers = {};
73
- if(err.headers?.has('Retry-After')) {
74
- headers['retry-after'] = err.headers.get('Retry-After');
75
- }
76
-
77
- if(err.headers?.has('Trackingid')) {
78
- headers['trackingid'] = err.headers.get('Trackingid');
79
- }
27
+ const {interval, retryCountThreshold} = event.data;
28
+
29
+ clearKeepaliveTimer();
30
+ keepAliveRetryCount = 0;
31
+ keepaliveInFlight = false;
32
+
33
+ keepaliveTimer = setInterval(() => {
34
+ if (keepAliveRetryCount < retryCountThreshold && !keepaliveInFlight) {
35
+ keepaliveInFlight = true;
36
+ self.postMessage({
37
+ type: WorkerMessageType.SEND_KEEPALIVE,
38
+ });
39
+ }
40
+ }, interval * 1000);
41
+ }
80
42
 
81
- const error = {
82
- headers,
83
- statusCode: err.status,
84
- statusText: err.statusText,
85
- type: err.type,
86
- };
43
+ if (type === WorkerMessageType.KEEPALIVE_RESULT) {
44
+ keepaliveInFlight = false;
87
45
 
88
- keepAliveRetryCount += 1
89
- self.postMessage({
90
- type: WorkerMessageType.KEEPALIVE_FAILURE,
91
- err: error,
92
- keepAliveRetryCount,
93
- });
94
- }
46
+ if (event.data.err === undefined) {
47
+ if (keepAliveRetryCount > 0) {
48
+ self.postMessage({
49
+ type: WorkerMessageType.KEEPALIVE_SUCCESS,
50
+ statusCode: event.data.statusCode,
51
+ });
95
52
  }
96
- }, interval * 1000);
53
+
54
+ keepAliveRetryCount = 0;
55
+ } else {
56
+ keepAliveRetryCount += 1;
57
+ self.postMessage({
58
+ type: WorkerMessageType.KEEPALIVE_FAILURE,
59
+ err: event.data.err,
60
+ keepAliveRetryCount,
61
+ });
62
+ }
97
63
  }
98
64
 
99
65
  if (type === WorkerMessageType.CLEAR_KEEPALIVE) {
100
- if (keepaliveTimer) {
101
- clearInterval(keepaliveTimer);
102
- keepaliveTimer = undefined;
103
- }
66
+ clearKeepaliveTimer();
67
+ keepAliveRetryCount = 0;
68
+ keepaliveInFlight = false;
104
69
  }
105
70
  };
106
71
 
@@ -0,0 +1,30 @@
1
+ export var MOBIUS_SOCKET_MESSAGE_TYPE;
2
+ (function (MOBIUS_SOCKET_MESSAGE_TYPE) {
3
+ MOBIUS_SOCKET_MESSAGE_TYPE["UNKNOWN"] = "UNKNOWN";
4
+ MOBIUS_SOCKET_MESSAGE_TYPE["REGISTER"] = "register";
5
+ MOBIUS_SOCKET_MESSAGE_TYPE["REGISTER_RESPONSE"] = "register.response";
6
+ MOBIUS_SOCKET_MESSAGE_TYPE["UNREGISTER"] = "unregister";
7
+ MOBIUS_SOCKET_MESSAGE_TYPE["UNREGISTER_RESPONSE"] = "unregister.response";
8
+ MOBIUS_SOCKET_MESSAGE_TYPE["DEVICE_STATUS"] = "device_status";
9
+ MOBIUS_SOCKET_MESSAGE_TYPE["DEVICE_STATUS_RESPONSE"] = "device_status.response";
10
+ MOBIUS_SOCKET_MESSAGE_TYPE["DEVICE_GET"] = "device_get";
11
+ MOBIUS_SOCKET_MESSAGE_TYPE["DEVICE_GET_RESPONSE"] = "device_get.response";
12
+ MOBIUS_SOCKET_MESSAGE_TYPE["DEVICE_LIST"] = "device_list";
13
+ MOBIUS_SOCKET_MESSAGE_TYPE["DEVICE_LIST_RESPONSE"] = "device_list.response";
14
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_SETUP"] = "call_setup";
15
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_SETUP_RESPONSE"] = "call_setup.response";
16
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_STATE"] = "call_state";
17
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_STATE_RESPONSE"] = "call_state.response";
18
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_STATUS"] = "call_status";
19
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_STATUS_RESPONSE"] = "call_status.response";
20
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_MEDIA"] = "call_media";
21
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_MEDIA_RESPONSE"] = "call_media.response";
22
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_HOLD"] = "call_hold";
23
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_HOLD_RESPONSE"] = "call_hold.response";
24
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_RESUME"] = "call_resume";
25
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_RESUME_RESPONSE"] = "call_resume.response";
26
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_TRANSFER"] = "call_transfer";
27
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_TRANSFER_RESPONSE"] = "call_transfer.response";
28
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_DELETE"] = "call_delete";
29
+ MOBIUS_SOCKET_MESSAGE_TYPE["CALL_DELETE_RESPONSE"] = "call_delete.response";
30
+ })(MOBIUS_SOCKET_MESSAGE_TYPE || (MOBIUS_SOCKET_MESSAGE_TYPE = {}));
@@ -0,0 +1,5 @@
1
+ export * from './request';
2
+ export * from './types';
3
+ export * from './mobiusSocketMapper';
4
+ export * from './constants';
5
+ export * from './wsFeatureFlag';
@@ -0,0 +1,72 @@
1
+ import { HTTP_METHODS } from '../../common/types';
2
+ import log from '../../Logger';
3
+ import { METHODS, MOBIUS_SOCKET_MAPPER_FILE } from '../constants';
4
+ import { MOBIUS_SOCKET_MESSAGE_TYPE } from './constants';
5
+ export function deriveMobiusSocketMessageType(uri, httpMethodType) {
6
+ const logContext = {
7
+ file: MOBIUS_SOCKET_MAPPER_FILE,
8
+ method: METHODS.DERIVE_MOBIUS_SOCKET_MESSAGE_TYPE,
9
+ };
10
+ if (!uri) {
11
+ log.warn('Cannot derive Mobius socket message type: uri is empty', logContext);
12
+ return MOBIUS_SOCKET_MESSAGE_TYPE.UNKNOWN;
13
+ }
14
+ if (uri.includes('/services')) {
15
+ if (uri.includes('/callhold/hold')) {
16
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_HOLD;
17
+ }
18
+ if (uri.includes('/callhold/resume')) {
19
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_RESUME;
20
+ }
21
+ if (uri.includes('/calltransfer/commit')) {
22
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_TRANSFER;
23
+ }
24
+ log.warn(`Unrecognized supplementary service uri - uri: ${uri}, httpMethod: ${httpMethodType}`, logContext);
25
+ return MOBIUS_SOCKET_MESSAGE_TYPE.UNKNOWN;
26
+ }
27
+ if (uri.includes('/calls/') && uri.includes('/media')) {
28
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_MEDIA;
29
+ }
30
+ if (uri.includes('/calls/') && uri.includes('/status')) {
31
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_STATUS;
32
+ }
33
+ if (uri.match(/\/calls\/[^/]+$/)) {
34
+ if (httpMethodType === HTTP_METHODS.PATCH) {
35
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_STATE;
36
+ }
37
+ if (httpMethodType === HTTP_METHODS.DELETE) {
38
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_DELETE;
39
+ }
40
+ log.warn(`Unrecognized httpMethod for calls/{callId} - uri: ${uri}, httpMethod: ${httpMethodType}`, logContext);
41
+ return MOBIUS_SOCKET_MESSAGE_TYPE.UNKNOWN;
42
+ }
43
+ if (uri.endsWith('/call')) {
44
+ return MOBIUS_SOCKET_MESSAGE_TYPE.CALL_SETUP;
45
+ }
46
+ if (uri.includes('/devices/') && uri.endsWith('/status')) {
47
+ return MOBIUS_SOCKET_MESSAGE_TYPE.DEVICE_STATUS;
48
+ }
49
+ if (uri.endsWith('/device')) {
50
+ return MOBIUS_SOCKET_MESSAGE_TYPE.REGISTER;
51
+ }
52
+ if (uri.match(/\/devices\/[^/?]+$/) && !uri.includes('/calls')) {
53
+ if (httpMethodType === HTTP_METHODS.DELETE) {
54
+ return MOBIUS_SOCKET_MESSAGE_TYPE.UNREGISTER;
55
+ }
56
+ if (httpMethodType === HTTP_METHODS.GET) {
57
+ return MOBIUS_SOCKET_MESSAGE_TYPE.DEVICE_GET;
58
+ }
59
+ log.warn(`Unrecognized httpMethod for devices/{deviceId} - uri: ${uri}, httpMethod: ${httpMethodType}`, logContext);
60
+ return MOBIUS_SOCKET_MESSAGE_TYPE.UNKNOWN;
61
+ }
62
+ if (uri.includes('/devices') && !uri.match(/\/devices\/[^/?]+/)) {
63
+ return MOBIUS_SOCKET_MESSAGE_TYPE.DEVICE_LIST;
64
+ }
65
+ log.warn(`Unrecognized uri pattern for Mobius socket - uri: ${uri}, httpMethod: ${httpMethodType}`, logContext);
66
+ return MOBIUS_SOCKET_MESSAGE_TYPE.UNKNOWN;
67
+ }
68
+ export const isSupplementaryServiceMessageType = (type) => [
69
+ MOBIUS_SOCKET_MESSAGE_TYPE.CALL_HOLD,
70
+ MOBIUS_SOCKET_MESSAGE_TYPE.CALL_RESUME,
71
+ MOBIUS_SOCKET_MESSAGE_TYPE.CALL_TRANSFER,
72
+ ].includes(type);
@@ -0,0 +1,165 @@
1
+ import { v4 as uuid } from 'uuid';
2
+ import { getMobiusSocketInstance } from '../../mobius-socket';
3
+ import log from '../../Logger';
4
+ import { deriveMobiusSocketMessageType, isSupplementaryServiceMessageType, } from './mobiusSocketMapper';
5
+ import { MOBIUS_SOCKET_MESSAGE_TYPE } from './constants';
6
+ import { isMobiusWssEnabled } from './wsFeatureFlag';
7
+ import { CALLING_USER_AGENT, METHODS, REQUEST_FILE } from '../constants';
8
+ import { getMetricManager } from '../../Metrics';
9
+ import { METRIC_EVENT, METRIC_TYPE, MOBIUS_SOCKET_ACTION } from '../../Metrics/types';
10
+ function normalizeWsResponse(wsResponse) {
11
+ return {
12
+ statusCode: wsResponse.statusCode,
13
+ body: wsResponse.data ?? undefined,
14
+ headers: {
15
+ trackingid: wsResponse.trackingId,
16
+ ...(wsResponse.metadata ?? {}),
17
+ },
18
+ };
19
+ }
20
+ function normalizeWsError(err) {
21
+ const wsErr = err;
22
+ return {
23
+ statusCode: wsErr.statusCode,
24
+ body: wsErr.response?.data ?? undefined,
25
+ headers: {
26
+ trackingid: wsErr.trackingId ?? wsErr.response?.trackingId ?? '',
27
+ ...(wsErr.response?.metadata ?? {}),
28
+ },
29
+ };
30
+ }
31
+ export class APIRequest {
32
+ static instance;
33
+ isMobiusSocketEnabled;
34
+ webex;
35
+ mobiusSocket;
36
+ metricManager;
37
+ static getInstance(config) {
38
+ if (!APIRequest.instance) {
39
+ APIRequest.instance = new APIRequest(config);
40
+ }
41
+ return APIRequest.instance;
42
+ }
43
+ static resetInstance() {
44
+ APIRequest.instance = undefined;
45
+ }
46
+ constructor(config) {
47
+ const logContext = {
48
+ file: REQUEST_FILE,
49
+ method: METHODS.CONSTRUCTOR,
50
+ };
51
+ if (!config.webex) {
52
+ log.error('APIRequest instantiation failed: WebexSDK instance is required', logContext);
53
+ throw new Error('WebexSDK instance is required');
54
+ }
55
+ this.webex = config.webex;
56
+ this.isMobiusSocketEnabled = isMobiusWssEnabled(config.webex) || false;
57
+ this.mobiusSocket = getMobiusSocketInstance(this.webex);
58
+ this.metricManager = getMetricManager(this.webex);
59
+ log.info(`APIRequest initialized with transport: ${this.isMobiusSocketEnabled ? 'WSS' : 'HTTP'}`, logContext);
60
+ }
61
+ isSocketEnabled() {
62
+ return this.isMobiusSocketEnabled;
63
+ }
64
+ async connectToMobiusSocket(wssUrl) {
65
+ const logContext = {
66
+ file: REQUEST_FILE,
67
+ method: METHODS.CONNECT_TO_MOBIUS_SOCKET,
68
+ };
69
+ if (this.mobiusSocket.isConnected()) {
70
+ log.info('Mobius WebSocket already connected', logContext);
71
+ return this.mobiusSocket.getConnectedWebSocketUrl();
72
+ }
73
+ log.info('Mobius WebSocket not connected, initiating connection', logContext);
74
+ try {
75
+ await this.mobiusSocket.connect(wssUrl);
76
+ log.log('Mobius WebSocket connected successfully', logContext);
77
+ this.metricManager?.submitMobiusSocketMetric(METRIC_EVENT.MOBIUS_SOCKET, MOBIUS_SOCKET_ACTION.CONNECT, METRIC_TYPE.BEHAVIORAL, wssUrl);
78
+ return wssUrl;
79
+ }
80
+ catch (err) {
81
+ log.warn(`Mobius WebSocket connection failed: ${String(err)}`, logContext);
82
+ this.metricManager?.submitMobiusSocketMetric(METRIC_EVENT.MOBIUS_SOCKET_ERROR, MOBIUS_SOCKET_ACTION.CONNECT, METRIC_TYPE.BEHAVIORAL, wssUrl, undefined, String(err));
83
+ throw normalizeWsError(err);
84
+ }
85
+ }
86
+ getConnectedWebSocketUrl() {
87
+ return this.mobiusSocket.getConnectedWebSocketUrl();
88
+ }
89
+ async disconnectFromMobiusSocket(options) {
90
+ const logContext = {
91
+ file: REQUEST_FILE,
92
+ method: METHODS.DISCONNECT_FROM_MOBIUS_SOCKET,
93
+ };
94
+ log.info('Disconnecting from Mobius WebSocket', logContext);
95
+ const wssUrl = this.mobiusSocket.getConnectedWebSocketUrl();
96
+ try {
97
+ await this.mobiusSocket.disconnect(options);
98
+ log.log('Mobius WebSocket disconnected successfully', logContext);
99
+ this.metricManager?.submitMobiusSocketMetric(METRIC_EVENT.MOBIUS_SOCKET, MOBIUS_SOCKET_ACTION.DISCONNECT, METRIC_TYPE.BEHAVIORAL, wssUrl);
100
+ }
101
+ catch (err) {
102
+ log.warn(`Mobius WebSocket disconnection failed: ${String(err)}`, logContext);
103
+ this.metricManager?.submitMobiusSocketMetric(METRIC_EVENT.MOBIUS_SOCKET_ERROR, MOBIUS_SOCKET_ACTION.DISCONNECT, METRIC_TYPE.BEHAVIORAL, wssUrl, undefined, String(err));
104
+ }
105
+ }
106
+ async makeRequest(request) {
107
+ const logContext = {
108
+ file: REQUEST_FILE,
109
+ method: METHODS.MAKE_REQUEST,
110
+ };
111
+ log.info(`Dispatching request via ${this.isMobiusSocketEnabled ? 'WSS' : 'HTTP'} `, logContext);
112
+ if (this.isMobiusSocketEnabled) {
113
+ const trackingId = `webex-js-sdk_${uuid()}`;
114
+ const socketType = deriveMobiusSocketMessageType(request.uri, request.method);
115
+ if (socketType === MOBIUS_SOCKET_MESSAGE_TYPE.UNKNOWN) {
116
+ log.error(`Unknown Mobius Socket message type for uri: ${request.uri}, httpMethod: ${request.method}`, logContext);
117
+ throw new Error(`Unknown Mobius Socket message type: ${socketType}`);
118
+ }
119
+ const isSupplementaryService = isSupplementaryServiceMessageType(socketType);
120
+ try {
121
+ const wsResponse = await this.mobiusSocket.sendWssRequest({
122
+ type: socketType,
123
+ trackingId,
124
+ metadata: {
125
+ ...request.headers,
126
+ userAgent: CALLING_USER_AGENT,
127
+ authorization: `${(isSupplementaryService && (await this.webex.credentials.getUserToken())) || ''}`,
128
+ },
129
+ data: request.body,
130
+ });
131
+ log.log(`WSS request succeeded - socketType: ${socketType}, trackingId: ${trackingId}, statusCode: ${wsResponse.statusCode}`, logContext);
132
+ return normalizeWsResponse(wsResponse);
133
+ }
134
+ catch (err) {
135
+ log.error(`WSS request failed - socketType: ${socketType}, trackingId: ${trackingId}, error: ${String(err)}`, logContext);
136
+ throw normalizeWsError(err);
137
+ }
138
+ }
139
+ return this.webex.request(request);
140
+ }
141
+ registerMobiusSocketListener(cb) {
142
+ const logContext = {
143
+ file: REQUEST_FILE,
144
+ method: METHODS.REGISTER_MOBIUS_SOCKET_LISTENER,
145
+ };
146
+ log.info('Attaching Mobius async event listener', logContext);
147
+ this.mobiusSocket.on('event:async_event', (data) => {
148
+ log.trace(`Mobius async event received - eventType: ${data?.data?.eventType ?? 'unknown'}`, logContext);
149
+ cb(data);
150
+ });
151
+ log.log('Mobius async event listener attached', logContext);
152
+ this.metricManager?.submitMobiusSocketMetric(METRIC_EVENT.MOBIUS_SOCKET, MOBIUS_SOCKET_ACTION.LISTENER_REGISTERED, METRIC_TYPE.BEHAVIORAL);
153
+ }
154
+ unregisterMobiusSocketListener() {
155
+ const logContext = {
156
+ file: REQUEST_FILE,
157
+ method: METHODS.UNREGISTER_MOBIUS_SOCKET_LISTENER,
158
+ };
159
+ log.info('Detaching Mobius async event listener', logContext);
160
+ this.mobiusSocket.off('event:async_event');
161
+ log.log('Mobius async event listener detached', logContext);
162
+ this.metricManager?.submitMobiusSocketMetric(METRIC_EVENT.MOBIUS_SOCKET, MOBIUS_SOCKET_ACTION.LISTENER_UNREGISTERED, METRIC_TYPE.BEHAVIORAL);
163
+ }
164
+ }
165
+ export const createAPIRequest = (config) => APIRequest.getInstance(config);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import log from '../../Logger';
2
+ import { METHODS, WS_FEATURE_FLAG_FILE } from '../constants';
3
+ export const WEBRTC_CALLING_OVER_WS_FEATURE_KEY = 'webrtc-calling-over-ws-CALL-219562';
4
+ const ALLOWED_ORIGINS = ['localhost', '127.0.0.1', 'web-sdk.webex.com'];
5
+ function samplesPageToggleValue() {
6
+ if (typeof window === 'undefined' || !window.localStorage) {
7
+ return null;
8
+ }
9
+ const hostname = window.location.hostname;
10
+ const isAllowedOrigin = ALLOWED_ORIGINS.some((origin) => hostname === origin || hostname.endsWith(`.${origin}`));
11
+ if (!isAllowedOrigin) {
12
+ return null;
13
+ }
14
+ const localStorageValue = localStorage.getItem('mobius-wss-enabled');
15
+ if (localStorageValue === 'true') {
16
+ log.trace(`Mobius WSS force-enabled via samples page localStorage override on ${hostname}`, {
17
+ file: WS_FEATURE_FLAG_FILE,
18
+ method: METHODS.IS_MOBIUS_WSS_ENABLED,
19
+ });
20
+ return true;
21
+ }
22
+ if (localStorageValue === 'false') {
23
+ log.trace(`Mobius WSS force-disabled via samples page localStorage override on ${hostname}`, {
24
+ file: WS_FEATURE_FLAG_FILE,
25
+ method: METHODS.IS_MOBIUS_WSS_ENABLED,
26
+ });
27
+ return false;
28
+ }
29
+ return null;
30
+ }
31
+ export function isMobiusWssEnabled(webex) {
32
+ const enabled = webex.internal?.device?.features?.developer?.get(WEBRTC_CALLING_OVER_WS_FEATURE_KEY)?.value ===
33
+ true;
34
+ const localStorageOverride = samplesPageToggleValue();
35
+ const finalValue = localStorageOverride !== null ? localStorageOverride : enabled;
36
+ log.trace(`Mobius WSS feature flag '${WEBRTC_CALLING_OVER_WS_FEATURE_KEY}' resolved to: ${finalValue} (backend: ${enabled}, localStorage: ${localStorageOverride})`, {
37
+ file: WS_FEATURE_FLAG_FILE,
38
+ method: METHODS.IS_MOBIUS_WSS_ENABLED,
39
+ });
40
+ return finalValue;
41
+ }
@@ -283,7 +283,7 @@ export class ContactsClient {
283
283
  return this.encryptionKeyUrl;
284
284
  }
285
285
  if (this.groups === undefined) {
286
- this.getContacts();
286
+ await this.getContacts();
287
287
  }
288
288
  if (this.groups && this.groups.length) {
289
289
  return this.groups[0].encryptionKeyUrl;
@@ -77,13 +77,3 @@ var CALL_STATE;
77
77
  CALL_STATE["REMOTE_HELD"] = "remoteheld";
78
78
  CALL_STATE["CONNECTED"] = "connected";
79
79
  })(CALL_STATE || (CALL_STATE = {}));
80
- export const WEBSOCKET_SCOPE = 'mobius';
81
- export var WEBSOCKET_KEYS;
82
- (function (WEBSOCKET_KEYS) {
83
- WEBSOCKET_KEYS["CALL_PROGRESS"] = "callprogress";
84
- WEBSOCKET_KEYS["CALL_CONNECTED"] = "callconnected";
85
- WEBSOCKET_KEYS["CALL_DISCONNECTED"] = "callconnected";
86
- WEBSOCKET_KEYS["CALL_INFO"] = "callinfo";
87
- WEBSOCKET_KEYS["CALL"] = "call";
88
- WEBSOCKET_KEYS["ROAP"] = "ROAP";
89
- })(WEBSOCKET_KEYS || (WEBSOCKET_KEYS = {}));
@@ -260,7 +260,7 @@ class MetricManager {
260
260
  this.webex.internal.metrics.submitClientMetrics(name, data);
261
261
  }
262
262
  }
263
- submitMediaMetric(name, metricAction, type, callId, correlationId, localSdp, remoteSdp, callError) {
263
+ submitMediaMetric(name, metricAction, type, callId, correlationId, localSdp, remoteSdp, state, callError) {
264
264
  let data;
265
265
  switch (name) {
266
266
  case METRIC_EVENT.MEDIA: {
@@ -278,6 +278,7 @@ class MetricManager {
278
278
  correlation_id: correlationId,
279
279
  local_media_details: localSdp,
280
280
  remote_media_details: remoteSdp,
281
+ state,
281
282
  },
282
283
  type,
283
284
  };
@@ -396,6 +397,52 @@ class MetricManager {
396
397
  this.webex.internal.metrics.submitClientMetrics(name, data);
397
398
  }
398
399
  }
400
+ submitMobiusSocketMetric(name, metricAction, type, wssUrl, trackingId, error, eventType) {
401
+ let data;
402
+ const commonTags = {
403
+ action: metricAction,
404
+ device_id: this.deviceInfo?.device?.deviceId,
405
+ service_indicator: this.serviceIndicator,
406
+ };
407
+ const commonFields = {
408
+ device_url: this.deviceInfo?.device?.clientDeviceUri,
409
+ mobius_url: this.deviceInfo?.device?.uri,
410
+ calling_sdk_version: process.env.CALLING_SDK_VERSION || VERSION,
411
+ wss_url: wssUrl,
412
+ tracking_id: trackingId,
413
+ event_type: eventType,
414
+ };
415
+ switch (name) {
416
+ case METRIC_EVENT.MOBIUS_SOCKET: {
417
+ data = {
418
+ tags: commonTags,
419
+ fields: commonFields,
420
+ type,
421
+ };
422
+ break;
423
+ }
424
+ case METRIC_EVENT.MOBIUS_SOCKET_ERROR: {
425
+ data = {
426
+ tags: commonTags,
427
+ fields: {
428
+ ...commonFields,
429
+ error,
430
+ },
431
+ type,
432
+ };
433
+ break;
434
+ }
435
+ default:
436
+ log.warn('Invalid metric name received. Rejecting request to submit metric.', {
437
+ file: METRIC_FILE,
438
+ method: 'submitMobiusSocketMetric',
439
+ });
440
+ break;
441
+ }
442
+ if (data) {
443
+ this.webex.internal.metrics.submitClientMetrics(name, data);
444
+ }
445
+ }
399
446
  }
400
447
  export const getMetricManager = (webex, indicator) => {
401
448
  if (!metricManager && webex) {
@@ -20,6 +20,8 @@ export var METRIC_EVENT;
20
20
  METRIC_EVENT["UPLOAD_LOGS_SUCCESS"] = "web-calling-sdk-upload-logs-success";
21
21
  METRIC_EVENT["UPLOAD_LOGS_FAILED"] = "web-calling-sdk-upload-logs-failed";
22
22
  METRIC_EVENT["MOBIUS_DISCOVERY"] = "web-calling-sdk-mobius-discovery";
23
+ METRIC_EVENT["MOBIUS_SOCKET"] = "web-calling-sdk-mobius-socket";
24
+ METRIC_EVENT["MOBIUS_SOCKET_ERROR"] = "web-calling-sdk-mobius-socket-error";
23
25
  })(METRIC_EVENT || (METRIC_EVENT = {}));
24
26
  export var MOBIUS_SERVER_ACTION;
25
27
  (function (MOBIUS_SERVER_ACTION) {
@@ -32,6 +34,14 @@ export var REG_ACTION;
32
34
  REG_ACTION["DEREGISTER"] = "deregister";
33
35
  REG_ACTION["KEEPALIVE_FAILURE"] = "keepaliveFailure";
34
36
  })(REG_ACTION || (REG_ACTION = {}));
37
+ export var MOBIUS_SOCKET_ACTION;
38
+ (function (MOBIUS_SOCKET_ACTION) {
39
+ MOBIUS_SOCKET_ACTION["CONNECT"] = "connect";
40
+ MOBIUS_SOCKET_ACTION["DISCONNECT"] = "disconnect";
41
+ MOBIUS_SOCKET_ACTION["LISTENER_REGISTERED"] = "listener_registered";
42
+ MOBIUS_SOCKET_ACTION["LISTENER_UNREGISTERED"] = "listener_unregistered";
43
+ MOBIUS_SOCKET_ACTION["REGISTRATION_DOWN"] = "registration_down";
44
+ })(MOBIUS_SOCKET_ACTION || (MOBIUS_SOCKET_ACTION = {}));
35
45
  export var TRANSFER_ACTION;
36
46
  (function (TRANSFER_ACTION) {
37
47
  TRANSFER_ACTION["BLIND"] = "TRANSFER_BLIND";
@@ -54,3 +64,11 @@ export var CONNECTION_ACTION;
54
64
  CONNECTION_ACTION["MERCURY_DOWN"] = "mercury_down";
55
65
  CONNECTION_ACTION["MERCURY_UP"] = "mercury_up";
56
66
  })(CONNECTION_ACTION || (CONNECTION_ACTION = {}));
67
+ export var MEDIA_CONNECTION_ACTION;
68
+ (function (MEDIA_CONNECTION_ACTION) {
69
+ MEDIA_CONNECTION_ACTION["ICE_GATHERING_STATE_CHANGED"] = "ICE_GATHERING_STATE_CHANGED";
70
+ MEDIA_CONNECTION_ACTION["PEER_CONNECTION_STATE_CHANGED"] = "PEER_CONNECTION_STATE_CHANGED";
71
+ MEDIA_CONNECTION_ACTION["ICE_CONNECTION_STATE_CHANGED"] = "ICE_CONNECTION_STATE_CHANGED";
72
+ MEDIA_CONNECTION_ACTION["ICE_CANDIDATE_ERROR"] = "ICE_CANDIDATE_ERROR";
73
+ MEDIA_CONNECTION_ACTION["ROAP_FAILURE"] = "ROAP_FAILURE";
74
+ })(MEDIA_CONNECTION_ACTION || (MEDIA_CONNECTION_ACTION = {}));