@webex/calling 3.12.0-next.6 → 3.12.0-next.61

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 (255) hide show
  1. package/dist/CallRecording/CallRecording.js +158 -0
  2. package/dist/CallRecording/CallRecording.js.map +1 -0
  3. package/dist/CallRecording/CallRecording.test.js +257 -0
  4. package/dist/CallRecording/CallRecording.test.js.map +1 -0
  5. package/dist/CallRecording/WxcCallRecordingConnector.js +576 -0
  6. package/dist/CallRecording/WxcCallRecordingConnector.js.map +1 -0
  7. package/dist/CallRecording/WxcCallRecordingConnector.test.js +651 -0
  8. package/dist/CallRecording/WxcCallRecordingConnector.test.js.map +1 -0
  9. package/dist/CallRecording/callRecordingFixtures.js +235 -0
  10. package/dist/CallRecording/callRecordingFixtures.js.map +1 -0
  11. package/dist/CallRecording/constants.js +49 -0
  12. package/dist/CallRecording/constants.js.map +1 -0
  13. package/dist/CallRecording/types.js +136 -0
  14. package/dist/CallRecording/types.js.map +1 -0
  15. package/dist/CallRecording/utils.js +42 -0
  16. package/dist/CallRecording/utils.js.map +1 -0
  17. package/dist/CallRecording/utils.test.js +97 -0
  18. package/dist/CallRecording/utils.test.js.map +1 -0
  19. package/dist/CallingClient/CallingClient.js +454 -224
  20. package/dist/CallingClient/CallingClient.js.map +1 -1
  21. package/dist/CallingClient/CallingClient.test.js +513 -154
  22. package/dist/CallingClient/CallingClient.test.js.map +1 -1
  23. package/dist/CallingClient/calling/call.js +589 -445
  24. package/dist/CallingClient/calling/call.js.map +1 -1
  25. package/dist/CallingClient/calling/call.test.js +695 -445
  26. package/dist/CallingClient/calling/call.test.js.map +1 -1
  27. package/dist/CallingClient/calling/callManager.js +81 -31
  28. package/dist/CallingClient/calling/callManager.js.map +1 -1
  29. package/dist/CallingClient/calling/callManager.test.js +123 -0
  30. package/dist/CallingClient/calling/callManager.test.js.map +1 -1
  31. package/dist/CallingClient/calling/types.js +2 -0
  32. package/dist/CallingClient/calling/types.js.map +1 -1
  33. package/dist/CallingClient/constants.js +28 -3
  34. package/dist/CallingClient/constants.js.map +1 -1
  35. package/dist/CallingClient/line/index.js +4 -1
  36. package/dist/CallingClient/line/index.js.map +1 -1
  37. package/dist/CallingClient/line/line.test.js +16 -1
  38. package/dist/CallingClient/line/line.test.js.map +1 -1
  39. package/dist/CallingClient/registration/register.js +724 -407
  40. package/dist/CallingClient/registration/register.js.map +1 -1
  41. package/dist/CallingClient/registration/register.test.js +380 -58
  42. package/dist/CallingClient/registration/register.test.js.map +1 -1
  43. package/dist/CallingClient/registration/types.js.map +1 -1
  44. package/dist/CallingClient/registration/webWorker.js +41 -104
  45. package/dist/CallingClient/registration/webWorker.js.map +1 -1
  46. package/dist/CallingClient/registration/webWorker.test.js +39 -153
  47. package/dist/CallingClient/registration/webWorker.test.js.map +1 -1
  48. package/dist/CallingClient/registration/webWorkerStr.js +1 -1
  49. package/dist/CallingClient/registration/webWorkerStr.js.map +1 -1
  50. package/dist/CallingClient/types.js.map +1 -1
  51. package/dist/CallingClient/utils/constants.js +58 -0
  52. package/dist/CallingClient/utils/constants.js.map +1 -0
  53. package/dist/CallingClient/utils/index.js +63 -0
  54. package/dist/CallingClient/utils/index.js.map +1 -0
  55. package/dist/CallingClient/utils/mobiusSocketMapper.js +122 -0
  56. package/dist/CallingClient/utils/mobiusSocketMapper.js.map +1 -0
  57. package/dist/CallingClient/utils/mobiusSocketMapper.test.js +221 -0
  58. package/dist/CallingClient/utils/mobiusSocketMapper.test.js.map +1 -0
  59. package/dist/CallingClient/utils/request.js +435 -0
  60. package/dist/CallingClient/utils/request.js.map +1 -0
  61. package/dist/CallingClient/utils/request.test.js +999 -0
  62. package/dist/CallingClient/utils/request.test.js.map +1 -0
  63. package/dist/CallingClient/utils/types.js +7 -0
  64. package/dist/CallingClient/utils/types.js.map +1 -0
  65. package/dist/CallingClient/utils/wsFeatureFlag.js +70 -0
  66. package/dist/CallingClient/utils/wsFeatureFlag.js.map +1 -0
  67. package/dist/CallingClient/utils/wsFeatureFlag.test.js +139 -0
  68. package/dist/CallingClient/utils/wsFeatureFlag.test.js.map +1 -0
  69. package/dist/Contacts/ContactsClient.js +13 -11
  70. package/dist/Contacts/ContactsClient.js.map +1 -1
  71. package/dist/Contacts/ContactsClient.test.js +3 -8
  72. package/dist/Contacts/ContactsClient.test.js.map +1 -1
  73. package/dist/Events/types.js +38 -11
  74. package/dist/Events/types.js.map +1 -1
  75. package/dist/Metrics/index.js +63 -2
  76. package/dist/Metrics/index.js.map +1 -1
  77. package/dist/Metrics/index.test.js +357 -1
  78. package/dist/Metrics/index.test.js.map +1 -1
  79. package/dist/Metrics/types.js +19 -1
  80. package/dist/Metrics/types.js.map +1 -1
  81. package/dist/SDKConnector/types.js.map +1 -1
  82. package/dist/api.js +56 -0
  83. package/dist/api.js.map +1 -1
  84. package/dist/common/Utils.js +156 -51
  85. package/dist/common/Utils.js.map +1 -1
  86. package/dist/common/Utils.test.js +79 -0
  87. package/dist/common/Utils.test.js.map +1 -1
  88. package/dist/common/testUtil.js +10 -5
  89. package/dist/common/testUtil.js.map +1 -1
  90. package/dist/common/types.js +3 -0
  91. package/dist/common/types.js.map +1 -1
  92. package/dist/index.js +165 -40
  93. package/dist/index.js.map +1 -1
  94. package/dist/mobius-socket/config.js +24 -0
  95. package/dist/mobius-socket/config.js.map +1 -0
  96. package/dist/mobius-socket/errors.js +143 -0
  97. package/dist/mobius-socket/errors.js.map +1 -0
  98. package/dist/mobius-socket/errors.test.js +20 -0
  99. package/dist/mobius-socket/errors.test.js.map +1 -0
  100. package/dist/mobius-socket/index.js +57 -0
  101. package/dist/mobius-socket/index.js.map +1 -0
  102. package/dist/mobius-socket/mobius-socket-events.test.js +492 -0
  103. package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -0
  104. package/dist/mobius-socket/mobius-socket.js +849 -0
  105. package/dist/mobius-socket/mobius-socket.js.map +1 -0
  106. package/dist/mobius-socket/mobius-socket.test.js +1898 -0
  107. package/dist/mobius-socket/mobius-socket.test.js.map +1 -0
  108. package/dist/mobius-socket/socket/constants.js +55 -0
  109. package/dist/mobius-socket/socket/constants.js.map +1 -0
  110. package/dist/mobius-socket/socket/index.js +15 -0
  111. package/dist/mobius-socket/socket/index.js.map +1 -0
  112. package/dist/mobius-socket/socket/socket-base.js +604 -0
  113. package/dist/mobius-socket/socket/socket-base.js.map +1 -0
  114. package/dist/mobius-socket/socket/socket.js +19 -0
  115. package/dist/mobius-socket/socket/socket.js.map +1 -0
  116. package/dist/mobius-socket/socket/socket.shim.js +26 -0
  117. package/dist/mobius-socket/socket/socket.shim.js.map +1 -0
  118. package/dist/mobius-socket/socket/types.js +7 -0
  119. package/dist/mobius-socket/socket/types.js.map +1 -0
  120. package/dist/mobius-socket/socket.test.js +727 -0
  121. package/dist/mobius-socket/socket.test.js.map +1 -0
  122. package/dist/mobius-socket/test/mocha-helpers.js +23 -0
  123. package/dist/mobius-socket/test/mocha-helpers.js.map +1 -0
  124. package/dist/mobius-socket/test/promise-tick.js +28 -0
  125. package/dist/mobius-socket/test/promise-tick.js.map +1 -0
  126. package/dist/mobius-socket/types.js +7 -0
  127. package/dist/mobius-socket/types.js.map +1 -0
  128. package/dist/module/CallRecording/CallRecording.js +56 -0
  129. package/dist/module/CallRecording/WxcCallRecordingConnector.js +264 -0
  130. package/dist/module/CallRecording/callRecordingFixtures.js +201 -0
  131. package/dist/module/CallRecording/constants.js +27 -0
  132. package/dist/module/CallRecording/types.js +19 -0
  133. package/dist/module/CallRecording/utils.js +14 -0
  134. package/dist/module/CallingClient/CallingClient.js +126 -10
  135. package/dist/module/CallingClient/calling/call.js +177 -61
  136. package/dist/module/CallingClient/calling/callManager.js +39 -7
  137. package/dist/module/CallingClient/calling/types.js +2 -0
  138. package/dist/module/CallingClient/constants.js +24 -0
  139. package/dist/module/CallingClient/line/index.js +2 -2
  140. package/dist/module/CallingClient/registration/register.js +239 -63
  141. package/dist/module/CallingClient/registration/webWorker.js +42 -61
  142. package/dist/module/CallingClient/registration/webWorkerStr.js +47 -82
  143. package/dist/module/CallingClient/utils/constants.js +36 -0
  144. package/dist/module/CallingClient/utils/index.js +5 -0
  145. package/dist/module/CallingClient/utils/mobiusSocketMapper.js +72 -0
  146. package/dist/module/CallingClient/utils/request.js +211 -0
  147. package/dist/module/CallingClient/utils/types.js +1 -0
  148. package/dist/module/CallingClient/utils/wsFeatureFlag.js +41 -0
  149. package/dist/module/Contacts/ContactsClient.js +1 -1
  150. package/dist/module/Events/types.js +23 -10
  151. package/dist/module/Metrics/index.js +48 -1
  152. package/dist/module/Metrics/types.js +18 -0
  153. package/dist/module/api.js +3 -2
  154. package/dist/module/common/Utils.js +60 -17
  155. package/dist/module/common/testUtil.js +6 -1
  156. package/dist/module/common/types.js +3 -0
  157. package/dist/module/index.js +7 -3
  158. package/dist/module/mobius-socket/config.js +15 -0
  159. package/dist/module/mobius-socket/errors.js +58 -0
  160. package/dist/module/mobius-socket/index.js +24 -0
  161. package/dist/module/mobius-socket/mobius-socket.js +593 -0
  162. package/dist/module/mobius-socket/socket/constants.js +26 -0
  163. package/dist/module/mobius-socket/socket/index.js +4 -0
  164. package/dist/module/mobius-socket/socket/socket-base.js +368 -0
  165. package/dist/module/mobius-socket/socket/socket.js +9 -0
  166. package/dist/module/mobius-socket/socket/socket.shim.js +12 -0
  167. package/dist/module/mobius-socket/socket/types.js +1 -0
  168. package/dist/module/mobius-socket/types.js +1 -0
  169. package/dist/types/CallRecording/CallRecording.d.ts +18 -0
  170. package/dist/types/CallRecording/CallRecording.d.ts.map +1 -0
  171. package/dist/types/CallRecording/WxcCallRecordingConnector.d.ts +23 -0
  172. package/dist/types/CallRecording/WxcCallRecordingConnector.d.ts.map +1 -0
  173. package/dist/types/CallRecording/callRecordingFixtures.d.ts +61 -0
  174. package/dist/types/CallRecording/callRecordingFixtures.d.ts.map +1 -0
  175. package/dist/types/CallRecording/constants.d.ts +28 -0
  176. package/dist/types/CallRecording/constants.d.ts.map +1 -0
  177. package/dist/types/CallRecording/types.d.ts +176 -0
  178. package/dist/types/CallRecording/types.d.ts.map +1 -0
  179. package/dist/types/CallRecording/utils.d.ts +3 -0
  180. package/dist/types/CallRecording/utils.d.ts.map +1 -0
  181. package/dist/types/CallingClient/CallingClient.d.ts +8 -0
  182. package/dist/types/CallingClient/CallingClient.d.ts.map +1 -1
  183. package/dist/types/CallingClient/calling/call.d.ts +12 -0
  184. package/dist/types/CallingClient/calling/call.d.ts.map +1 -1
  185. package/dist/types/CallingClient/calling/callManager.d.ts +4 -2
  186. package/dist/types/CallingClient/calling/callManager.d.ts.map +1 -1
  187. package/dist/types/CallingClient/calling/types.d.ts +34 -9
  188. package/dist/types/CallingClient/calling/types.d.ts.map +1 -1
  189. package/dist/types/CallingClient/constants.d.ts +24 -0
  190. package/dist/types/CallingClient/constants.d.ts.map +1 -1
  191. package/dist/types/CallingClient/line/index.d.ts +1 -1
  192. package/dist/types/CallingClient/line/index.d.ts.map +1 -1
  193. package/dist/types/CallingClient/registration/register.d.ts +7 -1
  194. package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
  195. package/dist/types/CallingClient/registration/types.d.ts +4 -2
  196. package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
  197. package/dist/types/CallingClient/registration/webWorker.d.ts.map +1 -1
  198. package/dist/types/CallingClient/registration/webWorkerStr.d.ts +1 -1
  199. package/dist/types/CallingClient/registration/webWorkerStr.d.ts.map +1 -1
  200. package/dist/types/CallingClient/types.d.ts +1 -0
  201. package/dist/types/CallingClient/types.d.ts.map +1 -1
  202. package/dist/types/CallingClient/utils/constants.d.ts +35 -0
  203. package/dist/types/CallingClient/utils/constants.d.ts.map +1 -0
  204. package/dist/types/CallingClient/utils/index.d.ts +6 -0
  205. package/dist/types/CallingClient/utils/index.d.ts.map +1 -0
  206. package/dist/types/CallingClient/utils/mobiusSocketMapper.d.ts +5 -0
  207. package/dist/types/CallingClient/utils/mobiusSocketMapper.d.ts.map +1 -0
  208. package/dist/types/CallingClient/utils/request.d.ts +28 -0
  209. package/dist/types/CallingClient/utils/request.d.ts.map +1 -0
  210. package/dist/types/CallingClient/utils/types.d.ts +34 -0
  211. package/dist/types/CallingClient/utils/types.d.ts.map +1 -0
  212. package/dist/types/CallingClient/utils/wsFeatureFlag.d.ts +4 -0
  213. package/dist/types/CallingClient/utils/wsFeatureFlag.d.ts.map +1 -0
  214. package/dist/types/Events/types.d.ts +79 -15
  215. package/dist/types/Events/types.d.ts.map +1 -1
  216. package/dist/types/Metrics/index.d.ts.map +1 -1
  217. package/dist/types/Metrics/types.d.ts +19 -2
  218. package/dist/types/Metrics/types.d.ts.map +1 -1
  219. package/dist/types/SDKConnector/types.d.ts +39 -12
  220. package/dist/types/SDKConnector/types.d.ts.map +1 -1
  221. package/dist/types/api.d.ts +6 -4
  222. package/dist/types/api.d.ts.map +1 -1
  223. package/dist/types/common/Utils.d.ts +11 -3
  224. package/dist/types/common/Utils.d.ts.map +1 -1
  225. package/dist/types/common/testUtil.d.ts +5 -1
  226. package/dist/types/common/testUtil.d.ts.map +1 -1
  227. package/dist/types/common/types.d.ts +5 -1
  228. package/dist/types/common/types.d.ts.map +1 -1
  229. package/dist/types/index.d.ts +8 -3
  230. package/dist/types/index.d.ts.map +1 -1
  231. package/dist/types/mobius-socket/config.d.ts +17 -0
  232. package/dist/types/mobius-socket/config.d.ts.map +1 -0
  233. package/dist/types/mobius-socket/errors.d.ts +32 -0
  234. package/dist/types/mobius-socket/errors.d.ts.map +1 -0
  235. package/dist/types/mobius-socket/index.d.ts +14 -0
  236. package/dist/types/mobius-socket/index.d.ts.map +1 -0
  237. package/dist/types/mobius-socket/mobius-socket.d.ts +48 -0
  238. package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -0
  239. package/dist/types/mobius-socket/socket/constants.d.ts +27 -0
  240. package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -0
  241. package/dist/types/mobius-socket/socket/index.d.ts +5 -0
  242. package/dist/types/mobius-socket/socket/index.d.ts.map +1 -0
  243. package/dist/types/mobius-socket/socket/socket-base.d.ts +43 -0
  244. package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -0
  245. package/dist/types/mobius-socket/socket/socket.d.ts +6 -0
  246. package/dist/types/mobius-socket/socket/socket.d.ts.map +1 -0
  247. package/dist/types/mobius-socket/socket/socket.shim.d.ts +6 -0
  248. package/dist/types/mobius-socket/socket/socket.shim.d.ts.map +1 -0
  249. package/dist/types/mobius-socket/socket/types.d.ts +61 -0
  250. package/dist/types/mobius-socket/socket/types.d.ts.map +1 -0
  251. package/dist/types/mobius-socket/types.d.ts +21 -0
  252. package/dist/types/mobius-socket/types.d.ts.map +1 -0
  253. package/package.json +20 -5
  254. package/src/mobius-socket/socket/socket.shim.ts +22 -0
  255. package/src/mobius-socket/socket/socket.ts +14 -0
@@ -0,0 +1,368 @@
1
+ /*!
2
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+ import { EventEmitter } from 'events';
5
+ import { checkRequired } from '@webex/common';
6
+ import { safeSetTimeout } from '@webex/common-timers';
7
+ import { defaults, has, isObject } from 'lodash';
8
+ import { BadRequest, ConnectionError, createTimeoutError, createWssResponseError, Forbidden, NotAuthorized, UnknownResponse, } from '../errors';
9
+ import { MESSAGE_TYPES, SOCKET_READY_STATE } from './constants';
10
+ const sockets = new WeakMap();
11
+ function createTrackingId() {
12
+ return `webex-js-sdk_${crypto.randomUUID()}`;
13
+ }
14
+ export default class Socket extends EventEmitter {
15
+ domain;
16
+ pendingResponses;
17
+ forceCloseDelay;
18
+ logger;
19
+ refreshToken;
20
+ token;
21
+ trackingId;
22
+ wssResponseTimeout;
23
+ constructor() {
24
+ super();
25
+ this.domain = 'unknown-domain';
26
+ this.pendingResponses = new Map();
27
+ this.onmessage = this.onmessage.bind(this);
28
+ this.onclose = this.onclose.bind(this);
29
+ this.setMaxListeners(10);
30
+ }
31
+ get binaryType() {
32
+ return sockets.get(this)?.binaryType || '';
33
+ }
34
+ get bufferedAmount() {
35
+ return sockets.get(this)?.bufferedAmount || 0;
36
+ }
37
+ get extensions() {
38
+ return sockets.get(this)?.extensions || '';
39
+ }
40
+ get protocol() {
41
+ return sockets.get(this)?.protocol || '';
42
+ }
43
+ get readyState() {
44
+ return sockets.get(this)?.readyState || 0;
45
+ }
46
+ get url() {
47
+ return sockets.get(this)?.url || '';
48
+ }
49
+ static getWebSocketConstructor() {
50
+ throw new Error('Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way');
51
+ }
52
+ close(options) {
53
+ return new Promise((resolve, reject) => {
54
+ const socket = sockets.get(this);
55
+ if (!socket) {
56
+ resolve();
57
+ return;
58
+ }
59
+ this.logger.info(`socket,${this.domain}: closing`);
60
+ if (socket.readyState === SOCKET_READY_STATE.CLOSING ||
61
+ socket.readyState === SOCKET_READY_STATE.CLOSED) {
62
+ this.logger.info(`socket,${this.domain}: already closed`);
63
+ resolve();
64
+ return;
65
+ }
66
+ const originalCode = options?.code;
67
+ const originalReason = options?.reason;
68
+ const resolvedOptions = defaults(options || {}, {
69
+ code: 1000,
70
+ reason: 'Done',
71
+ });
72
+ if (resolvedOptions.code &&
73
+ resolvedOptions.code !== 1000 &&
74
+ (resolvedOptions.code < 3000 || resolvedOptions.code > 4999)) {
75
+ reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));
76
+ return;
77
+ }
78
+ const closeTimer = safeSetTimeout(() => {
79
+ try {
80
+ this.logger.info(`socket,${this.domain}: no close event received, forcing closure`);
81
+ resolve(this.onclose(originalCode
82
+ ? { code: originalCode, reason: originalReason || 'Done (unknown)' }
83
+ : {
84
+ code: 1000,
85
+ reason: 'Done (forced)',
86
+ }));
87
+ }
88
+ catch (error) {
89
+ this.logger.warn(`socket,${this.domain}: force-close failed`, error);
90
+ }
91
+ }, this.forceCloseDelay);
92
+ socket.onclose = (event) => {
93
+ this.logger.info(`socket,${this.domain}: close event fired`, event.code, event.reason);
94
+ clearTimeout(closeTimer);
95
+ this.onclose(event);
96
+ resolve(event);
97
+ };
98
+ if (socket.readyState === SOCKET_READY_STATE.CONNECTING) {
99
+ this.logger.info(`socket,${this.domain}: socket still connecting, triggering close manually`);
100
+ clearTimeout(closeTimer);
101
+ const closeEvent = {
102
+ code: resolvedOptions.code,
103
+ reason: resolvedOptions.reason,
104
+ };
105
+ this.onclose(closeEvent);
106
+ resolve(closeEvent);
107
+ try {
108
+ socket.close(resolvedOptions.code, resolvedOptions.reason);
109
+ }
110
+ catch (error) {
111
+ this.logger.info(`socket,${this.domain}: error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes`, error);
112
+ }
113
+ }
114
+ else {
115
+ socket.close(resolvedOptions.code, resolvedOptions.reason);
116
+ }
117
+ });
118
+ }
119
+ open(url, options) {
120
+ try {
121
+ this.domain = new URL(url).hostname;
122
+ }
123
+ catch {
124
+ this.domain = url;
125
+ }
126
+ return new Promise((resolve, reject) => {
127
+ if (!url) {
128
+ reject(new Error('`url` is required'));
129
+ return;
130
+ }
131
+ if (sockets.get(this)) {
132
+ reject(new Error('Socket#open() can only be called once per instance'));
133
+ return;
134
+ }
135
+ const resolvedOptions = (options || {});
136
+ checkRequired(['forceCloseDelay', 'token', 'trackingId', 'logger'], resolvedOptions);
137
+ Object.keys(resolvedOptions).forEach((key) => {
138
+ Reflect.defineProperty(this, key, {
139
+ enumerable: false,
140
+ value: resolvedOptions[key],
141
+ });
142
+ });
143
+ const WebSocket = Socket.getWebSocketConstructor();
144
+ this.logger.info(`socket,${this.domain}: creating WebSocket`);
145
+ const socket = new WebSocket(url, [], resolvedOptions);
146
+ socket.binaryType = 'arraybuffer';
147
+ socket.onmessage = this.onmessage;
148
+ socket.onclose = (event) => {
149
+ event = this.fixCloseCode(event);
150
+ this.logger.info(`socket,${this.domain}: closed before open`, event.code, event.reason);
151
+ switch (event.code) {
152
+ case 1005:
153
+ return reject(new UnknownResponse(event));
154
+ case 4400:
155
+ return reject(new BadRequest(event));
156
+ case 4401:
157
+ return reject(new NotAuthorized(event));
158
+ case 4403:
159
+ return reject(new Forbidden(event));
160
+ default:
161
+ return reject(new ConnectionError(event));
162
+ }
163
+ };
164
+ socket.onopen = () => {
165
+ this.logger.info(`socket,${this.domain}: connected`);
166
+ this.authorize(this.token)
167
+ .then(() => {
168
+ this.logger.info(`socket,${this.domain}: authorized`);
169
+ socket.onclose = this.onclose;
170
+ resolve();
171
+ })
172
+ .catch(reject);
173
+ };
174
+ socket.onerror = (event) => {
175
+ this.logger.warn(`socket,${this.domain}: error event fired`, event);
176
+ };
177
+ sockets.set(this, socket);
178
+ this.logger.info(`socket,${this.domain}: waiting for server`);
179
+ });
180
+ }
181
+ onclose(event) {
182
+ this.logger.info(`socket,${this.domain}: closed`, event.code, event.reason);
183
+ event = this.fixCloseCode(event);
184
+ this.rejectPendingResponses(new ConnectionError(event));
185
+ this.emit('close', event);
186
+ this.removeAllListeners();
187
+ }
188
+ onmessage(event) {
189
+ try {
190
+ const data = JSON.parse(event.data);
191
+ const processedEvent = { data };
192
+ if (data.type === 'async_event') {
193
+ this.acknowledge(processedEvent).catch((error) => {
194
+ this.logger.warn(`socket,${this.domain}: failed to acknowledge async event`, error);
195
+ });
196
+ }
197
+ this.handlePendingResponse(data);
198
+ this.emit('message', processedEvent);
199
+ }
200
+ catch (error) {
201
+ this.logger.warn(`socket,${this.domain}: error while receiving WebSocket message`, error);
202
+ }
203
+ }
204
+ send(data) {
205
+ return new Promise((resolve, reject) => {
206
+ if (this.readyState !== SOCKET_READY_STATE.OPEN) {
207
+ reject(new Error('INVALID_STATE_ERROR'));
208
+ return;
209
+ }
210
+ if (isObject(data)) {
211
+ data = JSON.stringify(data);
212
+ }
213
+ const socket = sockets.get(this);
214
+ if (!socket) {
215
+ reject(new Error('INVALID_STATE_ERROR'));
216
+ return;
217
+ }
218
+ socket.send(data);
219
+ resolve();
220
+ });
221
+ }
222
+ sendRequest(data, options = {}) {
223
+ if (!isObject(data)) {
224
+ return Promise.reject(new Error('`data` is required'));
225
+ }
226
+ const request = { ...data };
227
+ const trackingId = request.trackingId || createTrackingId();
228
+ const timeout = options.timeout || this.wssResponseTimeout || 10000;
229
+ if (this.pendingResponses.has(trackingId)) {
230
+ return Promise.reject(new Error(`socket request already sent for trackingId ${trackingId}`));
231
+ }
232
+ request.trackingId = trackingId;
233
+ return new Promise((resolve, reject) => {
234
+ const timeoutId = safeSetTimeout(() => {
235
+ this.clearPendingResponse(trackingId);
236
+ reject(createTimeoutError(request));
237
+ }, timeout);
238
+ const pendingResponse = {
239
+ request,
240
+ resolve: (response) => {
241
+ this.clearPendingResponse(trackingId);
242
+ resolve(response);
243
+ },
244
+ reject: (error) => {
245
+ this.clearPendingResponse(trackingId);
246
+ reject(error);
247
+ },
248
+ timeoutId,
249
+ };
250
+ this.pendingResponses.set(trackingId, pendingResponse);
251
+ this.send(request).catch((error) => {
252
+ this.clearPendingResponse(trackingId);
253
+ reject(error);
254
+ });
255
+ });
256
+ }
257
+ acknowledge(event) {
258
+ if (!event) {
259
+ return Promise.reject(new Error('`event` is required'));
260
+ }
261
+ if (!has(event, 'data.eventId')) {
262
+ return Promise.reject(new Error('`event.data.eventId` is required'));
263
+ }
264
+ if (this.readyState !== SOCKET_READY_STATE.OPEN) {
265
+ return Promise.resolve();
266
+ }
267
+ return this.send({
268
+ type: MESSAGE_TYPES.EVENT_ACK,
269
+ trackingId: event.data.trackingId || createTrackingId(),
270
+ eventId: event.data.eventId,
271
+ }).catch((error) => {
272
+ if (error.message === 'INVALID_STATE_ERROR') {
273
+ return Promise.resolve();
274
+ }
275
+ throw error;
276
+ });
277
+ }
278
+ refresh(token) {
279
+ if (!token) {
280
+ return Promise.reject(new Error('`token` is required for Socket#refresh()'));
281
+ }
282
+ let refreshedToken;
283
+ if (typeof token === 'string') {
284
+ refreshedToken = token;
285
+ }
286
+ else if (token && typeof token.toString === 'function') {
287
+ refreshedToken = token.toString();
288
+ }
289
+ else {
290
+ refreshedToken = String(token);
291
+ }
292
+ return this.authorize(refreshedToken);
293
+ }
294
+ authorize(token) {
295
+ this.logger.info(`socket,${this.domain}: authorizing`);
296
+ return this.sendRequest({
297
+ type: MESSAGE_TYPES.AUTH,
298
+ data: { token },
299
+ });
300
+ }
301
+ clearPendingResponse(trackingId) {
302
+ const pendingResponse = this.pendingResponses.get(trackingId);
303
+ if (pendingResponse?.timeoutId) {
304
+ clearTimeout(pendingResponse.timeoutId);
305
+ }
306
+ this.pendingResponses.delete(trackingId);
307
+ }
308
+ rejectPendingResponses(error) {
309
+ if (!this.pendingResponses.size) {
310
+ return;
311
+ }
312
+ for (const pendingResponse of this.pendingResponses.values()) {
313
+ pendingResponse.reject(error);
314
+ }
315
+ }
316
+ handlePendingResponse(response) {
317
+ if (!response) {
318
+ return false;
319
+ }
320
+ const pendingResponse = this.pendingResponses.get(response.trackingId || '');
321
+ if (!pendingResponse) {
322
+ return false;
323
+ }
324
+ if (response.subtype !== pendingResponse.request.type) {
325
+ return false;
326
+ }
327
+ const statusCode = response?.statusCode;
328
+ const statusMessage = response?.statusMessage;
329
+ if (statusCode === 440 && response?.subtype !== MESSAGE_TYPES.AUTH) {
330
+ if (typeof this.refreshToken === 'function') {
331
+ Promise.resolve(this.refreshToken(response)).catch((error) => {
332
+ this.logger.warn(`socket,${this.domain}: failed token-expiry re-auth`, error);
333
+ });
334
+ }
335
+ else {
336
+ this.logger.warn(`socket,${this.domain}: refreshToken callback is unavailable for statusCode 440`);
337
+ }
338
+ }
339
+ if (statusCode === undefined) {
340
+ const error = createWssResponseError(response, statusCode, statusMessage || 'Socket response missing status code');
341
+ pendingResponse.reject(error);
342
+ }
343
+ else if (statusCode >= 200 && statusCode < 300) {
344
+ pendingResponse.resolve(response);
345
+ }
346
+ else {
347
+ pendingResponse.reject(createWssResponseError(response, statusCode, statusMessage));
348
+ }
349
+ return true;
350
+ }
351
+ fixCloseCode(event) {
352
+ if (event.code === 1005 && event.reason) {
353
+ switch (event.reason.toLowerCase()) {
354
+ case 'replaced':
355
+ this.logger.info(`socket,${this.domain}: fixing CloseEvent code for reason: `, event.reason);
356
+ event.code = 4000;
357
+ break;
358
+ case 'authentication failed':
359
+ case 'authentication did not happen within the timeout window of 30000 seconds.':
360
+ this.logger.info(`socket,${this.domain}: fixing CloseEvent code for reason: `, event.reason);
361
+ event.code = 1008;
362
+ break;
363
+ default:
364
+ }
365
+ }
366
+ return event;
367
+ }
368
+ }
@@ -0,0 +1,9 @@
1
+ /*!
2
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+ import WS from 'ws';
5
+ import Socket from './socket-base';
6
+ Socket.getWebSocketConstructor = function getWebSocketConstructor() {
7
+ return WS;
8
+ };
9
+ export default Socket;
@@ -0,0 +1,12 @@
1
+ /*!
2
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+ import Socket from './socket-base';
5
+ Socket.getWebSocketConstructor = function getWebSocketConstructor() {
6
+ if (typeof WebSocket !== 'undefined') {
7
+ return WebSocket;
8
+ }
9
+ const scope = typeof globalThis !== 'undefined' ? globalThis : undefined;
10
+ return (scope?.WebSocket || scope?.MozWebSocket);
11
+ };
12
+ export default Socket;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { WebexSDK } from '../SDKConnector/types';
2
+ import { CallRecordingEventTypes } from '../Events/types';
3
+ import { Eventing } from '../Events/impl';
4
+ import { DeleteRecordingOptions, GetCallRecordingRequest, ICallRecording, LoggerInterface, RecordingDeleteResponse, RecordingResponseFor } from './types';
5
+ export declare class CallRecording extends Eventing<CallRecordingEventTypes> implements ICallRecording {
6
+ logger: LoggerInterface;
7
+ private sdkConnector;
8
+ private webex;
9
+ private callingBackend;
10
+ private backendConnector;
11
+ constructor(webex: WebexSDK, logger: LoggerInterface);
12
+ private initializeBackendConnector;
13
+ private forwardRecordingEvents;
14
+ getCallRecording<T extends GetCallRecordingRequest>(request: T): Promise<RecordingResponseFor<T>>;
15
+ deleteRecording(recordingId: string, options?: DeleteRecordingOptions): Promise<RecordingDeleteResponse>;
16
+ }
17
+ export declare const createCallRecordingClient: (webex: WebexSDK, logger: LoggerInterface) => ICallRecording;
18
+ //# sourceMappingURL=CallRecording.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallRecording.d.ts","sourceRoot":"","sources":["../../../src/CallRecording/CallRecording.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAK9D,OAAO,EAAC,uBAAuB,EAAoC,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAmBjB,qBAAa,aAAc,SAAQ,QAAQ,CAAC,uBAAuB,CAAE,YAAW,cAAc;IAYxD,MAAM,EAAE,eAAe;IAX3D,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,gBAAgB,CAAkB;gBAK9B,KAAK,EAAE,QAAQ,EAAS,MAAM,EAAE,eAAe;IAiB3D,OAAO,CAAC,0BAA0B;IAsBlC,OAAO,CAAC,sBAAsB;IAiBvB,gBAAgB,CAAC,CAAC,SAAS,uBAAuB,EACvD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAStB,eAAe,CAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,uBAAuB,CAAC;CAGpC;AAQD,eAAO,MAAM,yBAAyB,UAC7B,QAAQ,UACP,eAAe,KACtB,cAAkD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { WebexSDK } from '../SDKConnector/types';
2
+ import { CallRecordingEventTypes, RecordingEvent } from '../Events/types';
3
+ import { Eventing } from '../Events/impl';
4
+ import { DeleteRecordingOptions, GetCallRecordingRequest, ICallRecording, LoggerInterface, RecordingDeleteResponse, RecordingResponseFor } from './types';
5
+ export declare class WxcCallRecordingConnector extends Eventing<CallRecordingEventTypes> implements ICallRecording {
6
+ private sdkConnector;
7
+ private webex;
8
+ private recordingServiceUrl;
9
+ constructor(webex: WebexSDK, logger: LoggerInterface);
10
+ private buildRecordingsUrl;
11
+ getCallRecording<T extends GetCallRecordingRequest>(request: T): Promise<RecordingResponseFor<T>>;
12
+ private dispatchGetCallRecording;
13
+ private getRecordings;
14
+ private getRecording;
15
+ private getRecordingsByCallSessionId;
16
+ private getRecordingMetadata;
17
+ deleteRecording(recordingId: string, options?: DeleteRecordingOptions): Promise<RecordingDeleteResponse>;
18
+ handleRecordingCreatedEvent: (event?: RecordingEvent) => Promise<void>;
19
+ handleRecordingUpdatedEvent: (event?: RecordingEvent) => Promise<void>;
20
+ handleRecordingDeletedEvent: (event?: RecordingEvent) => Promise<void>;
21
+ private registerRecordingListeners;
22
+ }
23
+ //# sourceMappingURL=WxcCallRecordingConnector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WxcCallRecordingConnector.d.ts","sourceRoot":"","sources":["../../../src/CallRecording/WxcCallRecordingConnector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAK9D,OAAO,EACL,uBAAuB,EAIvB,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EAEvB,cAAc,EACd,eAAe,EAEf,uBAAuB,EAOvB,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAgCjB,qBAAa,yBACX,SAAQ,QAAQ,CAAC,uBAAuB,CACxC,YAAW,cAAc;IAEzB,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,mBAAmB,CAAS;gBAMxB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe;IAmCpD,OAAO,CAAC,kBAAkB;IAyCnB,gBAAgB,CAAC,CAAC,SAAS,uBAAuB,EACvD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAYnC,OAAO,CAAC,wBAAwB;YA4BlB,aAAa;YAqDb,YAAY;YAqDZ,4BAA4B;YA2C5B,oBAAoB;IAgDrB,eAAe,CAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,uBAAuB,CAAC;IAiDnC,2BAA2B,WAAkB,cAAc,mBAMzD;IAaF,2BAA2B,WAAkB,cAAc,mBAkBzD;IAEF,2BAA2B,WAAkB,cAAc,mBAMzD;IAKF,OAAO,CAAC,0BAA0B;CAcnC"}
@@ -0,0 +1,61 @@
1
+ import { MOBIUS_EVENT_KEYS, RecordingEvent } from '../Events/types';
2
+ import { Recording, RecordingMetadata } from './types';
3
+ export declare const CALL_SESSION_ID = "a1b2c3d4-1111-2222-3333-444455556666";
4
+ export declare const RECORDING_ONE: Recording;
5
+ export declare const RECORDING_TWO: Recording;
6
+ export declare const MOCK_RECORDING_LIST_BODY: {
7
+ statusCode: number;
8
+ body: {
9
+ items: Recording[];
10
+ };
11
+ };
12
+ export declare const MOCK_EMPTY_RECORDING_LIST_BODY: {
13
+ statusCode: number;
14
+ body: {
15
+ items: never[];
16
+ };
17
+ };
18
+ export declare const MOCK_RECORDING_BODY: {
19
+ statusCode: number;
20
+ body: Recording;
21
+ };
22
+ export declare const RECORDING_OWNER_ID = "8a67806f-fc4d-446b-a131-31e71ea5b0e9";
23
+ export declare const RECORDING_REMOTE_PARTY_ID = "0fea4a63-4e27-46ee-99c3-2472cb12bf68";
24
+ export declare const MOCK_RECORDING_METADATA: RecordingMetadata;
25
+ export declare const MOCK_RECORDING_METADATA_BODY: {
26
+ statusCode: number;
27
+ body: RecordingMetadata;
28
+ };
29
+ export declare const ERROR_DETAILS_400: {
30
+ statusCode: number;
31
+ data: {
32
+ error: string;
33
+ };
34
+ message: string;
35
+ };
36
+ export declare const ERROR_DETAILS_401: {
37
+ statusCode: number;
38
+ data: {
39
+ error: string;
40
+ };
41
+ message: string;
42
+ };
43
+ export declare const ERROR_DETAILS_404: {
44
+ statusCode: number;
45
+ data: {
46
+ error: string;
47
+ };
48
+ message: string;
49
+ };
50
+ export declare const MOCK_RECORDING_CREATED_EVENT: RecordingEvent;
51
+ export declare const MOCK_RECORDING_UPDATED_EVENT: RecordingEvent;
52
+ export declare const MOCK_RECORDING_DELETED_EVENT: RecordingEvent;
53
+ export declare const MOCK_RECORDING_TRASH_EVENT: RecordingEvent;
54
+ export declare const MOCK_RECORDING_PURGE_EVENT: RecordingEvent;
55
+ export declare const MOCK_RECORDING_RESTORE_EVENT: RecordingEvent;
56
+ export declare const RECORDING_MERCURY_KEYS: {
57
+ CREATED: MOBIUS_EVENT_KEYS;
58
+ UPDATED: MOBIUS_EVENT_KEYS;
59
+ DELETED: MOBIUS_EVENT_KEYS;
60
+ };
61
+ //# sourceMappingURL=callRecordingFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callRecordingFixtures.d.ts","sourceRoot":"","sources":["../../../src/CallRecording/callRecordingFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGjB,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAkB,MAAM,SAAS,CAAC;AAEtE,eAAO,MAAM,eAAe,yCAAyC,CAAC;AAEtE,eAAO,MAAM,aAAa,EAAE,SAkB3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,SAkB3B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;CAKpC,CAAC;AAEF,eAAO,MAAM,8BAA8B;;;;;CAK1C,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,yCAAyC,CAAC;AACzE,eAAO,MAAM,yBAAyB,yCAAyC,CAAC;AAEhF,eAAO,MAAM,uBAAuB,EAAE,iBAoCrC,CAAC;AAEF,eAAO,MAAM,4BAA4B;;;CAGxC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;CAM7B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;CAM7B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;CAM7B,CAAC;AAqBF,eAAO,MAAM,4BAA4B,EAAE,cAQ1C,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,cAS1C,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,cAQ1C,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,cASxC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,cASxC,CAAC;AAGF,eAAO,MAAM,4BAA4B,EAAE,cAS1C,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;CAIlC,CAAC"}
@@ -0,0 +1,28 @@
1
+ export declare const CALL_RECORDING_FILE = "CallRecording";
2
+ export declare const CONVERGED_RECORDINGS = "convergedRecordings";
3
+ export declare const METADATA = "metadata";
4
+ export declare const FROM = "from";
5
+ export declare const TO = "to";
6
+ export declare const STATUS = "status";
7
+ export declare const MAX = "max";
8
+ export declare const SERVICE_TYPE = "serviceType";
9
+ export declare const FORMAT = "format";
10
+ export declare const OWNER_TYPE = "ownerType";
11
+ export declare const STORAGE_REGION = "storageRegion";
12
+ export declare const LOCATION_ID = "locationId";
13
+ export declare const TOPIC = "topic";
14
+ export declare const DEFAULT_STATUS = "available";
15
+ export declare const DEFAULT_MAX = 30;
16
+ export declare const DEFAULT_NUMBER_OF_DAYS = 30;
17
+ export declare const WEBEX_USER_REQUEST_HEADER = "WebexUserRequest";
18
+ export declare const RECORDING_NOT_FOUND_MESSAGE = "No recordings found for the given call session id.";
19
+ export declare const METHODS: {
20
+ INITIALIZE_BACKEND_CONNECTOR: string;
21
+ GET_CALL_RECORDING: string;
22
+ GET_RECORDINGS: string;
23
+ GET_RECORDING: string;
24
+ GET_RECORDINGS_BY_CALL_SESSION_ID: string;
25
+ GET_RECORDING_METADATA: string;
26
+ DELETE_RECORDING: string;
27
+ };
28
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/CallRecording/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAGnD,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAC1D,eAAO,MAAM,QAAQ,aAAa,CAAC;AAGnC,eAAO,MAAM,IAAI,SAAS,CAAC;AAC3B,eAAO,MAAM,EAAE,OAAO,CAAC;AACvB,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,GAAG,QAAQ,CAAC;AACzB,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,UAAU,cAAc,CAAC;AACtC,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAC9C,eAAO,MAAM,WAAW,eAAe,CAAC;AACxC,eAAO,MAAM,KAAK,UAAU,CAAC;AAG7B,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,WAAW,KAAK,CAAC;AAK9B,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAGzC,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D,eAAO,MAAM,2BAA2B,uDAAuD,CAAC;AAGhG,eAAO,MAAM,OAAO;;;;;;;;CAQnB,CAAC"}